Windows Phone 8 – Speech Recognition - SpeechRecognizer
在上一篇討論<Windows Phone 8 – Speech Recognition - SpeechRecognizerUI>,主要透過系統提供的GUI介面,
搭配SpeechRecognizer來進行語音識別的任務。接著,該篇針對SpeechRecognizer比較深入的介紹。
在往下討論之前,先複習一下Windows.Phone.Speech.Recognizer命名空間中的重要類別與列舉:
〉Windows.Phone.Speech.Recognition:
該命名空間定義了相關處理Speech Recognition的類別與列舉。以下列出相關的類別與列舉:
類型 | 名稱 | 說明 |
Class | InstalledSpeechRecognizers | 回傳電話中已安裝可用的語音識別。 |
SemanticProperty | 提供有關一個Sematic(語義)的特性。 | |
SpeechAudioProblemOccurredEventArgs | AudioProblemOccurred event的事件參數。 | |
SpeechGrammar | 運行時對象引用了語音識別語法。 | |
SpeechGrammarSet | 代表SpeechRecognizer或SpeechRecognizerUI實例中相關的grammar集合。 | |
SpeechRecognitionResult | 語音識別(speech recognition session)的結果。 | |
SpeechRecognitionResultDetail | 提供Speech Recognizer執行語音識別(speech recognition session)結果的詳細資訊。 | |
SpeechRecognitionUIResult | 搭配SpeechRecognizerUI執行語音識別(speech recognition session)取得的結果。 | |
SpeechRecognizer | 允許Speech Recognizer使用客製的GUI。 | |
SpeechRecognizerAudioCaptureStateChangedEventArgs | AudioCaptureStateChanged event的事件參數。 | |
SpeechRecognizerInformation | 包含SpeechRecognizer相關資訊。該類別允許開發人員去使用speech recognizer中的任何屬性,例如:指定語系。 | |
SpeechRecognizerSettings | 調整SpeechRecognizer物件的timeout設定。 | |
SpeechRecognizerUI | 允許Speech recognition使用的系統預設GUI。 | |
SpeechRecognizerUISettings | 設定/取得SpeechRecognizerUI物件的設定。 | |
Enumerations | SpeechGrammarProbability | An enumeration that indicates the weighted value of a grammar for speech recognition. |
SpeechPredefinedGrammar | Indicates the predefined grammar type. | |
SpeechRecognitionAudioProblem | Represents the type of audio problem that occurred. | |
SpeechRecognitionConfidence | Represents the confidence level that describes how accurately a spoken phrase was matched to a phrase in an active grammar. | |
SpeechRecognitionUIStatus | Indicates the status of the speech recognition session that was initiated by the SpeechRecognizerUI object. | |
SpeechRecognizerAudioCaptureState | An enumeration that contains all audio capture states. |
負責sppech recognition的主要元件,它本身沒有畫面,可搭配SpeechRecognizerGUI或自訂的GUI來進行語音識別的任務,
也可以搭配SpeechSynthesizer,讓識別出來的內容可以朗讀出來,增加使用者經驗。
如果SpeechRecognizer實例化後,沒有指定載入Grammars,系統會自動採用預設的dication grammars。
重要的事件、屬性與方法如下:
類型 | 名稱 | 說明 |
Event | AudioCaptureStateChanged | 當speech recognizer的audio capture state改變時,觸發該事件。 搭配SpeechRecognizerAudioCaptureState的列舉值來識別狀態加以處理; |
AudioProblemOccurred | 當audtio problems會影響識別的準確率時,觸發該事件。 搭配SpeechRecognitionAudioProblem的列舉值來識別發生問題點。 |
|
Method | Close | 執行與釋放或重置資源分配相關的應用程序定義的任務。 |
GetRecognizer | 取得描述該speech recognizer的SpeechRecognizerInformation物件,。 | |
SetRecognizer | 設定啟用中的speech recognizer一個特定的SpeechRecognizerInformation 物件。 | |
PreloadGrammarsAsync | 在speech grammar set中載入所有指定的grammars。 | |
RecognizeAsync | 透過SpeechRecognizer物件開始speech recognition session。 | |
Property | Grammars | (Read-only) 取得該speech recognizer的grammars集合。 |
Settings | (Read-only) 取得該speech recognizer相關的timeout設定。 |
在SpeechRecognizer每次呼叫RecognizeAsync()企圖從用戶的發聲找到對應的啟動grammars,通常會有幾種結果:
a. 識別成功!用戶的發聲被對應於garmmars中的某一個phrase;
b. 識別不成功!用戶的發聲不能被對應於grammars中的phrase;
c. 識別所花費時間超過預期timeout了!
=>如果SpeechRecognizerSettings.InitialSilenceTimeout、SpeechRecognizerSettings.BabbleTimeout或
SpeechRecognizerSettings.EndSilenceTimeout任一個到期了,那SpeechRecognizer自動會識別是否有對應的grammars;
針對SpeechRecognizer的說腚可參考<Customizing speech recognizer settings for Windows Phone 8>的內容,如下:
設定 | 說明 |
預設5秒。作用於Speech Recognizer等待用戶輸入的時間區間。 在時間期限之前,如果Speech Recognizer不能接收到任何輸入,它將自動結束該識別。 例如:可調整該等待時間,讓Speech Recognizer等待更長或短的時間。 |
|
預設0秒,該功能沒有被啟動。 作用於Speech Recognizer在這期間間隔只收到非語音的輸入的噪音,例如:背景噪音。 背景噪音包括:任何非語音輸入、無法匹配於任何啟動的Grammars或是Rules。 如果Speech Recognizer在Babble timeout區間只收到非語音輸入,它將會自動結束。 |
|
預設150毫秒,應用程式通常使用該設定。 作用於Speech Recognizer從等待用戶輸入到識別完成這段沉默做為輸入的時間區間。 Recognizer已接收到的輸入,但不匹配任何現在載入的規則與啟動Grammars。 |
[注意]
設定timeouts對於Speech Recognizer使用predefined dictation或web search grammars時沒有影響。
以下先透過一個簡單的範例程式說明以上介紹幾個重要的事件與方法:
(1) 初始化SpeechRecognizer,指定Grammars來至WebSearch,指定監控AudioCaptureStateChanged事件;
// 宣告一個SpeechRecognizer物件
private SpeechRecognizer myRecognizer;
// Constructor
public MainPage()
{
InitializeComponent();
// 初始化SpeechRecognizer物件,並設定WebSearch的Grammar
myRecognizer = new SpeechRecognizer();
myRecognizer.Grammars.AddGrammarFromPredefinedType("citySearch", SpeechPredefinedGrammar.WebSearch);
// 提示用戶要說的內容為城市名稱
txtDisplay.Text = "What's your destination city?";
// 訂閱處理 AudioCaptureStateChanged 事件
myRecognizer.AudioCaptureStateChanged += myRecognizer_AudioCaptureStateChanged;
}
// 監測capture state的改變來更新要文字框的內容.
void myRecognizer_AudioCaptureStateChanged(SpeechRecognizer sender, SpeechRecognizerAudioCaptureStateChangedEventArgs args)
{
if (args.State == SpeechRecognizerAudioCaptureState.Capturing)
{
this.Dispatcher.BeginInvoke(delegate { txtDisplay.Text = "Listening"; });
}
else if (args.State == SpeechRecognizerAudioCaptureState.Inactive)
{
this.Dispatcher.BeginInvoke(delegate { txtDisplay.Text = "Thinking"; });
}
}
(2) 執行SpeechRecognizer,識別SpeechRecognitionResult與它的TextConfidence品質;
private async void btnSPR_Click(object sender, RoutedEventArgs e)
{
// 開啟識別
SpeechRecognitionResult recoResult = await myRecognizer.RecognizeAsync();
// 確認識別的結果是否被rejected
if (recoResult.TextConfidence == SpeechRecognitionConfidence.Rejected)
{
txtDisplay.Text = "Sorry, didn't catch that. \n\nSay again.";
}
// 如果發聲被識別為low confidence,需要提示用戶在輸入一次
else if (recoResult.TextConfidence == SpeechRecognitionConfidence.Low)
{
txtDisplay.Text = "Not sure what you said. \n\nSay again.";
}
// 如果發聲被識別為high/medium confidenceCheck則可以取得識別結果
else if (recoResult.TextConfidence == SpeechRecognitionConfidence.High ||
recoResult.TextConfidence == SpeechRecognitionConfidence.Medium)
{
txtDisplay.Text = "Heard you say: \n\n" + recoResult.Text;
}
}
從上述範例中可以看到幾個重要的元素:(1) SpeechGrammarSet;(2) SpeechRecognitionResult;(3)SpeechRecognizerInformation;
往下便按照搭配的內容加以說明。
SpeechGrammarSet是由SpeechGrammar的集合,作用於SpeechRecognizer或SpeechRecognizerUI物件。重點方法如下:
Method | Description |
AddGrammarFromList | 透過string array的values建立一個SpeechGrammar,並加入Grammar集合。 |
AddGrammarFromPredefinedType | 利用預先定義(pre-defined)的grammar type建立SpeechGrammar,並加入Grammar集合中。 搭配SpeechPredefinedGrammar列舉使用,其列舉有二個項目: ‧Dictation:Indicates a dictation grammar.(1) ‧WebSearch:Indicates a web search grammar.(2) [注意] 每一次使用SpeechRecognizer只能有一個pre-defined grammer type。這也表示,如果你同時呼叫了AddGrammarFromPredfinedType二次設定dictation或web search grammar的話,系統會回傳一個SPERR_GRAMMARSET_CANT_ADD錯誤訊息。 為了避免這樣的錯誤,在設定切換前記得先加上「Clear()」的方法。 |
AddGrammarFromUri | 利用SGRS grammar file建立SpeechGrammar物件,並加入Grammar集合中。 |
Clear | 從SpeechGrammarSet清除所有SpeechGrammar。 |
First | 從SpeechGrammarSet取得第一個grammar。 |
HasKey | 確定SpeechGrammarSet中是否包含指定key的grammar。 |
Lookup | 從SpeechGrammarSet取得指定key的grammar。 |
Split | 分割speech grammar set中的map view為二個map views。 |
如果要增加Recognizer的SpeechGrammarSet可透過AddGrammarFromList、PredefinedType與Uri的方式,更多詳細的可參考
<Adding, loading, and preloading grammars for Windows Phone>方法。
SpeechRecognitionResult為Speech Recognizer回傳的處理結果,另外如果是透過GUI的部分則是使用SpeechRecognitionUIResult。
以下詳細看一下SpeechRecognitionResult的方法與屬性:
類型 | 名稱 | 說明 |
Method | GetAlternates | 取得speech recognition result的集合,其內容以有可能至最有可能的結果來排列。 |
Property | Details | (Read-only) 取得相關speech recognition result的額外詳細資訊,為SpeechRecognitionResultDetail物件。 包括:被觸發的rules、回傳的recognition phrase與confidence score。 |
RuleName | (Read-only) 從Speech Recognition Grammar Specification (SRGS) grammar 取得觸發與回傳識別片語的rule element。 |
|
Semantics | (Read-only) 取得在Speech Recognition Grammar Specification (SRGS) grammar中識別片語的semantic屬性字典。 |
|
Text | (Read-only) 取得speech recognitiono session的recognized phrase。 |
|
TextConfidence | (Read-only) 取得result的confidence,它是SpeechRecognitionConfidence列舉值。可搭配Details中的ConfidenceScore來加識別,其列舉值有: ‧Rejected:(0),口語短語不匹配任何短語在任何啟動的語法。 ‧Low:(1),信任水平(confidence level)是很低的。 ‧Medium:(2),信任水平是中等的。 ‧High:(3),信任水平是高的。 |
在取得SpeechRecognitionResult時,基本即是識別TextConfidenence的可信任水平,接著再搭配對應的結果或作法去回應給用戶。
針對SpeechRecognitionResult的介紹,可參考<Working with speech recognition results for Windows Phone 8>有更詳細的說明。
包括speech recognizer的相關資訊。該類別允許開發者控制speech recognizer使用任何指定的屬性,例如:specific language。
其屬性如下:
Property | Access type | Description |
Description | Read-only | Gets the description of a speech recognizer. |
DisplayName | Read-only | Gets the display name of a speech recognizer. |
Id | Read-only | Gets the display name of a speech recognizer. |
Language | Read-only | Gets the language of a speech recognizer. 如果沒被設定過,系統會依照手機中「Settings/Speech」選擇的語系為主。 |
參考<Selecting a speech recognizer for Windows Phone 8>的介紹,舉例說明,如何指定語系給speech recognizer來識別語音輸入:
‧InstalledSpeechRecognizers找出指定的語系,SetRecognizer(SpeechRecognizerInformation)指定給speech recognizer:
// 宣告一個SpeechRecognizerUI的物件
SpeechRecognizerUI recoWithUI;
private async void SpeakFrench_Click_1(object sender, RoutedEventArgs e)
{
// 初始化SpeechRecognizerUI物件
recoWithUI = new SpeechRecognizerUI();
// 指定語系從已安裝於該設備中的SpeechRecognizer加以搜尋
IEnumerable<SpeechRecognizerInformation> frenchRecognizers = from recognizerInfo in InstalledSpeechRecognizers.All
where recognizerInfo.Language == "fr-FR"
select recognizerInfo;
// 設定SpeechRecognizer
recoWithUI.Recognizer.SetRecognizer(frenchRecognizers.ElementAt(0));
// 建立要使用的Grammars,其值為French的數字
string[] nombres = { "un", "deux", "trois", "quatre", "cinq",
"six", "sept", "huit", "neuf", "dix" };
// 指定GrammarSet加入來自List的Grammar
recoWithUI.Recognizer.Grammars.AddGrammarFromList("frenchNumbers", nombres);
// 設定SpeechRecognizerUI的Display text
recoWithUI.Settings.ListenText = "Say a French number";
// 設定SpeechRecognizerUI的exampl.
recoWithUI.Settings.ExampleText = " 'un', 'deux', 'trois', 'quatre' ";
// 開始進行語音識別
SpeechRecognitionUIResult recoResult = await recoWithUI.RecognizeWithUIAsync();
}
InstalledSpeechRecognizers儲存了該設備已安裝的SpeechRecognizer。
[範例程式]
======
將Speech Recognition分成二篇文件加以說明,主要是因為二篇使用很接近,但本篇說明是比較詳細處理Recognition的部分,
因此,希望對大家有一定的幫助,其實還有很多相關說明處理SpeechRecognition的部分,可以參考下方的連結加以補充。
References:
‧Speech recognition for Windows Phone 8
‧Starting speech recognition for Windows Phone 8
‧Customizing speech recognizer settings for Windows Phone 8 (重要)
‧Selecting a speech recognizer for Windows Phone 8
‧Handling issues with audio input for Windows Phone 8 (重要)
‧Working with speech recognition results for Windows Phone 8 (重要)
‧Windows Phone 8 – Text-to-Speech (TTS)讓應用程式讀出內容
‧Adding, loading, and preloading grammars for Windows Phone 8 (重要)