2015-04-23 95 views
0

我正在尝试将SpeechSynthesizer的输出写入.wav文件。如果综合完成,一切运作良好,输出文件是可播放的;如何从写入文件中取消SpeechSynthesizer,同时保留生成的音频?

AudioStream = new FileStream(CurAudioFile, FileMode.Create); 
reader.SetOutputToWaveStream(AudioStream); 
reader.SpeakAsynch(myPromptBuilder); 

但是,如果我通过下面的代码取消合成到该文件(因为这个过程太长,我可能想取消)输出文件不会发出声音! (生成的文件大小不是零,但没有播放)。

// On Cancel Button Clicked 
reader.SpeakAsyncCancelAll(); 
while (reader.State == SynthesizerState.Speaking) 
{ 
     Application.DoEvents(); 
} 
// reader.SetOutputToNull(); 
AudioStream.Close(); 

我在寻找一种解决方案,在该解决方案中,我可以取消音频生成,但音频文件可以播放到取消前的部分。

有什么办法可以实现这个目标吗?

回答

1

我不知道,如果AsyncCancelAll写入正确的结局流或没有,我建议你尝试冲洗关闭流之前:

reader.SpeakAsyncCancelAll(); 
while (reader.State == SynthesizerState.Speaking) 
{ 
     Application.DoEvents(); 
} 
// reader.SetOutputToNull(); 
AudioStream.Flush(); 
AudioStream.Close(); 

如果不工作,那么我d说探索API指南:https://msdn.microsoft.com/en-us/library/system.speech.synthesis.speechsynthesizer.speakasynccancelall(v=vs.110).aspx

如果你不能找到一个合适的API提供的解决方案,你可以考虑以下几点:

  1. 在后台运行第合成阅读
  2. 跟踪的开始时间和取消/结束时间
  3. 取消不取消的合成,但只是标志着下来就被取消了
  4. 所需的音频长的时间大约是(结束时间 - 开始时间)
  5. 当合成完毕后,你可以保存流,然后修剪:Trim an Audio File(.wav,.mp3)

它可能不是很漂亮,但它可能会完成这项工作。

+0

谢谢,刷新流不起作用。你说没有办法取消或强制合成完成并获得有效的流?如何使用NAudio.Wave.RawSourceWaveStream输出? – Ahmad

+0

@Ahmad我不够精通语音合成系统来正确回答我的问题。祝你好运! – Clint