在NAudio的内存流中将格式从wav更改为mp3

use*_*114 9 c# asp.net audio naudio

嗨,我试图在内存流中将文本转换为语音(wav)将其转换为mp3,然后在用户页面上播放.所以我需要帮助下一步做什么?

这是我的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();

    }
Run Code Online (Sandbox Code Playgroud)

谢谢.

Wjd*_*is5 45

只想用NAudio.Lame发布我的例子:

的NuGet:

Install-Package NAudio.Lame
Run Code Online (Sandbox Code Playgroud)

代码片段:我的显然返回一个字节[] - 我有一个单独的保存到磁盘方法b/c我认为它使单元测试更容易.

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();
            }


        }
Run Code Online (Sandbox Code Playgroud)

  • @AdrianC。在 `rdr.CopyTo(wtr);` 之后添加 `wtr.Flush();`。干杯。 (2认同)

Cor*_*rey 11

你需要一个MP3压缩库.我通过Yeti Lame包装使用Lame.您可以在此处找到代码和示例项目.

让这个工作的步骤:

  1. 将以下文件复制MP3Compressor到项目中:

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


  2. 在项目属性Lame_enc.dll中将Copy to Output属性设置为Copy if newerCopy always.

  3. 编辑Lame.cs并替换以下所有实例:

    [DllImport("Lame_enc.dll")]
    
    Run Code Online (Sandbox Code Playgroud)

    有:

    [DllImport("Lame_enc.dll", CallingConvention = CallingConvention.Cdecl)]`
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将以下代码添加到项目中:

    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();
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 添加System.Windows.Forms对项目的引用(如果它不存在),或者编辑AudioWriter.csWriterConfig.cs删除引用.这两个都有一个using System.Windows.Forms;你可以删除,并WriterConfig.cs有一个ConfigControl需要删除/注释掉的声明.

完成所有这些后,您应该有一个功能性的内存中波形文件到MP3转换器,您可以使用它将您获得的WAV文件SpeechSynthesizer转换为MP3.


Cor*_*rey 9

现在有点老了,但是因为你还没有接受我之前提供的答案......

我最近为NAudio构建了一个扩展,它封装了LAME库以提供简化的MP3编码.

使用NuGet包管理器查找NAudio.Lame.使用它的基本示例here.