Unity の音声入力
注意事項
開始する前に、Cognitive Speech Services SDK 用の Unity プラグインを使用することを検討してください。 このプラグインを使用すると、音声認識精度の結果が向上し、音声からテキストへのデコードに簡単にアクセスできるだけでなく、対話、インテントベースの会話、翻訳、テキストから音声への合成、自然言語の音声認識などの高度な音声機能も使用できます。 使用を開始するには、サンプルとドキュメントを確認してください。
Unity では、Unity アプリケーションに音声入力 を追加する 3 つの方法を公開しています。最初の 2 つは、PhraseRecognizer の種類です。
KeywordRecognizer
は、リッスンする文字列コマンドの配列をアプリに提供しますGrammarRecognizer
は、リッスンする特定の文法を定義する SRGS ファイルをアプリに提供しますDictationRecognizer
を使用すると、アプリで任意の単語をリッスンし、ユーザーにメモやその他の音声表示を提供できます
Note
ディクテーションとフレーズ認識を同時に処理することはできません。 GrammarRecognizer または KeywordRecognizer がアクティブな場合、DictationRecognizer をアクティブにすることはできません。その逆も同様です。
音声機能の有効化
アプリで音声入力を使用するには、マイク機能を宣言する必要があります。
- Unity Editor で、[編集] > [プロジェクト設定] > [プレーヤー] の順に移動します
- [Windows Store] タブを選択します
- [プロジェクト設定] > [機能] セクションで、[マイク] 機能をオンにします
- HoloLens デバイスでマイクアクセスするためのアクセス許可をアプリに付与する
- デバイスの起動時にこれを行うように求められますが、誤って [いいえ] をクリックすると、デバイス設定のアクセス許可が変更される可能性があります
フレーズ認識
ユーザーが話す特定のフレーズをアプリでリッスンし、何らかのアクションを実行できるようにするには、次の手順を行う必要があります。
KeywordRecognizer
またはGrammarRecognizer
を使用して、リッスンするフレーズを指定しますOnPhraseRecognized
イベントを処理し、認識されたフレーズに対応するアクションを実行します
KeywordRecognizer
Namespace: UnityEngine.Windows.Speech
Types: KeywordRecognizer、 PhraseRecognizedEventArgs、 SpeechError、 SpeechSystemStatus
いくつかのキーストロークを保存するには、いくつかの 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
種類: GrammarRecognizer、PhraseRecognizedEventArgs、SpeechError、SpeechSystemStatus
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();
ディクテーション
Namespace: UnityEngine.Windows.Speech
種類: DictationRecognizer、SpeechError、SpeechSystemStatus
DictationRecognizer
を使用して、ユーザーの音声をテキストに変換します。 DictationRecognizer により、ディクテーション機能が公開され、仮説とフレーズ完了イベントの登録とリッスンがサポートされるため、ユーザーの発話中およびその後の両方でフィードバックを提供できます。 Start()
および Stop()
メソッドはそれぞれ、ディクテーション認識を有効および無効にします。 認識エンジンでの処理が完了したら、使用されているリソースを解放するために、Dispose()
を使用して破棄する必要があります。 これらのリソースは、ガベージ コレクション中に自動的に解放されますが、それ以前に解放されない場合は、追加のパフォーマンス コストがかかります。
ディクテーションを開始するために必要な手順はわずかです。
- 新しい
DictationRecognizer
を作成します - ディクテーション イベントを処理します
- DictationRecognizer を起動します
ディクテーション機能の有効化
アプリでディクテーションを使用するには、インターネット クライアントとマイクの機能を宣言する必要があります。
- Unity Editor で、[編集] > [プロジェクト設定] > [プレーヤー] の順に移動します
- [Windows Store] タブを選択します
- [ 発行設定 > 機能 セクションで、 InternetClient 機能を確認します
- (省略可能) マイクをまだ有効にしていない場合は、[マイク] 機能をオンにします
- HoloLens デバイスでマイク アクセスのアクセス許可をアプリに付与する (まだ行っていない場合)
- デバイスの起動時にこれを行うように求められますが、誤って [いいえ] をクリックすると、デバイス設定のアクセス許可が変更される可能性があります
DictationRecognizer
次のような DictationRecognizer を作成します。
dictationRecognizer = new DictationRecognizer();
ディクテーション動作を実装するためにサブスクライブおよび処理できる 4 つのディクテーション イベントがあります。
DictationResult
DictationComplete
DictationHypothesis
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 つのタイムアウトに注意する必要があります。- 認識エンジンを起動しても、最初の 5 秒間音声が聞こえない場合は、タイムアウトになります。
- 認識エンジンが結果を提供した後、20 秒間何も聞こえない場合は、タイムアウトになります。
フレーズ認識とディクテーションの両方の使用
アプリでフレーズ認識とディクテーションの両方を使用する場合、一方を完全にシャットダウンしてから、もう一方を開始する必要があります。 複数の KeywordRecognizers を実行している場合は、次の方法でそれらすべてを一度にシャットダウンできます。
PhraseRecognitionSystem.Shutdown();
DictationRecognizer が停止した後、Restart()
を呼び出して、すべての認識エンジンを以前の状態に復元できます。
PhraseRecognitionSystem.Restart();
また、KeywordRecognizer を起動するだけで、PhraseRecognitionSystem も再起動できます。
Mixed Reality ツールキットでの音声入力
次のデモ シーンでは、音声入力の MRTK の例を確認できます。
次の開発チェックポイント
私たちが用意した Unity 開発チェックポイント体験に従っている場合、次のタスクは、Mixed Reality プラットフォームの機能と API の探索です。
いつでも Unity 開発チェックポイントに戻ることができます。