2016年8月30日 星期二

Microsoft Cognitive Services (3) - 在你的app中直接加入語音辨識

時代真的不一樣了。

我還記得剛使用iPhone的時候,那個著名的Siri,辨識我說話的效果不是很好,但因為我常常需要做語音筆記,並且轉到待辦事項或是行事曆紀錄裡面。因此,我下載了另一個叫做Dragon Dictation的app,哇,用起來驚為天人,辨識率出奇的好,讓我龍心大悅大開眼界。這,已經是幾年前的事情了。

直到最近,自己有需要在開發App時導入語音辨識,才開始又survey起相關的套件,萬萬沒想到,怎麼現在做語音辨識可以簡單成這樣?

語音辨識真的不是新玩意兒了,早幾年前微軟就已經推出過text/speech之間的轉換工具,但辨識率(特別是對中文的支援)依舊是大家是否會採用的關鍵,沒想到幾年不見,現在Cognitive Services中的Speech Recognition已經有非常好的成效,不僅僅辨識率高,也支援中文,還有提供C#、android、iOS、javascript…等等等的sdk,都開放成這樣了,如果再不用那就是對不起自己了。

現在要使用此服務,非常的簡單,參考本系列第一篇,先申請好key之後,在你的專案中引入nuget package,然後就可以直接用了:

接著,我們來看程式碼的寫法:

請先建立一個全域的micClient物件,該物件可以從SpeechRecognitionServiceFactory靜態類別的CreateMicrophoneClient方法產生,可用來直接access我們電腦的麥克風,並進行收音並且開始辨識。

記得建立該物件的instance時要傳入辨識方法(SpeechRecognitionMode.LongDictation)與語言地區(zh-TW)等參數,當然也少不了key。

接著,我們hook幾個事件,分別是:

  1. OnMicrophoneStatus : micClient狀態發生改變時
  2. OnPartialResponseReceived : 部分辨識完成時
  3. OnResponseReceived : 整段語句辨識完成時
  4. OnConversationError : 發生錯誤時

顯而易見的,你可以在OnResponseReceived 事件發生時,抓取辨識結果,因此我們聚焦在這個事件的Event handler(其他幾個事件你不hook也行)。

別忘了最後要呼叫StartMicAndRecognition方法。

剛才說到,主要還是OnResponseReceived 這個事件,你會發現,開發人員可以透過回傳的SpeechResponseEventArgs參數,來取得相關的結果:

上面的程式碼中先判斷了目前正在進行的語音辨識的狀態,如果一句話告一段落,或是Timeout,則我們透過非同步的方式呼叫了MicClient的EndMicAndRecognition結束辨識動作。

但重點其實最後一行,我們如何抓取辨識的結果?

抓取辨識結果的方式很簡單,你可以透過SpeechResponseEventArgs參數e中的Results屬性取得,該屬性指向一個陣列,該陣列會回傳幾組最佳的辨識結果(如果有的話),而每一組辨識結果的型別則是RecognizedPhrase,該物件有底下幾個屬性:

其中Confidence則辨識結果可信度,共有none, low, normal, high等四種可能,而DisplayText、LexicalForm、InverseTextNormalizationResult、MaskedInverseTextNormalizationResult都是辨識的結果,但用途不同,依般來說,如果顯示給用戶看可以直接採用DisplayText,而LexicalForm適合作為程式判斷用途。另外兩個是把辨識結果中的某些短字詞做了替換,詳細說明請參考底下這裡:
https://staging.www.projectoxford.ai/Files/Doc/Speech/Windows/html/cbd61214-dc0f-a674-273a-751145514068.htm

OK,透過這組服務,辨識一段話變得非常容易:


你可以在這邊看到微軟提供的相關範例完整程式碼。

沒有留言: