语音合成后在本地磁盘上保存Wave Stream

时间:2015-04-14 14:18:45

标签: c# filestream speech

如何将“Hello World!Speech”文本写为本地磁盘.wav文件? hellospeech.wav仍为0Ko。哪里我错了?

     SpeechSynthesizer synthesizer = new SpeechSynthesizer();
        MemoryStream waveStream = new MemoryStream();
        SpeechAudioFormatInfo synthFormat =  
            new SpeechAudioFormatInfo(44100, AudioBitsPerSample.Sixteen, AudioChannel.Stereo);
        string text = "Hello World! Speech";

        synthesizer.Speak(text);
        synthesizer.SetOutputToAudioStream(waveStream, synthFormat);
        synthesizer.SetOutputToNull();
        synthesizer.Dispose();

        string path = @"E:\hellospeech.wav";
        FileStream writeStream = new FileStream(path, FileMode.Create, FileAccess.Write); 
        int Length = 256;
        Byte[] buffer = new Byte[Length];
        int bytesRead = waveStream.Read(buffer, 0, Length); 
        while (bytesRead > 0)
        {
            writeStream.Write(buffer, 0, bytesRead);
            bytesRead = waveStream.Read(buffer, 0, Length);
        }
        waveStream.Close();
        writeStream.Close();

1 个答案:

答案 0 :(得分:3)

两个问题:

  • 保存到它后,您不会将MemoryStream倒回
  • 您在设置输出
  • 之前调用Speak

您还没有使用using语句 - 但这并未导致此问题。

我自己没有使用过这个SDK,但我希望这段代码更有可能发挥作用:

var waveStream = new MemoryStream();
using (var synthesizer = new SpeechSynthesizer())
{
    var synthFormat =  
        new SpeechAudioFormatInfo(44100, AudioBitsPerSample.Sixteen, AudioChannel.Stereo);
    string text = "Hello World! Speech";
    // Or SetOutputToWaveStream...
    synthesizer.SetOutputToAudioStream(waveStream, synthFormat);
    synthesizer.Speak("Hello World! Speech");
}

using (var file = File.Create(path))
{
    // With WriteTo, you don't need to rewind first...
    waveStream.WriteTo(file);
}

你有没有理由先写入内存流?为什么不直接写入文件,例如使用synthesizer.SetOutputToWaveFile(path)