說明: 本篇文章翻譯來自Hololens官方文檔—— Unity語音輸入( https://developer.microsoft.com/en-us/windows/mixed-reality/voice_input_in_unity) 翻譯如下: 前沿:
Unity公開了將Voice輸入添加到Unity應用程式的三種方法。
使用KeywordRecognizer(兩種類型的PhraseRecognizers之一),您的應用程式可以被賦予一系列要監聽的字串命令。使用GrammarRecognizer(另一種類型的PhraseRecognizer),您的應用程式可以被賦予一個定義特定文法的SRGS檔案進行監聽。使用DictationRecognizer,您的應用程式可以聽任何單詞,並向使用者提供其語音的音符或其他顯示。
注意:只有聽寫或片語識別才能立即處理。這意味著如果文法辨識器或關鍵字辨識器處於活動狀態,則DictationRecognizer不能處於活動狀態,反之亦然。
步驟如下所示: 啟動語音功能
Unity必須啟用Microphone 功能,才能使用語音功能,啟用步驟如下所示:
Unity——Edit——Project Settings——Capabilitees——勾選Microphone選項
片語識別——KeywordRecognizer
要使您的應用程式聽取使用者使用的特定短語,然後採取一些措施,您需要: 指定使用KeywordRecognizer或GrammarRecognizer偵聽哪些短語 處理OnPhraseRecognized事件,並採取與識別的短語相對應的操作 所需命名空間:UnityEngine.Windows.Speech
using UnityEngine.Windows.Speech;using System.Collections.Generic;using System.Linq;
然後用一個Dictionary儲存需要進行語音辨識的關鍵字:
KeywordRecognizer keywordRecognizer;Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
添加任一字元串作為關鍵詞,並添加進字典(比如下面所示以activete作為關鍵詞):
//Create keywords for keyword recognizerkeywords.Add("activate", () =>{ // action to be performed when this keyword is spoken});
然後建立一個keywordRecogizer讓它作為識別:
keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
最後添加一個識別事件:
keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
舉一個例子:
private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args){ System.Action keywordAction; // if the keyword recognized is in our dictionary, call that Action. if (keywords.TryGetValue(args.text, out keywordAction)) { keywordAction.Invoke(); }}
啟動語音辨識:
keywordRecognizer.Start();
整體簡單案例如下所示:
using UnityEngine.Windows.Speech;using System.Collections.Generic;using System.Linq;using UnityEngine;/// <summary>/// Made By Bruce/// </summary>public class AudioCommond : MonoBehaviour{ KeywordRecognizer keywordRecognizer; Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>(); public GameObject cube; void Start() { var t = CoroutineWrapper.Inst; keywords.Add("MoveUp", () => { cube.transform.localPosition += new Vector3(0, 1, 0); }); keywords.Add("MoveDown", () => { cube.transform.localPosition += new Vector3(0, -1, 0); }); keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray()); keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized; //開始識別 keywordRecognizer.Start(); } private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args) { System.Action keywordAction; if (keywords.TryGetValue(args.text, out keywordAction)) { keywordAction.Invoke(); } }}
語言輸入——Dictation 所需命名空間——UnityEngine.Windows.Speech
使用DictationRecognizer將使用者的語音轉換為文本。DictationRecognizer公開了聽寫功能,並支援註冊和聆聽假設和短語完成的事件,因此您可以在發言和以後給您的使用者反饋。Start()和Stop()方法分別啟用和禁用聽寫識別。使用辨識器完成後,應使用Dispose()方法來釋放其使用的資源。如果垃圾收集之前沒有釋放,它將以額外的效能成本自動釋放這些資源。 開始使用錄音只需要幾個步驟: 建立一個新的DictationRecognizer 處理聽寫事件 啟動DictationRecognizer 啟用支援語言聽寫功能:
Unity——Edit——Project Settings——Capabilitees——勾選InternetClient選項
語音輸入——DictationRecognizer
建立一個DictationRecognizer,如下所示:
dictationRecognizer = new DictationRecognizer();
有四個聽寫事件可以被訂閱和處理以實施聽寫行為。 DictationResult DictationComplete DictationHypothesis DictationError DictationResult
使用者暫停之後,通常在句子結尾處觸發此事件。完整識別的字串在這裡返回。
註冊DictationResult事件:
dictationRecognizer.DictationResult + = DictationRecognizer_DictationResult;
然後處理其回調:
private void DictationRecognizer_DictationResult(string text,ConfidenceLevel confidence){ //do something} DictationHypothesis
這個事件在使用者正在說話時被持續觸發。當辨識器偵聽時,它提供了迄今為止所聽到的內容。 DictationComplete
無論從Stop()被調用,是否發生逾時或其他錯誤,辨識器將停止此事件。 DictationError
發生錯誤時觸發此事件。
提示
Start()和Stop()方法分別啟用和禁用聽寫識別。 使用辨識器完成後,必須使用Dispose()方法進行處理,以釋放其使用的資源。如果垃圾收集之前沒有釋放,它將以額外的效能成本自動釋放這些資源。 逾時發生在一段時間後。您可以在DictationComplete事件中檢查這些逾時。有兩個逾時要注意: 如果辨識器開始並且在前5秒鐘內沒有聽到任何音頻,它將逾時。 如果辨識器給出了一個結果,然後聽到靜音二十秒鐘,它將逾時。 使用短語識別和聽寫
如果你想在你的應用程式中同時使用短語識別和口授,你需要完全關閉一個,然後才能開始另一個。如果您有多個KeywordRecognizer運行,您可以一次關閉它們:
PhraseRecognitionSystem.Shutdown();
為了將所有辨識器恢複到之前的狀態,在DictationRecognizer停止之後,您可以調用:
PhraseRecognitionSystem.Restart();
您也可以啟動一個KeywordRecognizer,這將重新啟動PhraseRecognitionSystem。
簡單案例如下所示:
using UnityEngine;using UnityEngine.Windows.Speech;using UnityEngine.UI;public class AudioDiction : MonoBehaviour{ private DictationRecognizer dictationRecognizer; public Text showResultText; void Start() { dictationRecognizer = new DictationRecognizer(); //This event is fired after the user pauses, typically at the end of a sentence. The full recognized string is returned here. dictationRecognizer.DictationResult += DictationRecognizer_DictationResult; //This event is fired while the user is talking. As the recognizer listens, it provides text of what it‘s heard so far. dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis; //This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error. dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete; //This event is fired when an error occurs. dictationRecognizer.DictationError += DictationRecognizer_DictationError; //開始聽寫識別 dictationRecognizer.Start(); } private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence) { // 自訂行為 showResultText.text = text; } private void DictationRecognizer_DictationHypothesis(string text) { // 自訂行為 showResultText.text = text; } private void DictationRecognizer_DictationComplete(DictationCompletionCause cause) { // 自訂行為 showResultText.text = "Complete!"; } private void DictationRecognizer_DictationError(string error, int hresult) { // 自訂行為 } void OnDestroy() { //釋放資源 dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult; dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete; dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis; dictationRecognizer.DictationError -= DictationRecognizer_DictationError; dictationRecognizer.Dispose(); }}