在Unity中使用語音辨識 (Unity內建&Azure Speech)
如果我們想在遊戲中用語音控制角色,該怎麼做?
這邊需要使用到語音辨識的技術。
語音辨識API在Unity中尚屬於beta版本,有諸多限制,你也可以使用外部的的語音辨識引擎來串接,例如Google Cloud Speech或Amazon Transcribe。
這邊我將分別示範使用Unity內建的語音辨識與Azure Speech Service來製作語音辨識、語音轉文字的功能。
使用Unity內建的語音辨識
前置準備
- 開發環境必須在Windows 10上
- 檢查你的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內建的比起來有幾個優點:
- Azure支援的語言更多種,而且不會像Unity輸入語言被Windows系統語言綁定
- Azure支援語音辨識的同時輸出三種語言的翻譯
- 可以build到Android或iOS上做使用
- Azure有提供Unity plugins,API使用上比Unity內建的更多功能也更直覺
缺點:
- 要錢,有免費試用期
- 還是只能在Windows 10上開發
事前準備
- 從這裡用你的Microsoft帳號申請一個Azure帳號,並開始免費試用
- 開啟Azure平台,點選左上角的+號建立資源,並搜尋Speech來創建一個Azure服務
- 記下API Key跟申請的region,待會會用到
- 下載Azure Speech Unity plugin,把它匯入你的Unity專案中
範例1 : 使用Azure辨識單句語音
一樣將腳本放在空的GameObject上,然後將一個UI Button跟UI Text拉給它,最後填入你的API Key與 region即可。
範例2 : 使用Azure語音辨識 + 同時翻譯三個語言(英文、日文、克林貢語)
那今天的介紹就到這邊,若有什麼想法也歡迎找我討論,謝謝!
Reference: