こんにちは、メモリストリームでテキストを音声(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();
}
ありがとう。
MP3コンプレッサーライブラリが必要です。私はYetiLameラッパーを介してLameを使用しています。コードとサンプルプロジェクトを見つけることができます ここ 。
これを機能させるための手順:
次のファイルをMP3Compressor
からプロジェクトにコピーします。
Lame_enc.dll
のプロジェクトプロパティで、Copy to Output
プロパティをCopy if newer
またはCopy always
に設定します。
Lame.cs
を編集し、次のすべてのインスタンスを置き換えます。
[DllImport("Lame_enc.dll")]
と:
[DllImport("Lame_enc.dll", CallingConvention = CallingConvention.Cdecl)]`
次のコードをプロジェクトに追加します。
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();
}
}
}
System.Windows.Forms
への参照をプロジェクトに追加するか(まだ存在しない場合)、AudioWriter.cs
とWriterConfig.cs
を編集して参照を削除します。これらは両方とも、削除できるusing System.Windows.Forms;
があり、WriterConfig.cs
には削除/コメントアウトする必要のあるConfigControl
宣言があります。
それがすべて完了すると、SpeechSynthesizer
から取得したWAVファイルをMP3に変換するために使用できる機能的なメモリ内ウェーブファイルからMP3へのコンバーターができあがります。
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();
}
}
これは少し古いですが、あなたが以前に提供した答えを受け入れていないので...
私は最近、LAMEライブラリをカプセル化して簡略化されたMP3エンコーディングを提供するNAudioの拡張機能を構築しました。
NuGetパッケージマネージャーを使用して、NAudio.Lame
を見つけます。利用可能なそれを使用するための基本的な例 here
。
.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();
}
}
前提条件:
64kpbsのバッファサイズを使用しました(カスタム要件)