向windows 8.1 store app中添加语音朗读

在Windows8.1 没有发布之前,也就是在Windows 8版本的时代,很多人会问到这样一个问题即如何在windows store app程序中将文本转换成语音形式。很遗憾的是在Windows 8版本中,并没有提供一个直接实现此功能的API,且.Net 里面的System.Speech 类等一系列的API在windows 8 store app中并不被支持。我们会建议在程序中使用Bing Translator Service或者寻求第三方的API如Google TTS。无论是以上任何一种方式,实现都会显得过于复杂,且需要开发者花费一段时间来熟悉和掌握第三方的API。

    随着windows 8.1 版本的发布,这个问题已经迎刃而解了,您仅仅需要几行代码就可以使您的程序开口说话。

    您需要一个新的API:Windows.Media.SpeechSynthesis namespace。在这个命名空间下有三个类,即SpeechSynthesisStreamSpeechSynthesizerVoiceInformation。其中SpeechSynthesizer提供了对已安装的语音合成引擎的功能的访问。SpeechSynthesisStream可以对音频流数据进行读写操作。VoiceInformation可以获得已安装的语音的信息。 利用这三个类, 您就可以在windows store app中来让您的程序开口说话。

    下面有一个简单的例子,该例子可以朗读指定的文本以及朗读SSML文档。

    以下是示例项目的界面:

 其中在该页面添加了一个MediaElement控件,用它来播放语音流: 

 <MediaElement Name="media" Grid.Row="0"/>

 点击LoadText按钮可以打开一个存储在电脑里面的Text文件:

点击SpeakText按钮即可以朗读该文本文件里面的文字内容,实现代码如下:

 private async void Button_Click_1(object sender, RoutedEventArgs e)
 {
 SpeechSynthesisStream stream = await synth.SynthesizeTextToStreamAsync(textbox.Text.ToString());
 this.media.AutoPlay = true;
 this.media.SetSource(stream, stream.ContentType);
 this.media.Play(); 
 }
 

其中synth是指已经定义的SpeechSynthesizer类:

 SpeechSynthesizer synth = new Windows.Media.SpeechSynthesis.SpeechSynthesizer();

SynthesizeTextToStreamAsync方法是将文本内容转化为音频流。

界面中Combobox的列表显示的是本地已安装的语音列表,即通过VoiceInformation可以获得该列表:

 private void VoiceChooser_Initialize()
 {
 // get all of the installed voices
 var voices = Windows.Media.SpeechSynthesis.SpeechSynthesizer.AllVoices;
 
 // get the currently selected voice
 VoiceInformation currentVoice = this.synth.Voice;
 
 foreach (VoiceInformation voice in voices)
 {
 ComboBoxItem item = new ComboBoxItem();
 item.Name = voice.DisplayName;
 item.Tag = voice;
 item.Content = voice.DisplayName;
 this.VoiceChooser.Items.Add(item);
 
 // check to see if this is the current voice, so that we can set it to be selected
 if (currentVoice.Id == voice.Id)
 {
 item.IsSelected = true;
 this.VoiceChooser.SelectedItem = item;
 }
 }
 }
 

用户通过选择不同的Combobox Item,可以用不同的语音形式来朗读该文本:

 private void VoiceChooser_SelectionChanged(object sender, SelectionChangedEventArgs e)
 {
 ComboBoxItem item = (ComboBoxItem)this.VoiceChooser.SelectedItem;
 VoiceInformation voice = (VoiceInformation)item.Tag;
 this.synth.Voice = voice;
 }
 

点击LoadSSML按钮可以显示一个SSML文件的内容:

点击SpeakSSML文件可以朗读SSML文件:

 private async void speakssml_Click(object sender, RoutedEventArgs e)
 {
 SpeechSynthesisStream stream = await synth.SynthesizeSsmlToStreamAsync(textbox.Text.ToString());
 this.media.AutoPlay = true;
 this.media.SetSource(stream, stream.ContentType);
 this.media.Play();
 
 }
 

 SSML文件如下: 

 <?xml version="1.0"?>
 <speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis"
 xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="https://www.w3.org/2001/10/synthesis
 https://www.w3.org/TR/speech-synthesis/synthesis.xsd"
 xml:lang="en-US"> 
 <voice gender="female" age="6">Mary had a little lamb,
 </voice>
 <voice gender="female">
 Its fleece was white as snow.
 </voice>
 <!-- processor-specific voice selection -->
 <voice name="Mike">I want to be like Mike.</voice>
 <voice gender="female"> 
 Any female voice here.
 <p xml:lang="zh-cn">我是中国人。</p>
 </voice>
 
 </speak>
 

 其中SynthesizeSsmlToStreamAsync方法是将SSML内容转化为可以播放的音频流。

    需要注意的是一般的windows 8.1系统中默认只安装了Microsoft David Desktop - English (United States), Microsoft Hazel Desktop - English (United States),Microsoft Zira Desktop - English (United States) 这三种语音,如果您想朗读上面SSML文件里面的中文,那么您需要另外在您的系统中安装Microsoft Huihui Desktop - Chinese (Simplified) 这个语音。

    以下链接可以下载该示例项目的完整代码:

     https://1drv.ms/1jPYjjx