共用方式為


Unity 中的語音輸入

警告

開始之前,請考慮使用適用於認知語音服務 SDK 的 Unity 外掛程式。 外掛程式具有更佳的語音精確度結果,以及輕鬆存取語音轉換文字譯碼,以及對話、意圖型互動、翻譯、文字到語音轉換合成和自然語言語音辨識等進階語音功能。 若要開始使用,請參閱 範例和檔

Unity 會公開三種方式,將語音輸入新增至 Unity 應用程式,前兩種是 PhraseRecognizer 類型:

  • KeywordRecognizer 提供您的應用程式,其中包含要接聽的字串命令陣列
  • GrammarRecognizer提供您的應用程式一個SS檔案,定義要接聽的特定文法
  • 可讓您 DictationRecognizer 的應用程式接聽任何單字,並提供使用者的語音筆記或其他顯示

注意

聽寫和片語辨識無法同時處理。 如果 GrammarRecognizer 或 KeywordRecognizer 為使用中,DictationRecognizer 就無法使用,反之亦然。

啟用語音的功能

必須宣告麥克風功能,應用程式才能使用語音輸入。

  1. 在 Unity 編輯器中,流覽至 [ 編輯 > 專案設定 > 播放機]
  2. 選取 [Windows 市集] 索引標籤
  3. 在 [ 發佈設定 > 功能] 區段中,檢查 麥克風 功能
  4. 在 HoloLens 裝置上將麥克風存取權授與應用程式
    • 系統會要求您在裝置啟動時執行此動作,但如果您不小心按兩下 [否],您可以在裝置設定中變更許可權

片語辨識

若要讓您的 app 接聽使用者所說的特定片語,然後採取一些動作,您需要:

  1. 指定要使用 KeywordRecognizer 或 接聽的片語 GrammarRecognizer
  2. 處理事件並 OnPhraseRecognized 採取對應至辨識詞組的動作

KeywordRecognizer

命名空間:UnityEngine.Windows.Speech
類型:KeywordRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatus

我們需要一些 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
類型GrammarRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatus

如果您使用 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
類型DictationRecognizerSpeechErrorSpeechSystemStatus

DictationRecognizer使用將使用者的語音轉換成文字。 DictationRecognizer 會 公開聽寫 功能,並支援註冊和接聽假設和片語已完成事件,因此您可以在使用者說話和之後提供意見反應。 Start()Stop() 方法分別啟用和停用聽寫辨識。 使用辨識器完成之後,應該使用 Dispose() 來處置它所使用的資源。 它會在垃圾收集期間自動釋放這些資源,如果資源之前未釋出,則會以額外的效能成本釋放這些資源。

只需要幾個步驟才能開始使用聽寫:

  1. 建立新的 DictationRecognizer
  2. 處理聽寫事件
  3. 啟動 DictationRecognizer

啟用聽寫的功能

必須宣告因特網用戶端麥克風功能,應用程式才能使用聽寫:

  1. 在 Unity 編輯器中,移至 [ 編輯 > 專案設定 > 播放機]
  2. [Windows 市集] 索引標籤 上選取
  3. 在 [ 發佈設定 > 功能 ] 區段中,檢查 InternetClient 功能
    • 或者,如果您尚未啟用麥克風,請檢查 麥克風 功能
  4. 如果您尚未在 HoloLens 裝置上將麥克風存取權授與應用程式
    • 系統會要求您在裝置啟動時執行此動作,但如果您不小心按兩下 [否],您可以在裝置設定中變更許可權

DictationRecognizer

建立 DictationRecognizer,如下所示:

dictationRecognizer = new DictationRecognizer();

有四個聽寫事件可以訂閱和處理,以實作聽寫行為。

  1. DictationResult
  2. DictationComplete
  3. DictationHypothesis
  4. 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 檢查這些逾時。 有兩個逾時需要注意:
    1. 如果辨識器在前五秒開始且未聽到任何音訊,則會逾時。
    2. 如果辨識器已經給出結果,但會聽到沉默 20 秒,它會逾時。

同時使用片語辨識和聽寫

如果您想要在應用程式中同時使用片語辨識和聽寫,您必須先完全關閉一個片語,才能啟動另一個片語。 如果您有多個 KeywordRecognizers 正在執行,您可以使用下列專案一次將其全部關機:

PhraseRecognitionSystem.Shutdown();

您可以在 DictationRecognizer 停止之後呼叫 Restart() ,將所有辨識器還原到其先前的狀態:

PhraseRecognitionSystem.Restart();

您也可以只啟動 KeywordRecognizer,這會重新啟動 PhraseRecognitionSystem。

混合實境工具組中的語音輸入

您可以在下列示範場景中找到語音輸入的 MRTK 範例:

下一個開發檢查點

如果您遵循我們提出的 Unity 開發檢查點旅程,下一個工作是探索混合實境平臺功能和 API:

您可以隨時回到 Unity 開發檢查點