WP8 - SpeechRecognizer

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.

 

SpeechRecognizer

    負責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.InitialSilenceTimeoutSpeechRecognizerSettings.BabbleTimeout

        SpeechRecognizerSettings.EndSilenceTimeout任一個到期了,那SpeechRecognizer自動會識別是否有對應的grammars;

 

針對SpeechRecognizer的說腚可參考<Customizing speech recognizer settings for Windows Phone 8>的內容,如下:

設定 說明

SpeechRecognizerSettings.InitialSilenceTimeout

預設5秒。作用於Speech Recognizer等待用戶輸入的時間區間。
在時間期限之前,如果Speech Recognizer不能接收到任何輸入,它將自動結束該識別。

例如:可調整該等待時間,讓Speech Recognizer等待更長或短的時間。

SpeechRecognizerSettings.BabbleTimeout

預設0秒,該功能沒有被啟動。
作用於Speech Recognizer在這期間間隔只收到非語音的輸入的噪音,例如:背景噪音。
背景噪音包括:任何非語音輸入、無法匹配於任何啟動的Grammars或是Rules。

如果Speech Recognizer在Babble timeout區間只收到非語音輸入,它將會自動結束。

SpeechRecognizerSettings.EndSilenceTimeout

預設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

   SpeechGrammarSet是由SpeechGrammar的集合,作用於SpeechRecognizerSpeechRecognizerUI物件。重點方法如下:

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

       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>有更詳細的說明。

 

SpeechRecognizerInformation

    包括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 (重要)

Grammars for Windows Phone 8

Windows Phone 8 – Text-to-Speech (TTS)讓應用程式讀出內容

Adding, loading, and preloading grammars for Windows Phone 8 (重要)

 

Dotblogs 的標籤: