重要
Mixed Reality Academy のチュートリアルは、HoloLens (第 1 世代)、Unity 2017、Mixed Realityイマーシブ ヘッドセットを念頭に置いて設計されました。 そのため、これらのデバイスの開発に関するガイダンスをまだ探している開発者には、これらのチュートリアルを配置しておくことが重要であると考えます。 これらのチュートリアルは、HoloLens 2に使用されている最新のツールセットや相互作用では更新されず、新しいバージョンのUnityと互換性がない可能性があります。 これらは、サポートされているデバイスでの作業を継続するために維持されます。 HoloLens 2用の新しい一連のチュートリアルが投稿されました。
音声入力 を使用すると、ホログラムと対話する別の方法が提供されます。 音声コマンドは、非常に自然で簡単な方法で動作します。 音声コマンドを次のように設計します。
- 自然
- 覚えやすい
- コンテキストが適切
- 同じコンテキスト内の他のオプションとは十分に異なる
MR Basic 101 では、KeywordRecognizer を使用して 2 つの単純な音声コマンドを作成しました。 MR Input 212 では、さらに詳しく説明し、次の方法について学習します。
- HoloLens 音声エンジン用に最適化された音声コマンドを設計します。
- 使用可能な音声コマンドをユーザーに認識させます。
- ユーザーの音声コマンドを聞いたことを確認します。
- ディクテーション 認識エンジンを使用して、ユーザーの言っていることを理解します。
- 文法認識エンジンを使用して、SRGS または音声認識文法仕様ファイルに基づいてコマンドをリッスンします。
このコースでは、MR Input 210 と MR Input 211 で構築したモデル エクスプローラーを見直します。
重要
以下の各章に埋め込まれたビデオは、古いバージョンのUnityとMixed Reality ツールキットを使用して記録されました。 詳細な手順は正確で最新ですが、対応するビデオに古いスクリプトやビジュアルが表示される場合があります。 ビデオは後世のために含まれたままであり、カバーされている概念がまだ適用されるためです。
デバイスのサポート
コース | HoloLens | イマーシブ ヘッドセット |
---|---|---|
MR 入力 212: 音声 | ✔️ | ✔️ |
始める前に
前提条件
- 正しいツールをインストールして構成されたWindows 10 PC。
- いくつかの基本的な C# プログラミング機能。
- MR 基本 101 を完了している必要があります。
- MR 入力 210 が完了している必要があります。
- MR 入力 211 が完了している必要があります。
- 開発用に構成された HoloLens デバイス。
プロジェクト ファイル
- プロジェクトに必要な ファイル をダウンロードします。 2017.2 以降Unity必要です。
- デスクトップまたはその他の簡単にアクセスできる場所にファイルをアーカイブ解除します。
注:
ダウンロードする前にソース コードを確認する場合は、 GitHub で入手できます。
正誤表とメモ
- コード内のブレークポイントにヒットするには、Visual Studio の [ツール] >Options->Debugging で "マイ コードのみを有効にする" を無効にする (オフ) にする必要があります。
Unityセットアップ
手順
- Unityを開始します。
- [開く]を選択します。
- 以前アーカイブを解除した HolographicAcademy-Holographs-212-Voice フォルダーに移動します。
- Starting/Model エクスプローラー フォルダーを見つけて選択します。
- [ フォルダーの選択 ] ボタンをクリックします。
- [プロジェクト] パネルで、[シーン] フォルダーを展開します。
- ModelExplorer シーンをダブルクリックして、Unityに読み込みます。
建物
- Unityで、[ファイル] > [ビルド設定] を選択します。
- Scenes/ModelExplorer が [ビルド中のシーン] に一覧表示されていない場合は、[開いているシーンの追加] をクリックしてシーンを追加します。
- HoloLens 用に特別に開発している場合は、[ ターゲット デバイス] を HoloLens に設定します。 それ以外の場合は、[ 任意のデバイス] のままにします。
- [ビルドの種類] が [D3D] に設定され、SDK が [インストール済みの最新] (SDK 16299 以降) に設定されていることを確認します。
- [ ビルド] をクリックします。
- "App" という名前の 新しいフォルダー を作成します。
- [アプリ] フォルダーを 1 回クリックします。
- [フォルダーの選択] を押すとUnity Visual Studio のプロジェクトのビルドが開始されます。
Unityが完了すると、エクスプローラー ウィンドウが表示されます。
- App フォルダーを開きます。
- ModelExplorer Visual Studio ソリューションを開きます。
HoloLens にデプロイする場合:
- Visual Studio の上部のツール バーを使用して、ターゲットを [デバッグ] から [ リリース] に、ARM から x86 に変更します。
- [ローカル コンピューター] ボタンの横にあるドロップダウン矢印をクリックし、[ リモート コンピューター] を選択します。
- HoloLens デバイスの IP アドレスを入力し、[認証モード] を [ユニバーサル (暗号化されていないプロトコル)] に設定します。 [選択] をクリックします。 デバイスの IP アドレスがわからない場合は、[ 設定] > [ネットワーク] & [インターネット] > [詳細設定] を参照してください。
- 上部のメニュー バーで、[ デバッグ] -> [デバッグなしで開始] をクリックするか、 Ctrl キーを押しながら F5 キーを押します。 初めてデバイスにデプロイする場合は、 Visual Studio とペアリングする必要があります。
- アプリがデプロイされたら、選択ジェスチャで Fitbox を閉じます。
イマーシブ ヘッドセットにデプロイする場合:
- Visual Studio の上部のツール バーを使用して、ターゲットを [デバッグ] から [ リリース ] に、ARM から x64 に変更します。
- デプロイ ターゲットが [ローカル コンピューター] に設定されていることを確認します。
- 上部のメニュー バーで、[ デバッグ] -> [デバッグなしで開始] をクリックするか、 Ctrl キーを押しながら F5 キーを押します。
- アプリがデプロイされたら、モーション コントローラーでトリガーをプルして Fitbox を閉じます。
注:
Visual Studio の [エラー] パネルに赤いエラーが表示される場合があります。 無視しても安全です。 [出力] パネルに切り替えて、実際のビルドの進行状況を表示します。 [出力] パネルのエラーでは、修正が必要になります (ほとんどの場合、スクリプトの間違いが原因です)。
第 1 章 - 認識
目標
- 音声コマンドデザイン の Dos と Don'ts について説明します。
- KeywordRecognizer を使用して、視線入力ベースの音声コマンドを追加します。
- カーソル フィードバックを使用して、ユーザーに音声コマンドを認識させる。
音声コマンドの設計
この章では、音声コマンドの設計について説明します。 音声コマンドを作成する場合:
する
- 簡潔なコマンドを作成します。 コマンドは簡潔ではなく、ユーザーによって簡単に忘れられるので、 "現在選択されているビデオを再生する" を使用したくありません。 代わりに、 "ビデオの再生" を使用する必要があります。これは簡潔で、複数の音節があるためです。
- 簡単なボキャブラリを使用します。 ユーザーが見つけて覚えやすい一般的な単語やフレーズを常に使用してください。 たとえば、アプリケーションに、ビューに表示または非表示にできるメモ オブジェクトがある場合、 "プラカードの表示" は使用頻度の高い用語であるため、コマンド "プラカードの表示" は使用しません。 代わりに、 "Show Note" コマンドを使用して、アプリケーションでメモを表示します。
- 一貫性を持たせます。 音声コマンドは、アプリケーション全体で一貫性を保つ必要があります。 アプリケーションに 2 つのシーンがあり、両方のシーンにアプリケーションを閉じるボタンが含まれているとします。 最初のシーンでコマンド "Exit" を使用してボタンをトリガーしたが、2 番目のシーンで "アプリを閉じる" コマンドを使用した場合、ユーザーは非常に混乱します。 同じ機能が複数のシーンにわたって保持される場合は、同じ音声コマンドを使用してトリガーする必要があります。
できません
- 単一の音節コマンドを使用します。 たとえば、ビデオを再生する音声コマンドを作成する場合は、単純なコマンド "Play" を使用しないようにする必要があります。これは単一の音節のみで、システムによって簡単に見逃される可能性があるためです。 代わりに、 "ビデオの再生" を使用する必要があります。これは簡潔で、複数の音節があるためです。
- システム コマンドを使用します。
"Select" コマンドは、現在フォーカスされているオブジェクトの Tap イベントをトリガーするためにシステムによって予約されています。
"Select" コマンドは、期待どおりに動作しない可能性があるため、キーワード (keyword)またはフレーズで再利用しないでください。 たとえば、アプリケーションでキューブを選択するための音声コマンドが "キューブの選択" であったが、ユーザーがコマンドを発声したときに球体を見ていた場合、代わりに球体が選択されます。 同様に、アプリ バー コマンドは音声が有効になっています。 CoreWindow ビューでは、次の音声コマンドを使用しないでください。
- 戻ってください
- スクロール ツール
- ズーム ツール
- ドラッグ ツール
- 調整する
- 削除
- 同様のサウンドを使用します。 韻をたてるように音声コマンドを使用しないようにしてください。 " ストアの表示" と " 詳細の 表示" を音声コマンドとしてサポートするショッピング アプリケーションがある場合は、もう一方のコマンドが使用中の間にいずれかのコマンドを無効にする必要があります。 たとえば、[ ストアの表示 ] ボタンを使用してストアを開き、ストアが表示されたときにそのコマンドを無効にして 、[詳細表示] コマンドを参照に使用できます。
手順
- Unityの [階層] パネルで、検索ツールを使用してholoComm_screen_mesh オブジェクトを見つけます。
- holoComm_screen_mesh オブジェクトをダブルクリックしてシーンに表示します。 これは私たちの音声コマンドに応答する宇宙飛行士のwatchです。
- [インスペクター] パネルで、Speech Input Source (Script) コンポーネントを見つけます。
- [ キーワード ] セクションを展開して、サポートされている音声コマンド Open Communicator を表示します。
- 右側の歯車をクリックし、[ スクリプトの編集] を選択します。
- SpeechInputSource.csを調べて、KeywordRecognizer を使用して音声コマンドを追加する方法を理解します。
ビルドとデプロイ
- Unityで、[ファイル] > [ビルド設定] を使用してアプリケーションをリビルドします。
- App フォルダーを開きます。
- ModelExplorer Visual Studio ソリューションを開きます。
(セットアップ中に Visual Studio でこのプロジェクトを既にビルドまたはデプロイしている場合は、その VS のインスタンスを開き、プロンプトが表示されたら [すべて再読み込み] をクリックできます)。
- Visual Studio で、[ デバッグ] -> [デバッグなしで開始] をクリックするか、 Ctrl + F5 キーを押します。
- アプリケーションが HoloLens にデプロイされたら、 エアタップ ジェスチャを使用してフィット ボックスを閉じます。
- 宇宙飛行士のwatchを眺めましょう。
- watchにフォーカスがある場合は、カーソルがマイクに変わったことを確認します。 これにより、アプリケーションが音声コマンドをリッスンしているフィードバックが提供されます。
- watchにツールヒントが表示されることを確認します。 これは、ユーザーが "Open Communicator" コマンドを検出するのに役立ちます。
- watchを見つめながら、「Open Communicator」と言って、コミュニケーター パネルを開きます。
第 2 章 - 確認
目標
- マイク入力を使用してメッセージを記録します。
- アプリケーションが音声を聞いているというフィードバックをユーザーに提供します。
注:
アプリがマイクから録音するには、マイク機能を宣言する必要があります。 これは既に MR Input 212 で行われますが、独自のプロジェクトではこの点に注意してください。
- Unity エディターで、[プロジェクト設定の >編集] > [プレーヤー] に移動して、プレーヤーの設定移動します。
- [ユニバーサル Windows プラットフォーム] タブをクリックします
- [発行設定>機能] セクションで、[マイク] 機能をチェックします
手順
- Unityの [階層] パネルで、holoComm_screen_mesh オブジェクトが選択されていることを確認します。
- [インスペクター] パネルで、宇宙飛行士ウォッチ (スクリプト) コンポーネントを見つけます。
- Communicator Prefab プロパティの値として設定されている小さい青いキューブをクリックします。
- [プロジェクト] パネルで、Communicator プレハブにフォーカスが設定されます。
- プロジェクト パネルで Communicator プレハブをクリックして、そのコンポーネントをインスペクターに表示します。
- マイク マネージャー (スクリプト) コンポーネントを見ると、ユーザーの声を録音できます。
- Communicator オブジェクトには、メッセージの送信コマンドに応答するための Speech Input Handler (Script) コンポーネントがあることに注意してください。
- Communicator (スクリプト) コンポーネントを見て、スクリプトをダブルクリックして Visual Studio で開きます。
Communicator.csは、コミュニケーター デバイスで適切なボタンの状態を設定する役割を担います。 これにより、ユーザーはメッセージを記録し、再生し、宇宙飛行士にメッセージを送信できます。 また、アニメーション化されたウェーブ フォームを開始および停止して、音声が聞こえられたことをユーザーに確認します。
- Communicator.csで、Start メソッドから次の行 (81 と 82) を削除します。 これにより、コミュニケーターの [レコード] ボタンが有効になります。
// TODO: 2.a Delete the following two lines:
RecordButton.SetActive(false);
MessageUIRenderer.gameObject.SetActive(false);
ビルドとデプロイ
- Visual Studio で、アプリケーションをリビルドし、デバイスにデプロイします。
- 宇宙飛行士のwatchを見つめ、「Open Communicator」と言ってコミュニケーターを表示します。
- 宇宙飛行士の音声メッセージの録音を開始するには、[ 録音 ] ボタン (マイク) を押します。
- 話し始め、ウェーブ アニメーションがコミュニケーターで再生されていることを確認します。これにより、音声が聞こえることに関するフィードバックがユーザーに提供されます。
- [停止] ボタン (左四角形) を押し、ウェーブ アニメーションの実行が停止したことを確認します。
- [再生] ボタン (右三角形) を押して、記録されたメッセージを再生し、デバイスで読み上げる。
- [停止] ボタン (右四角形) を押して、記録されたメッセージの再生を停止します。
- 「メッセージを送信」と言ってコミュニケーターを閉じ、宇宙飛行士から 「受信したメッセージ」応答を受け取ります。
第 3 章 - ディクテーション認識エンジンについて
目標
- Dictation Recognizer を使用して、ユーザーの音声をテキストに変換します。
- ディクテーション 認識エンジンの仮説と最終的な結果をコミュニケーターに表示します。
この章では、ディクテーション認識エンジンを使用して宇宙飛行士のメッセージを作成します。 ディクテーション 認識エンジンを使用する場合は、次の点に注意してください。
- ディクテーション 認識エンジンを機能させるには、WiFi に接続されている必要があります。
- タイムアウトは、設定された期間の後に発生します。 注意すべきタイムアウトは 2 つあります。
- 認識エンジンが起動し、最初の 5 秒間オーディオが聞こえない場合、タイムアウトになります。
- 認識エンジンが結果を出したが、20 秒間無音と聞こえると、タイムアウトします。
- 一度に実行できる認識エンジン (キーワードまたはディクテーション) の種類は 1 つだけです。
注:
アプリがマイクから録音するには、マイク機能を宣言する必要があります。 これは既に MR Input 212 で行われますが、独自のプロジェクトではこの点に注意してください。
- Unity エディターで、[プロジェクト設定の >編集] > [プレーヤー] に移動して、プレーヤーの設定移動します。
- [ユニバーサル Windows プラットフォーム] タブをクリックします
- [発行設定>機能] セクションで、[マイク] 機能をチェックします
手順
ディクテーション 認識エンジンを使用するように MicrophoneManager.cs を編集します。 次の内容を追加します。
- [レコード] ボタンが押されると、DictationRecognizer が開始されます。
- DictationRecognizer が理解した 内容の仮説 を表示します。
- DictationRecognizer が理解した 結果 をロックします。
- DictationRecognizer からのタイムアウトを確認します。
- [停止] ボタンを押すか、マイク セッションがタイムアウトしたら、DictationRecognizer を停止します。
- メッセージの送信コマンドをリッスンする KeywordRecognizer を再起動します。
では、始めましょう。 MicrophoneManager.csで 3.a のすべてのコーディング演習を完了するか、以下の完成したコードをコピーして貼り付けます。
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Windows.Speech;
namespace Academy
{
public class MicrophoneManager : MonoBehaviour
{
[Tooltip("A text area for the recognizer to display the recognized strings.")]
[SerializeField]
private Text dictationDisplay;
private DictationRecognizer dictationRecognizer;
// Use this string to cache the text currently displayed in the text box.
private StringBuilder textSoFar;
// Using an empty string specifies the default microphone.
private static string deviceName = string.Empty;
private int samplingRate;
private const int messageLength = 10;
// Use this to reset the UI once the Microphone is done recording after it was started.
private bool hasRecordingStarted;
void Awake()
{
/* TODO: DEVELOPER CODING EXERCISE 3.a */
// 3.a: Create a new DictationRecognizer and assign it to dictationRecognizer variable.
dictationRecognizer = new DictationRecognizer();
// 3.a: Register for dictationRecognizer.DictationHypothesis and implement DictationHypothesis below
// This event is fired while the user is talking. As the recognizer listens, it provides text of what it's heard so far.
dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;
// 3.a: Register for dictationRecognizer.DictationResult and implement DictationResult below
// This event is fired after the user pauses, typically at the end of a sentence. The full recognized string is returned here.
dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
// 3.a: Register for dictationRecognizer.DictationComplete and implement DictationComplete below
// This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error.
dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;
// 3.a: Register for dictationRecognizer.DictationError and implement DictationError below
// This event is fired when an error occurs.
dictationRecognizer.DictationError += DictationRecognizer_DictationError;
// Query the maximum frequency of the default microphone. Use 'unused' to ignore the minimum frequency.
int unused;
Microphone.GetDeviceCaps(deviceName, out unused, out samplingRate);
// Use this string to cache the text currently displayed in the text box.
textSoFar = new StringBuilder();
// Use this to reset the UI once the Microphone is done recording after it was started.
hasRecordingStarted = false;
}
void Update()
{
// 3.a: Add condition to check if dictationRecognizer.Status is Running
if (hasRecordingStarted && !Microphone.IsRecording(deviceName) && dictationRecognizer.Status == SpeechSystemStatus.Running)
{
// Reset the flag now that we're cleaning up the UI.
hasRecordingStarted = false;
// This acts like pressing the Stop button and sends the message to the Communicator.
// If the microphone stops as a result of timing out, make sure to manually stop the dictation recognizer.
// Look at the StopRecording function.
SendMessage("RecordStop");
}
}
/// <summary>
/// Turns on the dictation recognizer and begins recording audio from the default microphone.
/// </summary>
/// <returns>The audio clip recorded from the microphone.</returns>
public AudioClip StartRecording()
{
// 3.a Shutdown the PhraseRecognitionSystem. This controls the KeywordRecognizers
PhraseRecognitionSystem.Shutdown();
// 3.a: Start dictationRecognizer
dictationRecognizer.Start();
// 3.a Uncomment this line
dictationDisplay.text = "Dictation is starting. It may take time to display your text the first time, but begin speaking now...";
// Set the flag that we've started recording.
hasRecordingStarted = true;
// Start recording from the microphone for 10 seconds.
return Microphone.Start(deviceName, false, messageLength, samplingRate);
}
/// <summary>
/// Ends the recording session.
/// </summary>
public void StopRecording()
{
// 3.a: Check if dictationRecognizer.Status is Running and stop it if so
if (dictationRecognizer.Status == SpeechSystemStatus.Running)
{
dictationRecognizer.Stop();
}
Microphone.End(deviceName);
}
/// <summary>
/// This event is fired while the user is talking. As the recognizer listens, it provides text of what it's heard so far.
/// </summary>
/// <param name="text">The currently hypothesized recognition.</param>
private void DictationRecognizer_DictationHypothesis(string text)
{
// 3.a: Set DictationDisplay text to be textSoFar and new hypothesized text
// We don't want to append to textSoFar yet, because the hypothesis may have changed on the next event
dictationDisplay.text = textSoFar.ToString() + " " + text + "...";
}
/// <summary>
/// This event is fired after the user pauses, typically at the end of a sentence. The full recognized string is returned here.
/// </summary>
/// <param name="text">The text that was heard by the recognizer.</param>
/// <param name="confidence">A representation of how confident (rejected, low, medium, high) the recognizer is of this recognition.</param>
private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
// 3.a: Append textSoFar with latest text
textSoFar.Append(text + ". ");
// 3.a: Set DictationDisplay text to be textSoFar
dictationDisplay.text = textSoFar.ToString();
}
/// <summary>
/// This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error.
/// Typically, this will simply return "Complete". In this case, we check to see if the recognizer timed out.
/// </summary>
/// <param name="cause">An enumerated reason for the session completing.</param>
private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
// If Timeout occurs, the user has been silent for too long.
// With dictation, the default timeout after a recognition is 20 seconds.
// The default timeout with initial silence is 5 seconds.
if (cause == DictationCompletionCause.TimeoutExceeded)
{
Microphone.End(deviceName);
dictationDisplay.text = "Dictation has timed out. Please press the record button again.";
SendMessage("ResetAfterTimeout");
}
}
/// <summary>
/// This event is fired when an error occurs.
/// </summary>
/// <param name="error">The string representation of the error reason.</param>
/// <param name="hresult">The int representation of the hresult.</param>
private void DictationRecognizer_DictationError(string error, int hresult)
{
// 3.a: Set DictationDisplay text to be the error string
dictationDisplay.text = error + "\nHRESULT: " + hresult;
}
/// <summary>
/// The dictation recognizer may not turn off immediately, so this call blocks on
/// the recognizer reporting that it has actually stopped.
/// </summary>
public IEnumerator WaitForDictationToStop()
{
while (dictationRecognizer != null && dictationRecognizer.Status == SpeechSystemStatus.Running)
{
yield return null;
}
}
}
}
ビルドとデプロイ
- Visual Studio でリビルドし、デバイスにデプロイします。
- エアタップ ジェスチャを使用してフィット ボックスを閉じます。
- 宇宙飛行士のwatchを見つめ、「Open Communicator」と言います。
- [ 録音 ] ボタン (マイク) を選択して、メッセージを記録します。
- 読み上げを開始します。 ディクテーション認識エンジンは、音声を解釈し、コミュニケーターで仮説テキストを表示します。
- メッセージの記録中に "メッセージの送信" と 言ってみてください。 DictationRecognizer がまだアクティブであるため、キーワード認識エンジンが応答しないことに注意してください。
- 数秒間話すのをやめます。 ディクテーション認識エンジンがその仮説を完了し、最終的な結果を示すのを見てください。
- 話し始めてから、20 秒間一時停止します。 これにより、 ディクテーション認識エンジン がタイムアウトします。
- 上記のタイムアウト後に Keyword Recognizer が再度有効になっていることに注意してください。 コミュニケーターが音声コマンドに応答するようになりました。
- 「メッセージを送信」と言って、宇宙飛行士にメッセージを送信します。
第 4 章 - 文法認識エンジン
目標
- 文法認識エンジンを使用して、SRGS または音声認識文法仕様ファイルに従ってユーザーの音声を認識します。
注:
アプリがマイクから録音するには、マイク機能を宣言する必要があります。 これは既に MR Input 212 で行われますが、独自のプロジェクトではこの点に注意してください。
- Unity エディターで、[プロジェクト設定の >編集] > [プレーヤー] に移動して、プレーヤーの設定移動します。
- [ユニバーサル Windows プラットフォーム] タブをクリックします
- [発行設定>機能] セクションで、[マイク] 機能をチェックします
手順
- [ 階層 ] パネルで、 Jetpack_Center を検索して選択します。
- [インスペクター] パネルで Tagalong アクション スクリプトを探します。
- [ 一緒にタグ付けするオブジェクト ]フィールドの右側にある小さな円をクリックします。
- ポップアップウィンドウで 、SRGSToolbox を検索し、一覧から選択します。
-
StreamingAssets フォルダーの SRGSColor.xml ファイルを見てみましょう。
- SRGS の設計仕様については、W3C Web サイト を参照してください。
SRGS ファイルには、次の 3 種類の規則があります。
- 12 色のリストから 1 つの色を指定できるルール。
- 色ルールと 3 つの図形の 1 つの組み合わせをリッスンする 3 つのルール。
- 3 つの "色 + 図形" ルールの任意の組み合わせをリッスンするルート ルール colorChooser。 図形は、任意の順序で、1 つから 3 つすべてに任意の量で言うことができます。 これは、最初の <grammar> タグのファイルの先頭にあるルート 規則として指定されているため、リッスンされる唯一のルールです。
ビルドとデプロイ
- Unityでアプリケーションを再構築し、Visual Studio からビルドしてデプロイし、HoloLens でアプリを体験します。
- エアタップ ジェスチャを使用してフィット ボックスを閉じます。
- 宇宙飛行士のジェットパックを注視し、エアタップジェスチャを実行します。
- 読み上げを開始します。 Grammar Recognizer は、音声認識を解釈し、認識に基づいて図形の色を変更します。 コマンドの例は、"青い円、黄色の四角形" です。
- 別のエアタップ ジェスチャを実行してツールボックスを閉じます。
最後です
おめでとうございます! これで、MR Input 212: Voice が完了しました。
- 音声コマンドの Dos と Don'ts がわかっています。
- ユーザーに音声コマンドを認識させるためにツールヒントがどのように使用されているかを確認しました。
- ユーザーの声が聞こえたという認識に使用されるフィードバックがいくつか見られました。
- Keyword Recognizer と Dictation Recognizer を切り替える方法と、これら 2 つの機能が音声を理解して解釈する方法について説明します。
- アプリケーションで音声認識に SRGS ファイルと Grammar Recognizer を使用する方法について学習しました。