查看文本转语音 (TTS) 何时在 wp8/wp8.1 完成

Find out when Text To Speech (TTS) is completed on wp8/wp8.1

我正在尝试在使用 mvvm 模式实现的 wp8 和 8.1 应用程序中实现文本转语音 (TTS)。

我可以开始阅读文本,取消阅读效果很好,但我需要查明文本何时被阅读,因为我需要重置 ViewModel 中的某些属性,即 IsReading/IsNotReading 用于 display/hide 按钮。

我真的花了最后几个小时从一篇文章到另一篇文章,但无济于事。肯定有办法!

我目前正在使用 SpeakTextAsync,它在 wp8 和 wp8.1 中都运行良好,但它是否支持一种方法来知道它何时完成阅读文本?

当我尝试使用 'SpeakSsmlAsync' 时,我认为它支持 tags/bookmarks,我想在我的文本末尾添加一个书签并在 BookmarkReached 事件中捕获它并且然后重置我的各种 ViewModel 的属性,但每当我调用 'SpeakSsmlAsync' 时,我都会收到以下错误:

An exception of type 'System.FormatException' occurred in myapp.DLL 
but was not handled in user code

WinRT information: The text associated with this error code could not 
be found.

Additional information: The text associated with this error code could 
not be found.

The text associated with this error code could not be found.

If there is a handler for this exception, the program may be safely
continued.`

它提到了 WINRT,但两个应用程序都在 Silverlight 中,所以虽然异常不是描述性的,但 SpeakSsmlAsync 是吗?知道是什么导致了这个错误吗?

谢谢。

SpeakTextAsync returns 一项任务,因此您可以等待任务以任何标准方式完成。最简单的就是等待它:

private async void speak_Click(object sender, RoutedEventArgs e)
{
    speakingState.Text = "Speaking...";
    await speechSynth.SpeakTextAsync("A quick brown fox jumps over the lazy dog");
    speakingState.Text = "... done";
}

System.FormatException 可能意味着您传递了无效的 Ssml。你没有说你使用了什么,但这里有一个工作示例:

private async void speakSsml_Click(object sender, RoutedEventArgs e)
{
    speakingState.Text = "Speaking...";
    string speakText =
@"<speak version=""1.0"" xmlns=""http://www.w3.org/2001/10/synthesis"" xml:lang=""en-US"">
<s>A quick brown fox <mark name=""middle""/>  jumps over the lazy dog<mark name=""end""/></s>
</speak>";

    await speechSynth.SpeakSsmlAsync(speakText);
    speakingState.Text = "... done";
}