共用方式為


Unity 中的語音輸入

注意

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

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

  • KeywordRecognizer 您的應用程式提供要接聽的字串命令陣列
  • GrammarRecognizer 為您的應用程式提供 SRGS 檔案,以定義要接聽的特定文法
  • DictationRecognizer 讓您的應用程式接聽任何字組,併為使用者提供筆記或其他語音顯示

注意事項

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

啟用 Voice 的功能

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

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

片語辨識

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

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

KeywordRecognizer

Namespace: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

Namespace: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();

聽寫

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
}

DictationHypothesis

當使用者交談時,會持續引發此事件。 當辨識器接聽時,它會提供目前為止所聽到內容的文字。

首先,訂閱 DictationHypothesis 事件:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

然後處理 DictationHypothesis 回呼:

private void DictationRecognizer_DictationHypothesis(string text)
{
    // do something
}

DictationComplete

此事件會在辨識器停止時引發,不論是從呼叫時停止 () 、發生逾時或其他錯誤。

首先,訂閱 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 秒,則會逾時。

同時使用片語辨識和聽寫

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

PhraseRecognitionSystem.Shutdown();

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

PhraseRecognitionSystem.Restart();

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

Mixed Reality 工具組中的語音輸入

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

下一個開發檢查點

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

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