Unity での音声入力Voice input in Unity

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

KeywordRecognizer (2 種類の PhraseRecognizers のいずれか) では、アプリには、リッスンする文字列コマンドの配列を指定できます。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 エディターで、[Edit > Project Settings > Player] の順に移動して、windows media player の設定に移動します。In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player"
  2. [Windows ストア] タブをクリックします。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
種類: KeywordRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatusTypes: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

一部のキーストロークを保存するには、いくつかの using ステートメントが必要です。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). この例では、"activate" キーワードを追加しています。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

GrammarRecognizer は、SRGS を使用して認識文法を指定する場合に使用します。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. DictationRecognizer を開始するStart 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 エディターで、[Edit > Project Settings > Player] ページに移動して、windows media player の設定に移動します。In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player" page
  2. [Windows ストア] タブをクリックします。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

このイベントは、レコグナイザー () が呼び出されているか、タイムアウトが発生したか、またはその他のエラーが発生した場合に、レコグナイザーが停止したときに発生します。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 の Mixed Reality Toolkit には、システムに使用可能なマイクがある場合に開発者にヒントを表示するマイクヘルパークラスが含まれています。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つは、システム上にマイクがあるかどうかを確認してから、アプリケーションで音声操作のヒントを表示することです。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.

混合 Reality ツールキットでの音声入力Voice input in Mixed Reality Toolkit

このシーンでは、音声入力の例を確認できます。You can find the examples of the voice input in this scene.