web-dev-qa-db-ja.com

NAudioのメモリストリームでフォーマットをwavからmp3に変更します

こんにちは、メモリストリームでテキストを音声(wav)に変換しようとしているiamが、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();

    }

ありがとう。

9
user2431114

MP3コンプレッサーライブラリが必要です。私はYetiLameラッパーを介して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 newerまたはCopy alwaysに設定します。

  3. Lame.csを編集し、次のすべてのインスタンスを置き換えます。

    [DllImport("Lame_enc.dll")]
    

    と:

    [DllImport("Lame_enc.dll", CallingConvention = CallingConvention.Cdecl)]`
    
  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();
            }
        }
    }
    
  5. System.Windows.Formsへの参照をプロジェクトに追加するか(まだ存在しない場合)、AudioWriter.csWriterConfig.csを編集して参照を削除します。これらは両方とも、削除できるusing System.Windows.Forms;があり、WriterConfig.csには削除/コメントアウトする必要のあるConfigControl宣言があります。

それがすべて完了すると、SpeechSynthesizerから取得したWAVファイルをMP3に変換するために使用できる機能的なメモリ内ウェーブファイルからMP3へのコンバーターができあがります。

11
Corey

NAudio.Lameを使用して私の例も投稿したかっただけです:

NuGet:

Install-Package NAudio.Lame

コードスニップ:私のものは明らかにbyte []を返します-ディスクへの別の保存メソッド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();
            }


        }
45
Wjdavis5

これは少し古いですが、あなたが以前に提供した答えを受け入れていないので...

私は最近、LAMEライブラリをカプセル化して簡略化されたMP3エンコーディングを提供するNAudioの拡張機能を構築しました。

NuGetパッケージマネージャーを使用して、NAudio.Lameを見つけます。利用可能なそれを使用するための基本的な例 here

9
Corey

.net4.0でも同様の要件があり、8ビット8Khzモノラルwavを変換し、次のコードを使用しました

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でコンパイルされたyetiライブラリ(入手するには、この古いライブラリ( http://www.codeproject.com/KB/audio-video/MP3Compressor/MP3Compressor.Zip )をダウンロードして.net4に変換します。 .0次に、新しいバージョンのdllを取得するためのソリューションをビルドします)
  2. nAudioライブラリをダウンロードします(Lameは16ビットwavサンプルのみをサポートしているため、最初に8ビットから16ビットwavに変換する必要がありました)

64kpbsのバッファサイズを使用しました(カスタム要件)

1
geekbytes0xff

出力をMP3に変換しようとしていると仮定すると、オーディオのトランスコーディングを処理できるものが必要です。利用できるツールはたくさんありますが、私の個人的な好みは FFmpeg です。これはコマンドラインツールなので、それを考慮する必要がありますが、それ以外の場合は非常に使いやすいです。

オンラインにはたくさんの情報がありますが、彼らのドキュメントをチェックすることから始めることができます ここ

1
James Johnson