Unity 中的語音輸入

警告

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

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

  • KeywordRecognizer 提供要接聽之字串命令陣列的應用程式
  • GrammarRecognizer 提供您的應用程式 SRGS 檔案,定義要接聽的特定文法
  • DictationRecognizer可讓您的應用程式接聽任何文字,並提供使用者語音的附注或其他顯示

注意

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

啟用語音的功能

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

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

片語辨識

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

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

KeywordRecognizer

Namespace:UnityEngine.Windows.Speech
Types: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

Namespace:UnityEngine.Windows.Speech
類型GrammarRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatus

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

然後處理聽寫完成回呼:

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 檢查這些逾時。 有兩個逾時需要注意:
    1. 如果辨識器開始,且前五秒未聽到任何音訊,則會逾時。
    2. 如果辨識器已指定結果,但會聽到無聲 20 秒,則會逾時。

同時使用片語辨識和聽寫

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

PhraseRecognitionSystem.Shutdown();

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

PhraseRecognitionSystem.Restart();

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

Mixed Reality工具組中的語音輸入

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

下一個開發檢查點

如果您遵循我們配置的 Unity 開發檢查點旅程,下一個工作是探索Mixed Reality平臺功能和 API:

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