[源码下载]

重新想象 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. 怎么删除github上的仓库

    1.到你的个人中心.点击你的个人账号.下图的红色部分 2.点击repositories(仓库),选择你要删除的项目 3.code这一行导航栏 最后的一个. setting 4.下拉页面到最下面 Del ...

  2. iOS开发——高级技术精选&底层开发之越狱开发第二篇

    底层开发之越狱开发第二篇 今天项目中要用到检查iPhone是否越狱的方法. Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名: * isJailbroken ...

  3. Cubieboard2裸机开发之(二)板载LED交替闪烁

    前言 电路原理在文章http://www.cnblogs.com/lknlfy/p/3583806.html中已经说明,两个LED的原理图是一样的.要使两个LED交替闪烁,只需要在点亮蓝色LED,熄灭 ...

  4. aspose.cell 设置excel里面的文字是超链接

    目的: 1.通过方法designer.Workbook.Worksheets[0].Hyperlinks.Add("A1", 1, 1, url);给导出到excel里面的数据加上 ...

  5. bower 新建.bowerrc文件

    Twitter工程师团队推出了Bower,这是一个针对Web开发的包管理器.该工具主要用来帮助用户轻松安装CSS.JavaScript.图像等相关包,并管理这些包之间的依赖. 随着网页功能变得越来越复 ...

  6. SSH: 本地.ssh目录下的公钥文件最好删掉

    这次ssh amazon ec2的instance,在家里电脑登录OK,到了公司电脑登录失败(只支持公钥机制).私钥已经拷贝到公司的ubuntu上了,奇怪. 后来发现是.ssh目录下存在一些公钥文件导 ...

  7. C#调用Java类

    C#调用Java类 (2011-01-07 14:02:05) 转载▼   分类: Java学习  1. 在Eclipse中新建名称为hello的java project,此工程仅包含一个文件hell ...

  8. 封装系统自带的Debug

    Unity3d的Debug.Log函数用于打印日志,一般项目中都会对其作如下两件事情: (1)希望有一个总的开关来控制整个游戏中日志的打印与否: (2)有的系统会将Log封一层并添加统一的标记,比如S ...

  9. 关于MySQL的Admin Ping Command

    前言: 最近在线上诊断QPS飙升的过程中深入进行了下Admin Ping Command的测试.此外,再一些国外文章中最近也读到了一些相关知识,所以写成一篇博文做一下总结. 1. 关于Admin Pi ...

  10. LeetCode——Find Median from Data Stream

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...