14

こんにちは、メモリストリームでテキストを音声 (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();

    }

ありがとう。

4

6 に答える 6

60

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


        }
于 2014-04-06T01:53:19.237 に答える
13

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 OutputCopy if newerCopy 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;削除できる a があり、削除/コメントアウトする必要WriterConfig.csがある宣言があります。ConfigControl

すべてが完了すると、 から取得している WAV ファイルを MP3 に変換するために使用できる機能的なインメモリ Wave ファイルから MP3 へのコンバーターが必要になりますSpeechSynthesizer

于 2013-10-01T07:19:44.553 に答える
11

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

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

NuGet パッケージ マネージャーを使用してNAudio.Lame. 利用可能な基本的な使用例here

于 2013-11-04T06:16:14.823 に答える
1

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

オンラインには多くの情報がありますが、まずドキュメントを確認することから始めることができます

于 2013-09-27T19:49:18.463 に答える
1

8bit 8Khz mono wav を変換するために .net4.0 で同様の要件があり、次のコードを使用しました

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 のバッファ サイズを使用しました (カスタム要件)

于 2014-01-07T10:31:14.437 に答える