MRが楽しい

MRやVRについて学習したことを書き残す

MRTKを用いて音声認識のキーワードイベントを設定する

本日は MRTK の技術調査枠です。
MRTKを用いて音声認識のキーワードイベントを設定する方法をまとめます。

プロジェクトとシーンの準備

以下の記事を元にHoloLens(WindowsMR)プロジェクトを作成します。
bluebirdofoz.hatenablog.com

2019/1/10現在、MRTK 2017 の最新バージョンは 2017.4.3.0 です。
f:id:bluebirdofoz:20190111012222j:plain

音声認識では当然マイク入力が必要になります。
アプリでマイク入力を利用するには Capability でマイク許可の設定を行う必要があります。
メニューから MixedRealityToolkit -> Configure -> ApplyUWPCapabilitySettings を開きます。
f:id:bluebirdofoz:20190111012232j:plain

ApplyUWPCapabilitySettings ウィンドウが開きます。
[Microphone]にチェックを入れて[Apply]ボタンをクリックします。
f:id:bluebirdofoz:20190111012249j:plain

SpeechInputSourceの追加(イベント発生)

最初に音声認識でキーワードイベントを発生させる設定を行います。
MRTK の SpeechInputSource を利用します。

Hierarchy で右クリックして CreateEmpty を作成します。
分かりやすいオブジェクト名を設定します。SpeechComponent としました。
f:id:bluebirdofoz:20190111012259j:plain

SpeechComponent オブジェクトの Inspector ビューを開き、[Add Component]ボタンから SpeechInputSource を選択します。
f:id:bluebirdofoz:20190111012308j:plain

SpeechInputSource コンポーネントが追加されます。
次に認識させるキーワードを設定します。
[Keywords]を開き、[+]ボタンをクリックします。
f:id:bluebirdofoz:20190111012318j:plain

[Keyword]の項目に認識させるキーワードを設定します。
HoloLens のデフォルトの OS バージョンでは英語のみ認識可能です。
[KeyShortcut]の項目にはデバックで利用するキーを割り当てられます。
指定のキーを入力することで、対応するキーワードのイベントを発生させることができます。

以下の2つのキーワードを設定しました。

Keyword : up   , KeyShortcut : U
Keyword : down , KeyShortcut : Space

f:id:bluebirdofoz:20190111012330j:plain

音声認識時のサンプル動作

音声認識時のサンプル動作として、Sphere オブジェクトを上下させます。
以下のアタッチしたオブジェクトを上下するスクリプトを作成しました。
・UpDownMove.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UpDownMove : MonoBehaviour
{
    /// <summary>
    /// 上昇動作
    /// </summary>
    public void Up()
    {
        transform.position = new Vector3(
                transform.position.x,
                transform.position.y + 0.2f,
                transform.position.z);
    }
    /// <summary>
    /// 下降動作
    /// </summary>
    public void Down()
    {
        transform.position = new Vector3(
            transform.position.x,
            transform.position.y - 0.2f,
            transform.position.z);
    }
}

これを Sphere オブジェクトにアタッチします。
f:id:bluebirdofoz:20190111012342j:plain

SpeechInputHandlerの追加(イベント受取)

最後にキーワードイベントを受け取る設定を行います。
MRTK の SpeechInputHandler を利用します。

Sphere オブジェクトの Inspector ビューを開き、[Add Component]ボタンから SpeechInputHandler を選択します。
f:id:bluebirdofoz:20190111012352j:plain

SpeechInputHandler コンポーネントが追加されます。
[+]ボタンをクリックしてイベント受取の設定を追加します。
f:id:bluebirdofoz:20190111012401j:plain

追加された[Elements]を開き、[Keyword]のプルダウンを選択します。
SpeechInputSource で設定したキーワードの一覧が表示されます。
まず up を選択します。
f:id:bluebirdofoz:20190111012411j:plain

次にキーワードイベントを取得したときに発生する処理を設定します。
[Responese()]の[+]ボタンをクリックし、表示された Object の項目に Sphere オブジェクトを設定します。
f:id:bluebirdofoz:20190111012421j:plain

[No Function]のプルダウンを開くと、Sphere オブジェクトにアタッチされたコンポーネトの一覧が開きます。
先ほどの UpDownMove スクリプトが表示されているのでマウスオーバーします。
すると UpDownMove スクリプトの関数一覧が表示されるので、作成した Up() 関数を選択します。
f:id:bluebirdofoz:20190111012433j:plain

同じ要領で[Down]イベントの設定も行います。
これでイベント受取の設定は完了です。
f:id:bluebirdofoz:20190111012444j:plain

Unity上でのテスト

Unity上での動作確認を行ってみます。

その前に一点、確認しやすいよう SpeechInputHandler の設定を変更します。
SpeechInputHandler コンポーネントの[Is Global Listener]にチェックを入れます。
f:id:bluebirdofoz:20190111012453j:plain

[Is Global Listener]にチェックを入れている場合、そのイベントハンドラーは常に対象イベントの発生を受け取ります。
チェックを入れていない場合、そのイベントハンドラーはアタッチされたオブジェクトがフォーカス(注視)されているときのみ、対象イベントの発生を受け取ります。
何処を向いていても音声認識をしてほしい場合はチェックを入れておくと良いでしょう。

[再生]ボタンを押して[Uキー]または[Spaceキー]を押下します。
Sphere オブジェクトが入力に合わせて上下に移動すれば成功です。
f:id:bluebirdofoz:20190111012502j:plain

HoloLensでの動作確認

後はHoloLens(WindowsMR)プロジェクトの作成手順に従って、アプリを HoloLens にインストールします。
f:id:bluebirdofoz:20190111012513j:plain

「Up」「Down」の言葉に反応して Sphere オブジェクトが上下することを確認します。
f:id:bluebirdofoz:20190111012522j:plain

※ 初回起動時にマイク入力を許可する旨のダイアログが表示されます。
  許可した後、一度アプリのプロセスをきちんと再起動して(パネルを一度消すなど)確認してください。