重新想象 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(4096); IRandomAccessStream writeStream = (IRandomAccessStream)await file.OpenAsync(FileAccessMode.ReadWrite); IOutputStream outputStream = writeStream.GetOutputStreamAt(0); DataWriter dataWriter = new DataWriter(outputStream); while (synthesisStream.Position < synthesisStream.Size) { await synthesisStream.ReadAsync(buffer, 4096, 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(4096); IRandomAccessStream writeStream = (IRandomAccessStream)await file.OpenAsync(FileAccessMode.ReadWrite); IOutputStream outputStream = writeStream.GetOutputStreamAt(0); DataWriter dataWriter = new DataWriter(outputStream); while (synthesisStream.Position < synthesisStream.Size) { await synthesisStream.ReadAsync(buffer, 4096, InputStreamOptions.None); dataWriter.WriteBuffer(buffer); } dataWriter.StoreAsync().AsTask().Wait(); outputStream.FlushAsync().AsTask().Wait(); btnSaveAudio.IsEnabled = true; } } } }
OK
[源碼下載]