【问题标题】:How to cancel SpeechSynthesizer from writing to file, while keeping the audio that was produced?如何取消 SpeechSynthesizer 写入文件,同时保留生成的音频?
【发布时间】:2015-04-23 13:17:30
【问题描述】:

我正在尝试将SpeechSynthesizer 的输出写入 .wav 文件。如果合成完成,一切正常,输出文件可播放;

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();

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

有什么方法可以实现吗?

【问题讨论】:

    标签: c# windows winforms text-to-speech speechsynthesizer


    【解决方案1】:

    我不确定AsyncCancelAll 是否将正确的结尾写入流,我建议在关闭流之前尝试刷新:

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

    如果这不起作用,那么我会说探索 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)

    它可能不漂亮,但它可能会完成工作。

    【讨论】:

    • 谢谢,刷新流不起作用。你说没有办法取消或强制合成完成并获得有效的流?使用NAudio.Wave.RawSourceWaveStream 输出怎么样?
    • @Ahmad 我对语音合成系统不够精通,恐怕无法正确回答。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多