Unity 中的語音輸入
警告
開始之前,請考慮使用適用於認知語音服務 SDK 的 Unity 外掛程式。 外掛程式具有更佳的語音精確度結果,以及輕鬆存取語音轉換文字譯碼,以及對話、意圖型互動、翻譯、文字到語音轉換合成和自然語言語音辨識等進階語音功能。 若要開始使用,請參閱 範例和檔。
Unity 會公開三種方式,將語音輸入新增至 Unity 應用程式,前兩種是 PhraseRecognizer 類型:
- 會
KeywordRecognizer
提供您的應用程式,其中包含要接聽的字串命令陣列 GrammarRecognizer
提供您的應用程式一個SS檔案,定義要接聽的特定文法- 可讓您
DictationRecognizer
的應用程式接聽任何單字,並提供使用者的語音筆記或其他顯示
注意
聽寫和片語辨識無法同時處理。 如果 GrammarRecognizer 或 KeywordRecognizer 為使用中,DictationRecognizer 就無法使用,反之亦然。
啟用語音的功能
必須宣告麥克風功能,應用程式才能使用語音輸入。
- 在 Unity 編輯器中,流覽至 [ 編輯 > 專案設定 > 播放機]
- 選取 [Windows 市集] 索引標籤
- 在 [ 發佈設定 > 功能] 區段中,檢查 麥克風 功能
- 在 HoloLens 裝置上將麥克風存取權授與應用程式
- 系統會要求您在裝置啟動時執行此動作,但如果您不小心按兩下 [否],您可以在裝置設定中變更許可權
片語辨識
若要讓您的 app 接聽使用者所說的特定片語,然後採取一些動作,您需要:
- 指定要使用
KeywordRecognizer
或 接聽的片語GrammarRecognizer
- 處理事件並
OnPhraseRecognized
採取對應至辨識詞組的動作
KeywordRecognizer
命名空間:UnityEngine.Windows.Speech
類型:KeywordRecognizer、PhraseRecognizedEventArgs、SpeechError、SpeechSystemStatus
我們需要一些 using 語句來儲存一些擊鍵:
using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;
然後,讓我們將幾個欄位新增至類別,以儲存辨識器和關鍵詞>動作字典:
KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
現在,將 關鍵詞新增至字典,例如 在方法中 Start()
。 我們會在此範例中新增 「activate」 關鍵詞:
//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
// action to be performed when this keyword is spoken
});
建立關鍵詞辨識器,並告知我們想要辨識的內容:
keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
現在註冊 OnPhraseRecognized
事件
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();
GrammarRecognizer
命名空間:UnityEngine.Windows.Speech
類型: GrammarRecognizer、 PhraseRecognizedEventArgs、 SpeechError、 SpeechSystemStatus
如果您使用 SRGS 指定辨識文法,則會使用 GrammarRecognizer。 如果您的應用程式只有一些關鍵詞、想要辨識更複雜的片語,或是想要輕鬆開啟和關閉命令集,這非常有用。 請參閱: 使用 SRGS XML 建立文法以取得檔案格式資訊。
一旦您擁有 SRGS 文法,且它位於 StreamingAssets 資料夾中的專案中:
<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml
GrammarRecognizer
建立 ,並將路徑傳遞至您的 SRGS 檔案:
private GrammarRecognizer grammarRecognizer;
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");
現在註冊 OnPhraseRecognized
事件
grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;
您會收到回呼,其中包含 SRGS 文法中指定的資訊,您可以適當處理。 陣列中會提供 semanticMeanings
大部分重要資訊。
private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
SemanticMeaning[] meanings = args.semanticMeanings;
// do something
}
最後,開始辨識!
grammarRecognizer.Start();
聽寫
命名空間:UnityEngine.Windows.Speech
類型: DictationRecognizer、 SpeechError、 SpeechSystemStatus
DictationRecognizer
使用將使用者的語音轉換成文字。 DictationRecognizer 會 公開聽寫 功能,並支援註冊和接聽假設和片語已完成事件,因此您可以在使用者說話和之後提供意見反應。 Start()
和 Stop()
方法分別啟用和停用聽寫辨識。 使用辨識器完成之後,應該使用 Dispose()
來處置它所使用的資源。 它會在垃圾收集期間自動釋放這些資源,如果資源之前未釋出,則會以額外的效能成本釋放這些資源。
只需要幾個步驟才能開始使用聽寫:
- 建立新的
DictationRecognizer
- 處理聽寫事件
- 啟動 DictationRecognizer
啟用聽寫的功能
必須宣告因特網用戶端和麥克風功能,應用程式才能使用聽寫:
- 在 Unity 編輯器中,移至 [ 編輯 > 專案設定 > 播放機]
- 在 [Windows 市集] 索引標籤 上選取
- 在 [ 發佈設定 > 功能 ] 區段中,檢查 InternetClient 功能
- 或者,如果您尚未啟用麥克風,請檢查 麥克風 功能
- 如果您尚未在 HoloLens 裝置上將麥克風存取權授與應用程式
- 系統會要求您在裝置啟動時執行此動作,但如果您不小心按兩下 [否],您可以在裝置設定中變更許可權
DictationRecognizer
建立 DictationRecognizer,如下所示:
dictationRecognizer = new DictationRecognizer();
有四個聽寫事件可以訂閱和處理,以實作聽寫行為。
DictationResult
DictationComplete
DictationHypothesis
DictationError
DictationResult
此事件會在使用者暫停之後引發,通常是在句子結尾。 這裡會傳回完整辨識的字串。
首先,訂閱 DictationResult
事件:
dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
然後處理 DictationResult 回呼:
private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
// do something
}
聽寫Hypothesis
當使用者交談時,會持續引發此事件。 當辨識器接聽時,它會提供到目前為止所聽到內容的文字。
首先,訂閱 DictationHypothesis
事件:
dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;
然後處理聽寫Hypothesis 回呼:
private void DictationRecognizer_DictationHypothesis(string text)
{
// do something
}
DictationComplete
當辨識器停止、呼叫 Stop() 時、發生逾時或其他錯誤時,就會引發此事件。
首先,訂閱 DictationComplete
事件:
dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;
然後處理 DictationComplete 回呼:
private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
// do something
}
DictationError
發生錯誤時會引發此事件。
首先,訂閱 DictationError
事件:
dictationRecognizer.DictationError += DictationRecognizer_DictationError;
然後處理 DictationError 回呼:
private void DictationRecognizer_DictationError(string error, int hresult)
{
// do something
}
一旦您訂閱並處理您關心的聽寫事件,請啟動聽寫辨識器開始接收事件。
dictationRecognizer.Start();
如果您不再想要保留 DictationRecognizer,您需要取消訂閱事件並處置 DictationRecognizer。
dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();
提示
Start()
和Stop()
方法分別啟用和停用聽寫辨識。- 使用辨識器完成之後,必須使用 來處置
Dispose()
它用來釋放其使用的資源。 它會在垃圾收集期間自動釋放這些資源,如果資源之前未釋出,則會以額外的效能成本釋放這些資源。 - 逾時會在一段設定的時間之後發生。 您可以在 事件中
DictationComplete
檢查這些逾時。 有兩個逾時需要注意:- 如果辨識器在前五秒開始且未聽到任何音訊,則會逾時。
- 如果辨識器已經給出結果,但會聽到沉默 20 秒,它會逾時。
同時使用片語辨識和聽寫
如果您想要在應用程式中同時使用片語辨識和聽寫,您必須先完全關閉一個片語,才能啟動另一個片語。 如果您有多個 KeywordRecognizers 正在執行,您可以使用下列專案一次將其全部關機:
PhraseRecognitionSystem.Shutdown();
您可以在 DictationRecognizer 停止之後呼叫 Restart()
,將所有辨識器還原到其先前的狀態:
PhraseRecognitionSystem.Restart();
您也可以只啟動 KeywordRecognizer,這會重新啟動 PhraseRecognitionSystem。
混合實境工具組中的語音輸入
您可以在下列示範場景中找到語音輸入的 MRTK 範例:
下一個開發檢查點
如果您遵循我們提出的 Unity 開發檢查點旅程,下一個工作是探索混合實境平臺功能和 API:
您可以隨時回到 Unity 開發檢查點。