Unity の音声入力

注意事項

開始する前に、Cognitive Speech Services SDK 用の Unity プラグインを使用することを検討してください。 このプラグインを使用すると、音声認識精度の結果が向上し、音声からテキストへのデコードに簡単にアクセスできるだけでなく、対話、インテントベースの会話、翻訳、テキストから音声への合成、自然言語の音声認識などの高度な音声機能も使用できます。 使用を開始するには、サンプルとドキュメントを確認してください。

Unity では、Unity アプリケーションに音声入力 を追加する 3 つの方法を公開しています。最初の 2 つは、PhraseRecognizer の種類です。

  • KeywordRecognizer は、リッスンする文字列コマンドの配列をアプリに提供します
  • GrammarRecognizer は、リッスンする特定の文法を定義する SRGS ファイルをアプリに提供します
  • DictationRecognizer を使用すると、アプリで任意の単語をリッスンし、ユーザーにメモやその他の音声表示を提供できます

Note

ディクテーションとフレーズ認識を同時に処理することはできません。 GrammarRecognizer または KeywordRecognizer がアクティブな場合、DictationRecognizer をアクティブにすることはできません。その逆も同様です。

音声機能の有効化

アプリで音声入力を使用するには、マイク機能を宣言する必要があります。

  1. Unity Editor で、[編集] > [プロジェクト設定] > [プレーヤー] の順に移動します
  2. [Windows Store] タブを選択します
  3. [プロジェクト設定] > [機能] セクションで、[マイク] 機能をオンにします
  4. HoloLens デバイスでマイクにアクセスするためのアクセス許可をアプリに付与します
    • デバイスの起動時にこれを行うように求められますが、誤って [いいえ] をクリックすると、デバイス設定のアクセス許可が変更される可能性があります

フレーズ認識

ユーザーが話す特定のフレーズをアプリでリッスンし、何らかのアクションを実行できるようにするには、次の手順を行う必要があります。

  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

GrammarRecognizer は、SRGS を使用して認識文法を指定する場合に使用されます。 これは、アプリにかなりの数のキーワードがある場合、より複雑なフレーズを認識したい場合、またはコマンドのセットを簡単にオンまたはオフにしたい場合に役立ちます。 ファイル形式については、「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 Editor で、[編集] > [プロジェクト設定] > [プレーヤー] の順に移動します
  2. [Windows Store] タブを選択します
  3. [プロジェクト設定] > [機能] セクションで、[インターネット クライアント] 機能をオンにします
    • (省略可能) マイクをまだ有効にしていない場合は、[マイク] 機能をオンにします
  4. まだ付与していない場合は、HoloLens デバイスでマイクにアクセスするためのアクセス許可をアプリに付与します
    • デバイスの起動時にこれを行うように求められますが、誤って [いいえ] をクリックすると、デバイス設定のアクセス許可が変更される可能性があります

DictationRecognizer

次のような DictationRecognizer を作成します。

dictationRecognizer = new DictationRecognizer();

ディクテーション動作を実装するためにサブスクライブおよび処理できる 4 つのディクテーション イベントがあります。

  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

このイベントは、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 イベントで確認できます。 注意すべき 2 つのタイムアウトがあります。
    1. 認識エンジンを起動しても、最初の 5 秒間音声が聞こえない場合は、タイムアウトになります。
    2. 認識エンジンが結果を提供した後、20 秒間何も聞こえない場合は、タイムアウトになります。

フレーズ認識とディクテーションの両方の使用

アプリでフレーズ認識とディクテーションの両方を使用する場合、一方を完全にシャットダウンしてから、もう一方を開始する必要があります。 複数の KeywordRecognizers を実行している場合は、次の方法でそれらすべてを一度にシャットダウンできます。

PhraseRecognitionSystem.Shutdown();

DictationRecognizer が停止した後、Restart() を呼び出して、すべての認識エンジンを以前の状態に復元できます。

PhraseRecognitionSystem.Restart();

また、KeywordRecognizer を起動するだけで、PhraseRecognitionSystem も再起動できます。

Mixed Reality ツールキットでの音声入力

次のデモ シーンでは、音声入力の MRTK の例を確認できます。

次の開発チェックポイント

私たちが用意した Unity 開発チェックポイント体験に従っている場合、次のタスクは、Mixed Reality プラットフォームの機能と API の探索です。

いつでも Unity 開発チェックポイントに戻ることができます。