我想将NAudio与SpeechSynthesizer一起使用,但如果不首先将.wav文件写入磁盘,则无法使其工作。
我不知道为什么,我尝试了原始波浪数据和波浪与标头,请参阅以下例子.
示例1-此操作有效,但保存了一个.wav文件。
using (var synth = new SpeechSynthesizer())
{
synth.SetOutputToWaveFile(@".\Test.wav");
synth.Speak("This is sample text-to-speech output.");
synth.SetOutputToNull();
var reader = new WaveFileReader(@".\Test.wav");
var waveOut = new WaveOut();
waveOut.Init(reader);
waveOut.Play();
}示例2-这同样有效,但仍然使用文件
using (var synth = new SpeechSynthesizer())
using (var stream = new MemoryStream())
{
synth.SetOutputToWaveStream(stream);
synth.Speak("This is sample text-to-speech output.");
using (var fileStream = File.Create(@".\Test.wav"))
{
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(fileStream);
}
var reader = new WaveFileReader(@".\Test.wav");
var waveOut = new WaveOut();
waveOut.Init(reader);
waveOut.Play();
}示例3-这不起作用,它只是播放了一小部分秒并停止了
为了避免设置波形格式,我故意使用SetOutputToWaveStream来保留RIFF头。
using (var synth = new SpeechSynthesizer())
using (var stream = new MemoryStream())
{
synth.SetOutputToWaveStream(stream);
synth.Speak("This is sample text-to-speech output.");
stream.Seek(0, SeekOrigin.Begin);
var reader = new WaveFileReader(stream);
var waveOut = new WaveOut();
waveOut.Init(reader);
waveOut.Play();
}示例4-结果与示例3相同
它使用原始数据,有点笨重。
using (var synth = new SpeechSynthesizer())
using (var stream = new MemoryStream())
{
synth.SetOutputToAudioStream(stream, new SpeechAudioFormatInfo(44100, AudioBitsPerSample.Sixteen, AudioChannel.Mono));
synth.Speak("This is sample text-to-speech output.");
stream.Seek(0, SeekOrigin.Begin);
IWaveProvider provider = new RawSourceWaveStream(stream, new WaveFormat(44100, 16, 1));
var waveOut = new WaveOut();
waveOut.Init(provider);
waveOut.Play();
}我也尝试过使用WasapiOut,但这更糟糕。
发布于 2015-07-01 14:25:33
在重新定位到开始之前,请在内存流上调用Flush。而且,Play只开始播放,所以您需要等待播放完成,或者将WaveOut实例移动到using块之外。否则,它只会收集垃圾,然后才能很好地回放。
发布于 2016-12-26 09:38:07
这段代码适用于我,如果可以帮助(对于解决方案3)。
IWaveProvider provider = null;
var stream = new MemoryStream();
using (var synth = new SpeechSynthesizer())
{
synth.SetOutputToAudioStream(stream,
new SpeechAudioFormatInfo(44100, AudioBitsPerSample.Sixteen, AudioChannel.Mono));
synth.Speak("This is sample text-to-speech output.");
stream.Seek(0, SeekOrigin.Begin);
provider = new RawSourceWaveStream(stream, new WaveFormat(44100, 16, 1));
}
var waveOut = new WaveOut();
waveOut.Init(provider);
waveOut.Play();https://stackoverflow.com/questions/31155374
复制相似问题