在Unity中使用語音辨識 (Unity內建&Azure Speech)

Cloud Lin
Akatsuki Taiwan Technology
6 min readJan 22, 2021

如果我們想在遊戲中用語音控制角色,該怎麼做?
這邊需要使用到語音辨識的技術。

語音辨識API在Unity中尚屬於beta版本,有諸多限制,你也可以使用外部的的語音辨識引擎來串接,例如Google Cloud SpeechAmazon Transcribe
這邊我將分別示範使用Unity內建的語音辨識與Azure Speech Service來製作語音辨識、語音轉文字的功能。

使用Unity內建的語音辨識

前置準備

  1. 開發環境必須在Windows 10上
  2. 檢查你的Cortana是否能用 (在開始列搜尋Cortana),如果顯示“你的所在地區不支援Cortana”,那你需要進Windows設定,將系統語言設定成美國或中國。

Unity內建幾種Recognizer可以做語音辨識,以下將分別介紹:

KeywordRecognizer

給定一組關鍵字,當收聽到其中關鍵字時,會觸發設定好的call back

你可以使用簡單的字詞來發出命令,例如:

“Up”、”Down”、”Left”、”Right”

KeywordRecognizer會比對你的聲音訊號與已註冊的單詞的相似度,若高於門檻值則會判定為有效語音,門檻高低可以在code裡設定

範例

在空場景中新增一個GameObject叫KeywordRecognizer,將此腳本掛上去。

然後再新增一個UI Text跟2D Object->Sprite,將喜歡的圖片放進2D Sprite。

點選KeywordRecognizer,將Keywords的size調整成4,並依序新增up down left right的關鍵字。然後將剛剛新增的UI Text跟2D Object拉進Inspector視窗的對應reference。

按下Play,對著麥克風說指令,會看到如下成果:

至此我們就完成了一個能聽懂關鍵字的語音辨識!

PhraseRecognizer

與KeywordRecognizer很類似,差別只在它可以識別"一組"字詞,而不是一個單字。例如你可以說 “Tony go right” 或 “Stop moving”

DictationRecognizer

聽寫模式,意即語音辨識會一邊接收聲音信號,一邊同時產出結果。

使用起來的感覺會更像手機常用的Apple Siri或Google語音助理;它們並不會在你講完一段話後才顯示字詞,而會在你講話的同時就開始輸出辨識結果,在使用者說話結束時,再做一次精確度比較高的總比對校正字詞。

從前面的KeywordRecognizer我們可以看出辨識結果會在說話完的0.5~1秒後才執行命令,稍嫌有點慢,這是因為Recognizer在等待使用者說完話。

若使用DictationRecognizer則可以更快速的得到結果。

DictationRecognizer的使用方法與前面兩個稍有不同,它有四個callback分別對應不同的使用情境:

•DictationHypothesis : 在使用者講話時會頻繁觸發,回傳到目前為止的辨識結果,可能包含很多錯誤辨識,但速度很快

•DictationResult : 在使用者停頓或停止說話時才會觸發,回傳整句的辨識結果,正確率高,但比較慢才出現

•DictationComplete : 一般不會用到,通常在Recognizer.Stop()或是其他方式結束辨識時才會觸發

•DictationError : 其他不可預期的錯誤。

GrammerRecognizer

最麻煩的一個,但設定的好能兼顧速度與準確度。

簡單來說是寫一個XML檔案的 "字典" 給它,字典中定義什麼是數字、哪些字代表A意思、哪些片語代表B意思…等

透過這樣的方式來預測使用者會說的話,以提高準確度與速度

例如: 定義以下字詞都是"打招呼"的意思
"你好" 、 "安安" 、 “Hello” 、 “YO!”

XML檔案怎麼使用可以參考這裡

使用Azure Speech Service

使用Azure跟Unity內建的比起來有幾個優點:

  1. Azure支援的語言更多種,而且不會像Unity輸入語言被Windows系統語言綁定
  2. Azure支援語音辨識的同時輸出三種語言的翻譯
  3. 可以build到Android或iOS上做使用
  4. Azure有提供Unity plugins,API使用上比Unity內建的更多功能也更直覺

缺點:

  1. 要錢,有免費試用期
  2. 還是只能在Windows 10上開發

事前準備

  1. 從這裡用你的Microsoft帳號申請一個Azure帳號,並開始免費試用
  2. 開啟Azure平台,點選左上角的+號建立資源,並搜尋Speech來創建一個Azure服務
  3. 記下API Key跟申請的region,待會會用到
  4. 下載Azure Speech Unity plugin,把它匯入你的Unity專案中

範例1 : 使用Azure辨識單句語音

一樣將腳本放在空的GameObject上,然後將一個UI Button跟UI Text拉給它,最後填入你的API Key與 region即可。

範例2 : 使用Azure語音辨識 + 同時翻譯三個語言(英文、日文、克林貢語)

那今天的介紹就到這邊,若有什麼想法也歡迎找我討論,謝謝!

--

--