信息
您所需的主题如下所示。但此主题未包含在此库中。

Windows Phone 8 的文本到语音转换 (TTS)

2014/6/18

仅适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1

在 Windows Phone 8 应用中,您可以使用 Windows.Phone.Speech.Synthesis API 生成合成语音(也称为文字到语音转换或 TTS)。例如,您的应用可以提示用户进行输入、读取消息的内容、展示搜索结果和更多。

说明注意:

要使用 TTS,您必须在应用清单中设置 ID_CAP_SPEECH_RECOGNITION 功能。如果您没有设置此功能,您的应用可能无法正常工作。有关更多信息,请参见 Windows Phone 8 应用功能和硬件要求

生成 TTS 的最简单快捷的方法是向 SpeechSynthesizerSpeakTextAsync(String) 方法提供纯文本字符串。以下代码示例演示如何在按钮的单击事件处理程序中完成这一点。

private async void ButtonSimpleTTS_Click(object sender, RoutedEventArgs e)
{
  SpeechSynthesizer synth = new SpeechSynthesizer();
    
  await synth.SpeakTextAsync("You have a meeting with Peter in 15 minutes.");
}

通常,您需要将 await 运算符应用到 SpeakTextAsync 方法,并在包含 SpeakTextAsync 的方法上使用 async 修饰符。因为异步 SpeakTextAsync 方法的前面是 await 操作符,因此 SpeakTextAsync 立即返回,而不等待语音合成器朗读完文本字符串。但是,await 操作符将挂起包含方法的执行,直到 SpeakTextAsync 完成。

Windows Phone 8 包含各种语言的说话语音。每一种语音按照具体的国家/地区所说的,用一种语言生成合成话语。创建 SpeechSynthesizer 对象后,您可以指定要加载的语音的语言。SpeechSynthesizer 实例可以加载安装在手机上的任何语音,并使用它生成话语。如果没有指定任何语言,则 API 将加载与用户在手机的“设置”/“语音”中所选择的语言相匹配的语音。

以下示例借助 LINQ 查询,创建语音合成器的实例,并设置它的语音。LINQ 查询在全部 VoiceInformation 对象(这些对象对安装的每一个语音进行说明)中搜索,以找出语言属性值为“fr-FR”的对象,该值表示法国法语。变量 frenchVoice 作为 VoiceInformation 对象隐式类型化。

SpeechSynthesizerSetVoice(VoiceInformation) 方法的参数为 LINQ 查询所返回的语音指定索引。查询返回两种语音,因为安装了两种法语语音:一种是女性语音,另一种是男性语音。若只需要返回讲法语的其中一种语音,您可以向过滤性别的 where 子句添加表达式。

// Declare the SpeechSynthesizer object at the class level.
SpeechSynthesizer synth;

// Handle the button click event.
private async void SpeakFrench_Click_1(object sender, RoutedEventArgs e)
{
  // Initialize the SpeechSynthesizer object.
  synth = new SpeechSynthesizer();

  // Query for a voice that speaks French.
  IEnumerable<VoiceInformation> frenchVoices = from voice in InstalledVoices.All
                     where voice.Language == "fr-FR"
                     select voice;
            
  // Set the voice as identified by the query.
  synth.SetVoice(frenchVoices.ElementAt(0));

  // Count in French.
  await synth.SpeakTextAsync("un, deux, trois, quatre");
} 

您也可以使用语音合成标记语言 (SSML) 选择特定语言的说话语音。有关更多信息,请参见语音合成标记语言引用

语音合成器既可以讲纯文本,也可以讲包含了符合语音合成标记语言 (SSML) 1.0 版的标记的文本。您可以在代码中插入内联 SSML 标记,或者从代码中引用独立的 SSML 文档。语音合成 API 有三种方法可以发起语音输出,每一种朗读其中一种被接受的源格式。

  • SpeechSynthesizerSpeakTextAsync(String).朗读纯文本字符串,您提供该字符串作为该方法的参数。有关更多信息,请参见本主题前面的代码示例。

  • SpeechSynthesizerSpeakSsmlAsync(String).朗读带有 SSML 标记的文本字符串,您提供该字符串作为该方法的参数。

  • SpeechSynthesizerSpeakSsmlFromUriAsync(Uri).朗读独立的 SSML 文档内容,即您在该方法的参数中所引用的。

SpeakSsmlAsync 代码示例

下面的代码示例演示如何使用 SpeakSsmlAsync 方法朗读带有 SSML 标记的文本字符串。

// Speaks a string of text with SSML markup.
private async void SpeakSsml_Click(object sender, RoutedEventArgs e)
{
   SpeechSynthesizer synth = new SpeechSynthesizer();

   // Build an SSML prompt in a string.
   string ssmlPrompt = "<speak version=\"1.0\" ";
   ssmlPrompt += "xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\">";
   ssmlPrompt += "This voice speaks English. </speak>";

   // Speak the SSML prompt.
   await synth.SpeakSsmlAsync(ssmlPrompt);
}

SpeakSsmlFromUriAsync 代码示例

下面的代码示例演示如何使用 SpeakSsmlFromUriAsync 方法朗读独立的 SSML 文档内容。

// Speaks the content of a standalone SSML file.
private async void SpeakSsmlFromFile_Click(object sender, RoutedEventArgs e)
{
   SpeechSynthesizer synth = new SpeechSynthesizer();

   // Set the path to the SSML-compliant XML file.
   string path = Package.Current.InstalledLocation.Path + "\\ChangeVoice.ssml";
   Uri changeVoice = new Uri(path, UriKind.Absolute);

   // Speak the SSML prompt.
   await synth.SpeakSsmlFromUriAsync(changeVoice);
}

为确保正确部署了 SSML 提示文件,请使用“解决方案资源管理器”中的“添加”>“现有项”命令将该文件添加至您的解决方案中。将文件的“生成操作”属性设置为“内容”,并将“复制到输出目录”属性设置为“如果较新则复制”。然后使用在前面的代码示例中给出的路径语法引用 SSML 提示。

在使用此功能时,您可能会遇到 TTS 错误和异常。有关这些错误和异常的更多信息,请参见处理 Windows Phone 8 语音应用中的错误

显示: