[源码下载]

重新想象 Windows 8.1 Store Apps (87) - TTS: Speak Text, Speak SSML

作者:webabcd

介绍
重新想象 Windows 8.1 Store Apps 之 TTS(Text To Speech)

  • Speak Text
  • Speak SSML

示例
1、演示如何通过 TTS 朗读一段文本,以及如何将其保存为音频文件
SpeakText.xaml

<Page
x:Class="Windows81.TTS.SpeakText"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows81.TTS"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="120 0 0 0"> <!--用于播放音频-->
<MediaElement Name="mediaElement" AutoPlay="False" /> <TextBlock Name="lblMsg" FontSize="14.667" Margin="0 10 0 0" /> <!--需要被 TTS 的文本-->
<TextBlock Name="lblText" FontSize="14.667" Margin="0 10 0 0" Text="TTS 是 Text To Speech 的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。" /> <!--开始 TTS-->
<Button Name="btnSpeakText" Content="Speek Text" Click="btnSpeakText_Click" Margin="0 10 0 0" /> <!--保存 TTS 转换出的音频文件-->
<Button Name="btnSaveAudio" Content="Save Audio" Click="btnSaveAudio_Click" Margin="0 10 0 0" /> </StackPanel>
</Grid>
</Page>

SpeakText.xaml.cs

/*
* 演示如何通过 TTS 朗读一段文本,以及如何将其保存为音频文件
*
* 注:Windows Phone 中的“TTS, 语音识别, 语音命令”请参见:http://www.cnblogs.com/webabcd/archive/2014/01/02/3501356.html
*/ using System;
using System.Collections.Generic;
using Windows.Media.SpeechSynthesis;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media; namespace Windows81.TTS
{
public sealed partial class SpeakText : Page
{
// TTS 引擎
private SpeechSynthesizer _synthesizer = new SpeechSynthesizer(); public SpeakText()
{
this.InitializeComponent(); lblMsg.Text = "系统支持的语音有:";
// TTS 引擎所支持的全部语音信息
var voices = SpeechSynthesizer.AllVoices;
foreach (VoiceInformation voice in voices)
{
lblMsg.Text += voice.DisplayName + ", ";
} lblMsg.Text += Environment.NewLine;
// 获取或设置当前 TTS 引擎所使用的语音
lblMsg.Text += "当前 TTS 使用的语音是:" + _synthesizer.Voice.DisplayName; // SpeechSynthesizer 实现了 IDisposable 接口
// _synthesizer.Dispose(); this.mediaElement.CurrentStateChanged += mediaElement_CurrentStateChanged;
} void mediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
{
if (mediaElement.CurrentState == MediaElementState.Paused)
{
btnSpeakText.IsEnabled = true;
}
} // 播放 TTS 音频
private async void btnSpeakText_Click(object sender, RoutedEventArgs e)
{
// TTS 引擎生成的音频流
SpeechSynthesisStream synthesisStream; try
{
// 通过 TTS 引擎将字符串转换成音频流
synthesisStream = await _synthesizer.SynthesizeTextToStreamAsync(lblText.Text);
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString(); synthesisStream = null;
btnSpeakText.IsEnabled = true;
} // 播放音频流
mediaElement.AutoPlay = true;
mediaElement.SetSource(synthesisStream, synthesisStream.ContentType);
mediaElement.Play();
} // 保存 TTS 音频
private async void btnSaveAudio_Click(object sender, RoutedEventArgs e)
{
FileSavePicker savePicker = new FileSavePicker();
savePicker.DefaultFileExtension = ".wav";
savePicker.FileTypeChoices.Add("Audio file", new List<string>() { ".wav" }); StorageFile file = await savePicker.PickSaveFileAsync();
if (file != null)
{
btnSaveAudio.IsEnabled = false; SpeechSynthesisStream synthesisStream;
try
{
synthesisStream = await _synthesizer.SynthesizeTextToStreamAsync(lblText.Text);
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString(); synthesisStream = null;
btnSaveAudio.IsEnabled = true;
} // 保存音频数据到文件
Windows.Storage.Streams.Buffer buffer = new Windows.Storage.Streams.Buffer();
IRandomAccessStream writeStream = (IRandomAccessStream)await file.OpenAsync(FileAccessMode.ReadWrite);
IOutputStream outputStream = writeStream.GetOutputStreamAt();
DataWriter dataWriter = new DataWriter(outputStream); while (synthesisStream.Position < synthesisStream.Size)
{
await synthesisStream.ReadAsync(buffer, , InputStreamOptions.None);
dataWriter.WriteBuffer(buffer);
} dataWriter.StoreAsync().AsTask().Wait();
outputStream.FlushAsync().AsTask().Wait(); btnSaveAudio.IsEnabled = true;
}
}
}
}

2、演示如何通过 TTS 朗读 SSML 协议文档,以及如何将其保存为音频文件
SpeakSSML.xaml

<Page
x:Class="Windows81.TTS.SpeakSSML"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows81.TTS"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="120 0 0 0"> <!--用于播放音频-->
<MediaElement Name="mediaElement" AutoPlay="False" /> <TextBlock Name="lblMsg" FontSize="14.667" Margin="0 10 0 0" /> <!--开始 TTS-->
<Button Name="btnSpeakSSML" Content="Speek SSML" Click="btnSpeakSSML_Click" Margin="0 10 0 0" /> <!--保存 TTS 转换出的音频文件-->
<Button Name="btnSaveAudio" Content="Save Audio" Click="btnSaveAudio_Click" Margin="0 10 0 0" /> </StackPanel>
</Grid>
</Page>

SpeakSSML.xaml.cs

/*
* 演示如何通过 TTS 朗读 SSML 协议文档,以及如何将其保存为音频文件
*
* 注:Windows Phone 中的“TTS, 语音识别, 语音命令”请参见:http://www.cnblogs.com/webabcd/archive/2014/01/02/3501356.html
*
*
* 另外:
* 1、SSML - Speech Synthesis Markup Language
* 2、微软关于 ssml 的说明:http://msdn.microsoft.com/en-us/library/hh361578
* 3、W3C 关于 ssml 的说明:http://www.w3.org/TR/speech-synthesis/
*/ using System;
using System.Collections.Generic;
using Windows.Media.SpeechSynthesis;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media; namespace Windows81.TTS
{
public sealed partial class SpeakSSML : Page
{
// TTS 引擎
private SpeechSynthesizer _synthesizer = new SpeechSynthesizer(); public SpeakSSML()
{
this.InitializeComponent(); lblMsg.Text = "系统支持的语音有:";
// TTS 引擎所支持的全部语音信息
var voices = SpeechSynthesizer.AllVoices;
foreach (VoiceInformation voice in voices)
{
lblMsg.Text += voice.DisplayName + ", ";
} lblMsg.Text += Environment.NewLine;
// 获取或设置当前 TTS 引擎所使用的语音
lblMsg.Text += "当前 TTS 使用的语音是:" + _synthesizer.Voice.DisplayName; // SpeechSynthesizer 实现了 IDisposable 接口
// _synthesizer.Dispose(); this.mediaElement.CurrentStateChanged += mediaElement_CurrentStateChanged;
} void mediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
{
if (mediaElement.CurrentState == MediaElementState.Paused)
{
btnSpeakSSML.IsEnabled = true;
}
} // 播放 TTS 音频(SSML)
private async void btnSpeakSSML_Click(object sender, RoutedEventArgs e)
{
// TTS 引擎生成的音频流
SpeechSynthesisStream synthesisStream; try
{
// 构造一个 SSML 协议文档
string ssml = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"zh-CN\">"; // 中文
ssml += "<voice gender=\"male\">"; // 男声
ssml += "<prosody rate=\"-50%\">"; // 语速放慢 50%
ssml += "TTS 是 Text To Speech 的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。";
ssml += "</prosody>";
ssml += "</voice>";
ssml += "</speak>"; // 通过 TTS 引擎将 SSML 协议文档转换成音频流
synthesisStream = await _synthesizer.SynthesizeSsmlToStreamAsync(ssml);
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString(); synthesisStream = null;
btnSpeakSSML.IsEnabled = true;
} // 播放音频流
mediaElement.AutoPlay = true;
mediaElement.SetSource(synthesisStream, synthesisStream.ContentType);
mediaElement.Play();
} // 保存 TTS 音频(SSML)
private async void btnSaveAudio_Click(object sender, RoutedEventArgs e)
{
FileSavePicker savePicker = new FileSavePicker();
savePicker.DefaultFileExtension = ".wav";
savePicker.FileTypeChoices.Add("Audio file", new List<string>() { ".wav" }); StorageFile file = await savePicker.PickSaveFileAsync();
if (file != null)
{
btnSaveAudio.IsEnabled = false; SpeechSynthesisStream synthesisStream;
try
{
// 构造一个 SSML 协议文档
string ssml = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"zh-CN\">"; // 中文
ssml += "<voice gender=\"male\">"; // 男声
ssml += "<prosody rate=\"-50%\">"; // 语速放慢 50%
ssml += "TTS 是 Text To Speech 的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。";
ssml += "</prosody>";
ssml += "</voice>";
ssml += "</speak>"; // 通过 TTS 引擎将 SSML 协议文档转换成音频流
synthesisStream = await _synthesizer.SynthesizeSsmlToStreamAsync(ssml);
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString(); synthesisStream = null;
btnSaveAudio.IsEnabled = true;
} // 保存音频数据到文件
Windows.Storage.Streams.Buffer buffer = new Windows.Storage.Streams.Buffer();
IRandomAccessStream writeStream = (IRandomAccessStream)await file.OpenAsync(FileAccessMode.ReadWrite);
IOutputStream outputStream = writeStream.GetOutputStreamAt();
DataWriter dataWriter = new DataWriter(outputStream); while (synthesisStream.Position < synthesisStream.Size)
{
await synthesisStream.ReadAsync(buffer, , InputStreamOptions.None);
dataWriter.WriteBuffer(buffer);
} dataWriter.StoreAsync().AsTask().Wait();
outputStream.FlushAsync().AsTask().Wait(); btnSaveAudio.IsEnabled = true;
}
}
}
}

OK
[源码下载]

重新想象 Windows 8.1 Store Apps (87) - TTS: Speak Text, Speak SSML的更多相关文章

  1. 重新想象 Windows 8.1 Store Apps 系列文章索引

    [源码下载] [重新想象 Windows 8 Store Apps 系列文章] 重新想象 Windows 8.1 Store Apps 系列文章索引 作者:webabcd 1.重新想象 Windows ...

  2. 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图

    [源码下载] 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Co ...

  3. 重新想象 Windows 8.1 Store Apps (72) - 新增控件: AppBar, CommandBar

    [源码下载] 重新想象 Windows 8.1 Store Apps (72) - 新增控件: AppBar, CommandBar 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...

  4. 重新想象 Windows 8.1 Store Apps (73) - 新增控件: DatePicker, TimePicker

    [源码下载] 重新想象 Windows 8.1 Store Apps (73) - 新增控件: DatePicker, TimePicker 作者:webabcd 介绍重新想象 Windows 8.1 ...

  5. 重新想象 Windows 8.1 Store Apps (74) - 新增控件: Flyout, MenuFlyout, SettingsFlyout

    [源码下载] 重新想象 Windows 8.1 Store Apps (74) - 新增控件: Flyout, MenuFlyout, SettingsFlyout 作者:webabcd 介绍重新想象 ...

  6. 重新想象 Windows 8.1 Store Apps (75) - 新增控件: Hub, Hyperlink

    [源码下载] 重新想象 Windows 8.1 Store Apps (75) - 新增控件: Hub, Hyperlink 作者:webabcd 介绍重新想象 Windows 8.1 Store A ...

  7. 重新想象 Windows 8.1 Store Apps (76) - 新增控件: SearchBox

    [源码下载] 重新想象 Windows 8.1 Store Apps (76) - 新增控件: SearchBox 作者:webabcd 介绍重新想象 Windows 8.1 Store Apps 之 ...

  8. 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性

    [源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...

  9. 重新想象 Windows 8.1 Store Apps (78) - 控件增强: ScrollViewer, FlipView, Popup

    [源码下载] 重新想象 Windows 8.1 Store Apps (78) - 控件增强: ScrollViewer, FlipView, Popup 作者:webabcd 介绍重新想象 Wind ...

随机推荐

  1. SQL Server 2016 需要单独安装SSMS

    默认安装完 MSSQL 后,不自带 SSMS 的管理工具了,需要的话可以单独安装,貌似更专业了一些. https://msdn.microsoft.com/library/mt238290.aspx ...

  2. GitHub上排名前100的Android开源库介绍(来自github)

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...

  3. Objective-C学习备忘录:Clang编译器编译运行Objective-C代码

    我们都知道可以通过Apple公司的Xcode工具来学习Objective-C编程语言,但是能不能脱离XCode这个IDE进行Objective-C学习呢?当然是可以的.首先作为计算机科班出身的程序员都 ...

  4. [转]ASP.NET页面之间传递值的几种方式

    页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值.存储对象传值.ajax.类.model.表单等.但是一般来说,常用的较简单有QueryString,Session,Cookie ...

  5. cocos2dx的lua绑定

    一.cocos2dx对tolua++绑定的修正 A.c对lua回调函数的引用 在使用cocos2dx编写游戏时,我们经常会设置一些回调函数(时钟.菜单选择等).如果采用脚本方式编写游戏的话,这些回调函 ...

  6. GDC2014免费slide整理下载

    GDC2014图形和程序相关的部分免费slide整理下载:)http://pan.baidu.com/s/1eQzMrxo gdc14_An Indie Approach to procedural ...

  7. Auto CAD 2013的故障解决方法

    一.问题的提出 Auto CAD 2013在使用过程中出现了错误:“安全系统(软件锁许可管理器) 不起作用或未正确安装.” 二.问题的分析 网络上很多地方转载了这么一个方法: 1) 启动Windows ...

  8. osgi: HttpService A null service reference is not allowed.

    最近在学习osgi,在练习HttpService的过程中,一直出现“A null service reference is not allowed”这样的报错,代码本身没有问题,在网上也搜了不少地方, ...

  9. Ubuntu 13.04 双显卡安装NVIDIA GT 630M驱动

    [日期:2013-05-24]   Linux系统:Ubuntu 13.04 安装 bumblebee 以管理双显卡,下面命令会自动安装NVIDIA显卡驱动 sudo add-apt-reposito ...

  10. npm命令总结

    统一切换到项目目录 安装redux :npm install -save redux 安装react-redux : npm install -save react-redux