我的应用程序多次调用SpeechSynthesizer.SpeakTextAsync
,因此大部分文本将在说出之前添加到队列中。我想让用户能够取消语音并丢弃仍在队列中的每一件东西。
我试着调用SpeechSynthesizer.CancelAll
或SpeechSynthesizer.Dispose
,当调用这两个方法时,应用程序就会崩溃。
我在windowsphone 8中查看了取消语音合成,但由于我的应用程序将多个语音添加到队列中,Task.Cancel
似乎不起作用。
根据文档,当您调用CancellAll
时,您将取消异步执行的Task
。根据约定,这将导致抛出OperationCancelledException。这意味着,无论在哪里调用SpeakTextAsync、SpeakSsmlAsync或SpeakSslFromUriAsync,都必须用try/catch语句包围这些调用,以防止未捕获此异常。
private static SpeechSynthesizer synth;
public async static Task<SpeechSynthesizer> SpeechSynth(string dataToSpeak)
{
synth = new SpeechSynthesizer();
IEnumerable<VoiceInformation> englishVoices = from voice in InstalledVoices.All
where voice.Language == "en-US"
&& voice.Gender.Equals(VoiceGender.Female)
select voice;
if (englishVoices.Count() > 0)
{
synth.SetVoice(englishVoices.ElementAt(0));
}
await synth.SpeakTextAsync(dataToSpeak);
return synth;
}
public static void CancelSpeech()
{
synth.CancelAll();
}
现在,在您想要的地方调用SpeechSynth("Some Data to Speak")
,只要您想取消它,就只需调用CancelSpeech()
。
它完成了!享受