標籤:android style blog http io color os ar for
WindowsPhone下語音操作包括:
1、程式內部的語音辨識,使用者可以通過語音辨識進行輸入或完成相關任務
2、控製程序的語音命令,控製程序啟動、開啟,並可對頁面跳轉等進行操作
這篇文章將構建一個簡單的語音辨識(一般的會將說的話全部識別出來,而利用SRGS文法可識別一句話裡面的組成)
SRGS(語音辨識文法規範),可以定義複雜的語音辨識規則.如:識別用同義字替換了詞語,漏說了非關鍵詞等。
SRGS須先儲存到StorgeFile,再添加到SpeechRecognizer類的屬性上。
//按鈕點擊事件,開始進行語音辨識
private async void Button_Click(object sender, RoutedEventArgs e){ string message = ""; try { SpeechRecognizer speechRecognizer = new SpeechRecognizer();
//以下兩個事件就不寫了 speechRecognizer.StateChanged += speechRecognizer_StateChanged;//狀態改變 speechRecognizer.RecognitionQualityDegrading += speechRecognizer_RecognitionQualityDegrading;//語音品質 //擷取內建的SRGS文法檔案,如只是簡單的識別出將的話,不要這三行 StorageFile file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync("SRGSGrammar.xml"); SpeechRecognitionGrammarFileConstraint grammarFile = new SpeechRecognitionGrammarFileConstraint(file); speechRecognizer.Constraints.Add(grammarFile);//添加SRGS文法約束 //speechRecognizer.UIOptions.ExampleText = "這裡填的是有UI時候的樣本";
//分析語音 SpeechRecognitionCompilationResult compilationResult = await speechRecognizer.CompileConstraintsAsync(); if (compilationResult.Status == SpeechRecognitionResultStatus.Success) {
var result = await speechRecognizer.RecognizeAsync();//無介面的語音辨識 若為.RecognizeWithUIAsync(); 則是顯示系統本身的識別介面 if (result.Confidence == SpeechRecognitionConfidence.Rejected)
{
message = "識別不到"; } else { resultMessage.Text = result.Text; //識別結果 } } } catch (Exception err) { message = "異常資訊:" + err.Message + err.HResult; }
}
SRGSGrammar.xml檔案
<?xml version="1.0" encoding="utf-8" ?><grammar version="1.0" xml:lang="zh-cn" root="mediaMenu" tag-format="semantics/1.0" xmlns=http://www.w3.org/2001/06/grammar
xmlns:sapi="http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions"><!- 這些都是必不可少的--> <rule id="city" scope="public"> <one-of> <!-- 匹配其中一個短語--> <item>北京</item> <item>上海</item> </one-of> </rule> <rule id="cross" scope="public"> <one-of> <item>到</item> <item>至</item> <item>飛往</item> </one-of> </rule> <rule id="Menu" scope="public"> <item> <ruleref uri="#date"/> <!--指定關聯的其他規則的節點--> <tag>out.date = reles.latest();</tag> </item> <item repeat="0-1">從</item> <!--顯示1次或0次--> <item> <ruleref uri="#city"/> <tag>out.city = rulels.latest();</tag> </item> <item> <ruleref uri="#cross"/> <tag>out.cross = rulels.latest();</tag> </item> <item> <ruleref uri="#city"/> <tag>out.city = rulels.latest();</tag> </item> </rule></grammar>
以上可以實現識別"從(“從”可有可無) 北京/上海 到/至/飛往 北京/上海"
北京到上海、從北京到上海、北京飛往上海、從上海飛往北京、上海到北京等。
可惜的是,出發地和到達地是能夠重複的。且只支援“ (從)出發地---到達地” 這樣特定的規則
說多了其他的(廢)話,就會識別出錯。
PS:最近的項目上要添加語音辨識功能,要求用的是百度語音辨識的SDK/API,可惜前者只支援Android和Iphone
後者雖是各個平台通用,但工作量上大了一點,得先進行錄音,之後再通過HttpWebRequest和API傳輸資料,解析。
Windows Phone內建的語音辨識