zmień format z wav na mp3 w strumieniu pamięci w NAudio

Cześć, próbuję przekonwertować tekst na mowę (wav) w memorystream przekonwertować go na mp3, a następnie odtworzyć na użytkownikach page.so co dalej?

Oto Mój kod asmx:

[WebMethod]
public byte[] StartSpeak(string Word)
{
    MemoryStream ms = new MemoryStream();
    using (System.Speech.Synthesis.SpeechSynthesizer synhesizer = new System.Speech.Synthesis.SpeechSynthesizer())
    {
        synhesizer.SelectVoiceByHints(System.Speech.Synthesis.VoiceGender.NotSet, System.Speech.Synthesis.VoiceAge.NotSet, 0, new System.Globalization.CultureInfo("en-US"));
        synhesizer.SetOutputToWaveStream(ms);
        synhesizer.Speak(Word);
    }
    return ms.ToArray();

    }
Dzięki.
Author: user2431114, 2013-09-27

5 answers

Potrzebujesz biblioteki kompresorów MP3. Używam Lame przez Yeti Lame wrapper. Kod i przykładowy projekt znajdziesz tutaj .

Kroki, aby to zadziałało:

  1. Skopiuj następujące pliki z MP3Compressor do swojego projektu:

    • AudioWriters.cs
    • Lame.cs
    • Lame_enc.dll
    • Mp3Writer.cs
    • Mp3WriterConfig.cs
    • WaveNative.cs
    • WriterConfig.cs

  2. We właściwościach projektu dla Lame_enc.dll ustaw właściwość Copy to Output na Copy if newer lub Copy always.

  3. Edytuj Lame.cs i zamień wszystkie instancje:

    [DllImport("Lame_enc.dll")]
    

    Z:

    [DllImport("Lame_enc.dll", CallingConvention = CallingConvention.Cdecl)]
    
  4. Dodaj następujący kod do swojego projektu:

    public static Byte[] WavToMP3(byte[] wavFile)
    {
         using (MemoryStream source = new MemoryStream(wavFile))
         using (NAudio.Wave.WaveFileReader rdr = new NAudio.Wave.WaveFileReader(source))
         {
             WaveLib.WaveFormat fmt = new WaveLib.WaveFormat(rdr.WaveFormat.SampleRate, rdr.WaveFormat.BitsPerSample, rdr.WaveFormat.Channels);
    
             // convert to MP3 at 96kbit/sec...
             Yeti.Lame.BE_CONFIG conf = new Yeti.Lame.BE_CONFIG(fmt, 96);
    
             // Allocate a 1-second buffer
             int blen = rdr.WaveFormat.AverageBytesPerSecond;
             byte[] buffer = new byte[blen];
    
             // Do conversion
             using (MemoryStream output = new MemoryStream())
             { 
                 Yeti.MMedia.Mp3.Mp3Writer mp3 = new Yeti.MMedia.Mp3.Mp3Writer(output, fmt, conf);
    
                 int readCount;
                 while ((readCount = rdr.Read(buffer, 0, blen)) > 0)
                     mp3.Write(buffer, 0, readCount);
                 mp3.Close();
    
                 return output.ToArray();
             }
         }
     }
    
  5. Albo Dodaj odniesienie do System.Windows.Forms do swojego projektu (jeśli jeszcze go nie ma), albo edytuj AudioWriter.cs i WriterConfig.cs, aby usunąć odniesienia. Obie mają using System.Windows.Forms;, które można usunąć, a WriterConfig.cs ma ConfigControl deklarację, którą należy usunąć/skomentować Wynocha.

Gdy to wszystko się skończy, powinieneś mieć funkcjonalny w pamięci konwerter plików WAVE na MP3, którego możesz użyć do konwersji pliku WAV, który otrzymujesz z SpeechSynthesizer NA MP3.

 13
Author: Corey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-07 14:04:02

Po prostu chciałem umieścić mój przykład za pomocą NAudio.Lame:

NuGet:

Install-Package NAudio.Lame

Code Snip: Mine oczywiście zwraca bajt [] - mam osobną metodę save to disk b / c myślę, że ułatwia to testowanie jednostkowe.

public static byte[] ConvertWavToMp3(byte[] wavFile)
        {

            using(var retMs = new MemoryStream())
            using (var ms = new MemoryStream(wavFile))
            using(var rdr = new WaveFileReader(ms))
            using (var wtr = new LameMP3FileWriter(retMs, rdr.WaveFormat, 128))
            {
                rdr.CopyTo(wtr);
                return retMs.ToArray();
            }


        }
 56
Author: Wjdavis5,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-26 17:22:35

To już trochę stare, ale ponieważ nie zaakceptowałeś odpowiedzi, którą wcześniej podałem...

Niedawno zbudowałem rozszerzenie dla NAudio, które enkapsuluje bibliotekę LAME, aby zapewnić uproszczone kodowanie MP3.

Użyj Menedżera pakietów NuGet, aby znaleźć NAudio.Lame. Podstawowy przykład korzystania z niego dostępny here.

 11
Author: Corey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-04 06:16:14

Zakładając, że próbujesz przekonwertować wyjście na MP3, potrzebujesz czegoś, co poradzi sobie z transkodowaniem dźwięku. Istnieje wiele dostępnych narzędzi, ale moje osobiste preferencje to FFmpeg . Jest to narzędzie wiersza poleceń, więc musisz wziąć to pod uwagę, ale poza tym jest bardzo łatwy w użyciu.

Jest wiele informacji w Internecie, ale możesz zacząć od zapoznania się z ich dokumentacją tutaj .

 1
Author: James Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 19:49:18

Miałem podobny wymóg w .net4.0 do konwersji 8Bit 8kHz mono wav i użyłem następującego kodu

public void WavToMp3(string wavPath, string fileId)
    {
        var tempMp3Path = TempPath + "tempFiles\\" + fileId + ".mp3";
        var mp3strm = new FileStream(tempMp3Path, FileMode.Create);
        try
        {
            using (var reader = new WaveFileReader(wavPath))
            {
                var blen = 65536;
                var buffer = new byte[blen];
                int rc;
                var bit16WaveFormat = new WaveFormat(16000, 16, 1);
                using (var conversionStream = new WaveFormatConversionStream(bit16WaveFormat, reader))
                {
                    var targetMp3Format = new WaveLib.WaveFormat(16000, 16, 1);
                    using (var mp3Wri = new Mp3Writer(mp3strm, new Mp3WriterConfig(targetMp3Format, new BE_CONFIG(targetMp3Format,64))))
                    {
                        while ((rc = conversionStream.Read(buffer, 0, blen)) > 0) mp3Wri.Write(buffer, 0, rc);
                        mp3strm.Flush();
                        conversionStream.Close();
                    }
                }
                reader.Close();
            }
            File.Move(tempMp3Path, TempPath + fileId + ".mp3");
        }
        finally
        {
            mp3strm.Close();
        }
    }

:

  1. . Net 4 skompilował bibliotekę yeti (aby ją uzyskać pobierz tą starszą ( http://www.codeproject.com/KB/audio-video/MP3Compressor/MP3Compressor.zip) i przekonwertować go do .net4. 0, a następnie zbudować rozwiązanie, aby uzyskać nową wersję bibliotek DLL)
  2. Pobierz biblioteki NAudio (jako Lame wsparcie 16bit wav sample tylko musiałem najpierw przekonwertować go z 8Bit do 16bit wav)

Użyłem bufora o rozmiarze 64kpbs (moje niestandardowe wymagania)

 1
Author: geekbytes0xff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 10:31:14