2010-10-06 145 views
0

我正在使用内置于.NET 4中的TTS进行游戏,并且希望语音立即发生,但是在我打电话说话时以及获取音频时会遇到延迟。使用System.Speech.Synthesis时尽量减少延迟

我正在开发一个简单的向下计时器,它可以关闭最后五秒钟和完成(5 ... 4 ... 3 ... 2 ... 1 ...完成),但是当屏幕随着新时间更新,TTS滞后,每次调用都会变得更糟。我尝试使用SpeakAsync,但这只会让事情变得更糟。目前,Speak在UI线程之外被调用(在Timer Tick事件处理程序中)。

有没有一种方法来最大限度地减少这种滞后,如预先计算语音并缓存它或创建某种特殊的TTS线程?

回答

0

我以某种方式读过我需要的API调用至少一百次。我正在寻找SpeechSynthesizer.SetOutputToWaveStream

MemoryStream stream = new MemoryStream(); 
SpeechSynthesizer synth = new SpeechSynthesizer(); 
synth.SetOutputToWaveStream(stream); 
synth.Play(text); 
stream.Position = 0; 
SoundPlayer player = new SoundPlayer(stream); 
player.Play(); 

此代码将使用TTS将文本转换为流式传输到流中的WAV文件。您需要重置MemoryStream的位置,以便当您从中创建SoundPlayer时,它会从头开始读取流而不是结束。一旦你初始化了SoundPlayer,你可以将它保存到某个地方,以便以后可以立即播放,而不必等待TTS初始化并播放声音。