夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

HoloLens×Azure その3 音声認識を使用したコマンドの実行

〇シーン構成

①[Hierarchy]ウィンドウで[Lunarcom]オブジェクトを選択し、次に [Inspector]ウィンドウで [Add Component]から[Lunarcom Wake Word Recognizer] コンポーネントを追加します。

f:id:Holomoto-Sumire:20200926105536j:plain

②[Lunarcom Wake Word Recognizer]の[Wake Word]フィールドに、任意のフレーズ (チュートリアルでは[Activate terminal]) を入力します。

f:id:Holomoto-Sumire:20200926110604j:plain

これは音声認識を起動するためのコマンドになります。

③[Dismiss Word]フィールドに、任意のフレーズ (チュートリアルでは「Dismiss terminal」) を入力します。

f:id:Holomoto-Sumire:20200926110853j:plain

これは音声認識を終了するときのコマンドです。

④この状態でデプロイします。

youtu.be

前回はHandRayをマイクボタンに向けてジェスチャーを行うことで初めて認識可能になりましたが今回は[Wake word]で指定したフレーズを唱えることで認識可能になりました。

同様に[Dismiss Word]に指定したフレーズを唱えることで終了になります。

MRTKには音声認識として[Speech Input handler]コンポーネントが提供されています。

今回の[Lunarcom Wake Word Recognizer]コンポーネントを使用した音声認識は前回音声を文字化したように音声を認識してさらに実行コマンドとして使用しています。

そのため[Speech Input handler]と異なりインターネットと接続されていない場合使用することはできません。

〇コードを除いてみる

[LunarcomWakeWordRecognizer]コンポーネントでどのような処理が行われているのかをざっと覗きます。

if (WakeWord != "" && WakeWord != "*")
            {

                    lunarcomController.ShowTerminal();
                    BeginRecognizing();
           }

WakeWordがきちんと存在する場合Start関数で[IunarcomController.ShowTermial()]と[BeginRecognizing();]が実行されます。

  public void ShowTerminal()
    {
        terminal.SetActive(true);
    }

ここでは[terminal]オブジェクトがアクティブな状態になります。

f:id:Holomoto-Sumire:20200926112948j:plain

  public async void BeginRecognizing()
    {
        if (micPermissionGranted)
        {
            CreateSpeechRecognizer();

            if (recognizer != null)
            {
                await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);
            }
        }
    }

[BeginRecognizing();]は[bool micPermissionGranted]がtrueの場合非同期処理が行われます。

 private void Update()
    {
        if (lunarcomController.terminal.activeSelf)
        {
            if (recognizedString.ToLower().Contains(DismissWord.ToLower()))
            {
                lunarcomController.HideTerminal();
            }
        }
        else
        {
            if (recognizedString.ToLower().Contains(WakeWord.ToLower()))
            {
                lunarcomController.ShowTerminal();
            }
        }
    }

Update関数ではlunarcomController.terminalがtrueかつ音声からテキストに変換した文字がDismissWord(終了コマンド)と一致した場合

lunarcomController.HideTerminal();を実行します。

public void HideTerminal()
{
    if (terminal.activeSelf)
    {
        foreach (LunarcomButtonController button in buttons)
        {
            if (button.GetIsSelected())
            {
                button.ShowNotSelected();
            }
        }

        outputText.text = "Select a mode to begin.";
        terminal.SetActive(false);
        SelectMode(RecognitionMode.Disabled);
    }
}

つまり終了と初期化の処理を行っています。

[https://docs.microsoft.com/ja-jp/dotnet/api/system.string.tolower?view=netcore-3.1:embed:cite]

lunarcomController.terminalがfalseかつ音声からテキストに変換した文字がWakeWord(終了コマンド)と一致した場合 lunarcomController.ShowTerminal();が実行されます。

 public void ShowTerminal()
    {
        terminal.SetActive(true);
    }

ここではTraminalを実行しています。

[LunarcomWakeWordRecognizer]コンポーネントでは前回作成した文字をテキストに変換する機能を用いて起動と終了を実装していることがわかりました。

docs.microsoft.com