Unity での音声入力Voice input in Unity

Unity を追加する 3 つの方法を公開する音声入力Unity アプリケーションにします。Unity exposes three ways to add Voice input to your Unity application.

(PhraseRecognizers の 2 つの種類のいずれか) KeywordRecognizer、リッスンするようにコマンドを文字列の配列が指定することができますが、アプリ。With the KeywordRecognizer (one of two types of PhraseRecognizers), your app can be given an array of string commands to listen for. GrammarRecognizer (その他の種類 PhraseRecognizer) では、リッスンするように特定の文法を定義する、SRGS ファイルが指定することができますが、アプリ。With the GrammarRecognizer (the other type of PhraseRecognizer), your app can be given an SRGS file defining a specific grammar to listen for. DictationRecognizer では、アプリは任意の単語をリッスンし、またはその他の表示、音声を使用して、ユーザーを提供します。With the DictationRecognizer, your app can listen for any word and provide the user with a note or other display of their speech.

注意

ディクテーションまたはフレーズ認識だけを一度に処理できます。Only dictation or phrase recognition can be handled at once. GrammarRecognizer または KeywordRecognizer がアクティブな場合、DictationRecognizer しないアクティブにできることを意味し、その逆です。That means if a GrammarRecognizer or KeywordRecognizer is active, a DictationRecognizer can not be active and vice versa.

音声の機能を有効にします。Enabling the capability for Voice

マイク音声入力を活用するアプリの機能を宣言する必要があります。The Microphone capability must be declared for an app to leverage Voice input.

  1. Unity エディターは、「> プロジェクトの設定 > プレーヤーの編集」に移動して、player の設定に移動します。In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player"
  2. "Windows Store" タブをクリックします。Click on the "Windows Store" tab
  3. 「発行の設定 > 機能」セクションでは、確認、マイク機能In the "Publishing Settings > Capabilities" section, check the Microphone capability

フレーズ認識Phrase Recognition

特定のリッスンするようにアプリを有効にするには、アクションを実行し、ユーザーが音声フレーズをする必要があります。To enable your app to listen for specific phrases spoken by the user then take some action, you need to:

  1. KeywordRecognizer または GrammarRecognizer を使用してリッスンするには、どのフレーズを指定します。Specify which phrases to listen for using a KeywordRecognizer or GrammarRecognizer
  2. OnPhraseRecognized イベントを処理し、認識される語句に対応するアクションを実行Handle the OnPhraseRecognized event and take action corresponding to the phrase recognized

KeywordRecognizerKeywordRecognizer

名前空間: UnityEngine.Windows.SpeechNamespace: UnityEngine.Windows.Speech
種類: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatusTypes: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

させていただきます。 いくつかのステートメントを使用して、一部のキー操作を保存します。We'll need a few using statements to save some keystrokes:

using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;

認識エンジンとキーワードを格納するクラスにいくつかのフィールドがアクションのディクショナリを -> を追加してみましょう。Then let's add a few fields to your class to store the recognizer and keyword->action dictionary:

KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

(例: Start() メソッド) の内部辞書にキーワードを追加します。Now add a keyword to the dictionary (e.g. inside of a Start() method). この例では「アクティブ」キーワードを追加します。We're adding the "activate" keyword in this example:

//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
    // action to be performed when this keyword is spoken
});

キーワード認識エンジンを作成しを認識することを確認します。Create the keyword recognizer and tell it what we want to recognize:

keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

OnPhraseRecognized イベントに登録されましたNow register for the OnPhraseRecognized event

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

ハンドラーの例を示します。An example handler is:

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();
    }
}

最後に、開始を認識します。Finally, start recognizing!

keywordRecognizer.Start();

GrammarRecognizerGrammarRecognizer

名前空間: UnityEngine.Windows.SpeechNamespace: UnityEngine.Windows.Speech
:GrammarRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatusTypes: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

SRGS を使用して、認識文法を指定している場合、GrammarRecognizer が使用されます。The GrammarRecognizer is used if you're specifying your recognition grammar using SRGS. 複雑なフレーズを認識する場合、アプリがより多くのキーワードがある場合、またはオンとオフのコマンド セットを簡単に有効にする場合は便利にできます。This can be useful if your app has more than just a few keywords, if you want to recognize more complex phrases, or if you want to easily turn on and off sets of commands. 参照トピック文法を使用して SRGS XML 作成ファイル形式の情報。See: Create Grammars Using SRGS XML for file format information.

SRGS 文法とプロジェクトでは、 StreamingAssets フォルダー:Once you have your SRGS grammar, and it is in your project in a StreamingAssets folder:

<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml

GrammarRecognizer を作成し、SRGS ファイルへのパスを渡します。Create a GrammarRecognizer and pass it the path to your SRGS file:

private GrammarRecognizer grammarRecognizer;
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");

OnPhraseRecognized イベントに登録されましたNow register for the OnPhraseRecognized event

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

適切に処理できる、SRGS 文法で指定された情報を格納しているコールバックが表示されます。You will get a callback containing information specified in your SRGS grammar which you can handle appropriately. 重要な情報のほとんどは、semanticMeanings 配列で提供されます。Most of the important information will be provided in the semanticMeanings array.

private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    SemanticMeaning[] meanings = args.semanticMeanings;
    // do something
}

最後に、開始を認識します。Finally, start recognizing!

grammarRecognizer.Start();

ディクテーションDictation

名前空間: UnityEngine.Windows.SpeechNamespace: UnityEngine.Windows.Speech
:DictationRecognizerSpeechErrorSpeechSystemStatusTypes: DictationRecognizer, SpeechError, SpeechSystemStatus

ユーザーの音声をテキストに変換するのに、DictationRecognizer を使用します。Use the DictationRecognizer to convert the user's speech to text. DictationRecognizer 公開ディクテーション機能とサポートを登録して、仮説と語句をリッスンしているため、それらを話すときに、ユーザーにフィードバックを提供することができます、イベントを完了し、その後です。The DictationRecognizer exposes dictation functionality and supports registering and listening for hypothesis and phrase completed events, so you can give feedback to your user both while they speak and afterwards. Start() と Stop() メソッドはそれぞれを有効にして、ディクテーション認識を無効にします。Start() and Stop() methods respectively enable and disable dictation recognition. 完了すると、認識エンジンで、これは破棄されなければなりません Dispose() メソッドを使用して、使用するリソースを解放します。Once done with the recognizer, it should be disposed using Dispose() method to release the resources it uses. リリースこれらのリソースに自動的に追加のパフォーマンス コストでガベージ コレクション中に場合より前は解放されません。It will release these resources automatically during garbage collection at an additional performance cost if they are not released prior to that.

ディクテーション モードを開始するために必要ないくつかの手順のみがあります。There are only a few steps needed to get started with dictation:

  1. 新しい DictationRecognizer を作成します。Create a new DictationRecognizer
  2. 音声入力イベントの処理Handle Dictation events
  3. 開始、DictationRecognizerStart the DictationRecognizer

ディクテーションの機能を有効にします。Enabling the capability for dictation

ディクテーションを活用するアプリの上記のように「マイク」機能のほかに、「インターネット クライアント」機能を宣言する必要があります。The "Internet Client" capability, in addition to the "Microphone" capability mentioned above, must be declared for an app to leverage dictation.

  1. Unity エディターは、「> プロジェクトの設定 > プレーヤーの編集」のページに移動して、player の設定に移動します。In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player" page
  2. "Windows Store" タブをクリックします。Click on the "Windows Store" tab
  3. 「発行の設定 > 機能」セクションでは、確認、 InternetClient機能In the "Publishing Settings > Capabilities" section, check the InternetClient capability

DictationRecognizerDictationRecognizer

作成、DictationRecognizer ようになります。Create a DictationRecognizer like so:

dictationRecognizer = new DictationRecognizer();

サブスクライブしているディクテーションの動作を実装するために処理できる 4 つの音声入力イベントがあります。There are four dictation events that can be subscribed to and handled to implement dictation behavior.

  1. DictationResultDictationResult
  2. DictationCompleteDictationComplete
  3. DictationHypothesisDictationHypothesis
  4. DictationErrorDictationError

DictationResultDictationResult

このイベントは、ユーザーの後に発生が一時停止した通常文の最後にします。This event is fired after the user pauses, typically at the end of a sentence. 完全な認識、ここでは文字列が返されます。The full recognized string is returned here.

まず、DictationResult イベントにサブスクライブします。First, subscribe to the DictationResult event:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

DictationResult コールバックを処理します。Then handle the DictationResult callback:

private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
    // do something
}

DictationHypothesisDictationHypothesis

このイベントは、ユーザーが対話中に継続的に発生します。This event is fired continuously while the user is talking. 認識エンジンがリッスンするよう、対象のテキストを提供します。 これまでに聞いたこと。As the recognizer listens, it provides text of what it's heard so far.

まず、DictationHypothesis イベントにサブスクライブします。First, subscribe to the DictationHypothesis event:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

DictationHypothesis コールバックを処理します。Then handle the DictationHypothesis callback:

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

DictationCompleteDictationComplete

このイベントには、Stop()、タイムアウトが発生している場合、またはその他のエラーは、呼び出されるかどうかを認識エンジンが停止したらが発生します。This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error.

まず、DictationComplete イベントにサブスクライブします。First, subscribe to the DictationComplete event:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

DictationComplete コールバックを処理します。Then handle the DictationComplete callback:

private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
   // do something
}

DictationErrorDictationError

このイベントは、エラーが発生したときに発生します。This event is fired when an error occurs.

まず、DictationError イベントにサブスクライブします。First, subscribe to the DictationError event:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

DictationError コールバックを処理します。Then handle the DictationError callback:

private void DictationRecognizer_DictationError(string error, int hresult)
{
    // do something
}

サブスクライブして、関心のあるディクテーション イベントを処理すると、イベントの受信を開始するディクテーション認識エンジンを起動します。Once you have subscribed and handled the dictation events that you care about, start the dictation recognizer to begin receiving events.

dictationRecognizer.Start();

周り DictationRecognizer を保持する必要がなくなった場合は、イベント サブスクリプションを解除し、DictationRecognizer を破棄する必要があります。If you no longer want to keep the DictationRecognizer around, you need to unsubscribe from the events and Dispose the DictationRecognizer.

dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();

ヒントTips

  • Start() と Stop() メソッドはそれぞれを有効にして、ディクテーション認識を無効にします。Start() and Stop() methods respectively enable and disable dictation recognition.
  • 完了すると、認識エンジンで、使用するリソースを解放する Dispose() メソッドを使用してで破棄されたします。Once done with the recognizer, it must be disposed using Dispose() method to release the resources it uses. リリースこれらのリソースに自動的に追加のパフォーマンス コストでガベージ コレクション中に場合より前は解放されません。It will release these resources automatically during garbage collection at an additional performance cost if they are not released prior to that.
  • タイムアウトは、一定期間の後に発生します。Timeouts occur after a set period of time. これらのタイムアウト DictationComplete イベントで確認できます。You can check for these timeouts in the DictationComplete event. 注意すべき 2 つのタイムアウトがあります。There are two timeouts to be aware of:
    1. 認識エンジンが起動し、最初の 5 秒間のオーディオの声が場合、タイムアウトになります。If the recognizer starts and doesn't hear any audio for the first five seconds, it will timeout.
    2. 認識エンジンが指定の結果を 20 秒の無音が場合がタイムアウトになります。If the recognizer has given a result but then hears silence for twenty seconds, it will timeout.

フレーズ認識とディクテーションの両方を使用Using both Phrase Recognition and Dictation

フレーズ認識とディクテーションの両方をアプリで使用する場合は、完全に 1 つ前にシャット ダウン、もう一方を開始する必要があります。If you want to use both phrase recognition and dictation in your app, you'll need to fully shut one down before you can start the other. 複数の KeywordRecognizers 実行した場合で停止できますそれらすべて一度にで。If you have multiple KeywordRecognizers running, you can shut them all down at once with:

PhraseRecognitionSystem.Shutdown();

DictationRecognizer が停止した後は、以前の状態にすべての認識機能を復元するために呼び出すことができます。In order to restore all recognizers to their previous state, after the DictationRecognizer has stopped, you can call:

PhraseRecognitionSystem.Restart();

また、KeywordRecognizer も PhraseRecognitionSystem を再起動するだけでも開始でした。You could also just start a KeywordRecognizer, which will restart the PhraseRecognitionSystem as well.

マイク ヘルパーの使用Using the microphone helper

GitHub の混合実際にはツールキットには、マイクのヘルパー クラスに、システムで使用可能なマイクがある場合は、開発者にヒントが含まれています。The Mixed Reality Toolkit on GitHub contains a microphone helper class to hint at developers if there is a usable microphone on the system. その用途の 1 つは、場所がマイク システムで、アプリケーションで、音声の対話のヒントを表示する前にする 1 つです。One use for it is where one would want to check if there is microphone on system before showing any speech interaction hints in the application.

マイクのヘルパー スクリプトが記載されて、入力、スクリプト、およびユーティリティ フォルダーします。The microphone helper script can be found in the Input/Scripts/Utilities folder. GitHub リポジトリにも含まれています、小さなサンプルヘルパーを使用する方法について説明します。The GitHub repo also contains a small sample demonstrating how to use the helper.

Mixed Reality toolkit の音声入力Voice input in Mixed Reality Toolkit

このシーンでは、音声入力の例が見つかります。You can find the examples of the voice input in this scene.