深入淺出Windows Phone 8應用開發》之發音合成與語音識别
Windows Phone從一開始就具有了強大的語音功能,我們可以長按開始鍵就可以調用手機的語音識别界面,然後可以通過語音來進行啟動一些任務。那麼在Windows Phone 8裡面,語音控制的程式設計接口都開放了相關的API給應用程式調用,是以在應用程式裡面也一樣可以實作語音的控制。
發音的合成
發音的合成是指把文本轉化為語音由手機系統進行發音,進而實作了把文本自動轉化為了更加自然化的聲音。在Windows Phone 8裡面可以使用SpeechSynthesizer類來實作發音合成的功能,通過SpeakTextAsync方法可以直接文本轉化為聲音并且播放。
下面給出發音合成的示例:使用發音合成對文本的内容進行發音。
代碼清單:發音合成
MainPage.xaml檔案主要代碼
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel >
<TextBox Name="textBox1" Text="Hello World!" />
<Button Content="發音" Name="button1" Click="button1_Click" />
<TextBlock x:Name="erro"/>
</StackPanel>
</Grid>
MainPage.xaml.cs檔案主要代碼
SpeechSynthesizer voice;//語音合成對象
public MainPage()
{
InitializeComponent();
this.voice = new SpeechSynthesizer();
}
private async void button1_Click(object sender, RoutedEventArgs e)
try
{
if (textBox1.Text!="")
{
button1.IsEnabled = false;
await voice.SpeakTextAsync(textBox1.Text); //文本語音合成
button1.IsEnabled = true;
}
else
MessageBox.Show("請輸入要讀取的内容");
}
catch (Exception ex)
erro.Text = ex.ToString();
}
程式運作的效果如圖10.21所示。
圖10.21 發音合成
語音識别是指讓手機通過識别和了解過程把語音信号轉變為相應的文本或指令。在Windows Phone 8裡面語音識别分為兩種類型一種是使用使用者自定義的UI頁面,另外一種是使用系統預設的語音識别界面也就是我們長按開始鍵的語音識别界面。使用語音識别的功能需要在WMAppManifest.xml檔案中添加兩種功能要求ID_CAP_SPEECH_RECOGNITION和ID_CAP_MICROPHONE。下面分别來介紹一下這兩種語音識别的程式設計。
自定義語音識别界面可以通過SpeechRecognizer類來實作,首先需要先添加監聽的文法,然後通過使用SpeechRecognizer類RecognizeAsync方法來監聽語音的識别。
下面給出數字語音識别的示例:對1到10的英文數字發音進行監控,如果監聽到數字的發音則把英文數字單詞顯示出來。
代碼清單:數字語音識别
<StackPanel>
<TextBlock Text="語音識别的内容:"/>
<TextBlock x:Name="tbOutPut" Text=""/>
<Button Content="開始識别" Name="continuousRecoButton" Click="continuousRecoButton_Click" />
</Grid>
using System;
using System.Collections.Generic;
using System.Windows;
using Microsoft.Phone.Controls;
using Windows.Foundation;
using Windows.Phone.Speech.Recognition;
namespace SpeechRecognizerDemo
{
public partial class MainPage : PhoneApplicationPage
{
SpeechRecognizer recognizer; //語音識别對象
IAsyncOperation<SpeechRecognitionResult> recoOperation; //語音識别操作任務
bool recoEnabled = false; //判斷是否停止監聽
public MainPage()
{
InitializeComponent();
try
{
//建立一個語音識别類
this.recognizer = new SpeechRecognizer();
// 添加監聽的單詞清單
this.recognizer.Grammars.AddGrammarFromList("Number", new List<string>() { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" });
}
catch (Exception err)
tbOutPut.Text = "Error: " + err.Message;
}
//按鈕單擊事件處理
private async void continuousRecoButton_Click(object sender, RoutedEventArgs e)
if (this.recoEnabled)
this.recoEnabled = false;
this.continuousRecoButton.Content = "開始識别";
this.recoOperation.Cancel();
return;
else
this.recoEnabled = true;
this.continuousRecoButton.Content = "取消識别";
do
try
{
// 捕獲語音的結果
this.recoOperation = recognizer.RecognizeAsync();
var recoResult = await this.recoOperation;
// 音量過低無法識别
if ((int)recoResult.TextConfidence < (int)SpeechRecognitionConfidence.Medium)
{
tbOutPut.Text = "說話聲音太小";
}
else
tbOutPut.Text = recoResult.Text;
}
catch (System.Threading.Tasks.TaskCanceledException)
// 忽略語音識别的取消異常
catch (Exception err)
const int privacyPolicyHResult = unchecked((int)0x80045509);
if (err.HResult == privacyPolicyHResult)
MessageBox.Show("尚未接受語音隐私協定。");
this.recoEnabled = false;
this.continuousRecoButton.Content = "開始識别";
tbOutPut.Text = "Error: " + err.Message;
} while (this.recoEnabled);//循環進行監聽語音
}
}
程式運作的效果如圖10.22所示。
圖10.21 語音識别數字
系統語音識别界面可以通過SpeechRecognizerUI類來實作,使用的基本文法與SpeechRecognizer類相類似,系統的語音識别界面通過SpeechRecognizerUI類Settings屬性來設定,Settings.ListenText表示界面的标題,Settings.ExampleText表示界面的示例内容。
下面給出數字語音識别系統界面的示例:使用系統地語音識别界面,對1到10的英文數字發音進行監控,如果監聽到數字的發音則把英文數字單詞顯示出來。
MainPage.xaml檔案主要代碼
MainPage.xaml.cs檔案主要代碼
namespace SpeechRecognizerUIDemo
SpeechRecognizerUI recognizer; //語音識别對象
this.recognizer = new SpeechRecognizerUI();
// 語音彈出框的标題
this.recognizer.Settings.ListenText = "說出一個1到10的英文單詞";
// 語音彈出框的示例内容
this.recognizer.Settings.ExampleText = "例如, 'one' or 'two'";
this.recognizer.Recognizer.Grammars.AddGrammarFromList("Number", new List<string>() { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" });
// 開始啟動系統的語音識别UI并且等待使用者的回答
SpeechRecognitionUIResult recognizerResult = await this.recognizer.RecognizeWithUIAsync();
// 确認識别是否成功和音量達到要求
if (recognizerResult.ResultStatus == SpeechRecognitionUIStatus.Succeeded&& recognizerResult.RecognitionResult.TextConfidence == SpeechRecognitionConfidence.High)
tbOutPut.Text = recognizerResult.RecognitionResult.Text;
tbOutPut.Text = "音量太小";
程式運作的效果如圖10.23所示。
圖10.23 系統語音識别界面
本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1114926