Unity 中的語音輸入
警告
開始之前,請考慮使用適用于認知語音服務 SDK 的 Unity 外掛程式。 外掛程式具有更佳的語音精確度結果,並可輕鬆存取語音轉換文字解碼,以及對話、意圖型互動、翻譯、文字到語音合成和自然語言語音辨識等進階語音功能。 若要開始使用,請參閱 範例和檔。
Unity 公開三種方式可將 語音輸入 新增至 Unity 應用程式,前兩種方式是 PhraseRecognizer 的類型:
- 會
KeywordRecognizer
提供要接聽之字串命令陣列的應用程式 - 會
GrammarRecognizer
提供您的應用程式 SRGS 檔案,定義要接聽的特定文法 DictationRecognizer
可讓您的應用程式接聽任何文字,並提供使用者語音的附注或其他顯示
注意
聽寫和片語辨識無法同時處理。 如果 GrammarRecognizer 或 KeywordRecognizer 為作用中,則 DictationRecognizer 無法作用中,反之亦然。
啟用語音的功能
必須宣告麥克風功能,應用程式才能使用語音輸入。
- 在 Unity 編輯器中,流覽至[編輯專案設定 > 播放機] >
- 選取 [Windows 市集] 索引標籤
- 在 [ 發佈設定 > 功能 ] 區段中,檢查 麥克風 功能
- 將許可權授與應用程式,以存取 HoloLens 裝置上的麥克風
- 系統會要求您在裝置啟動時執行此動作,但如果您不小心按一下 [否],您可以在裝置設定中變更許可權
片語辨識
若要讓您的 app 接聽使用者所說的特定片語,然後採取一些動作,您需要:
- 指定要使用
KeywordRecognizer
或 接聽的片語GrammarRecognizer
OnPhraseRecognized
處理事件並採取對應至辨識片語的動作
KeywordRecognizer
Namespace:UnityEngine.Windows.Speech
Types: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
Namespace:UnityEngine.Windows.Speech
類型: GrammarRecognizer、 PhraseRecognizedEventArgs、 SpeechError、 SpeechSystemStatus
如果您使用 SRGS 指定辨識文法,則會使用 GrammarRecognizer。 如果您的 app 有多個關鍵字、想要辨識更複雜的片語,或想要輕鬆地開啟和關閉命令集,這非常有用。 請參閱: 使用 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();
聽寫
Namespace: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;
然後處理聽寫完成回呼:
private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
// do something
}
聽寫Error
發生錯誤時,就會引發此事件。
首先,訂閱 DictationError
事件:
dictationRecognizer.DictationError += DictationRecognizer_DictationError;
然後處理聽寫Error 回呼:
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();
您可以在 Restart()
DictationRecognizer 停止之後呼叫 ,將所有辨識器還原至先前的狀態:
PhraseRecognitionSystem.Restart();
您也可以只啟動 KeywordRecognizer,這會重新開機 PhraseRecognitionSystem。
Mixed Reality工具組中的語音輸入
您可以在下列示範場景中找到語音輸入的 MRTK 範例:
下一個開發檢查點
如果您遵循我們配置的 Unity 開發檢查點旅程,下一個工作是探索Mixed Reality平臺功能和 API:
您可以隨時回到 Unity 開發檢查點。