夜風のMixedReality

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

HoloLensでデバイスの言語に合わせた音声認識を提供する

本日はHoloLensアプリのテクニック記事です。

音声認識とは?

HoloLens 2では手を使ったジェスチャー入力のほか、ユーザーの音声コマンドを認識して処理を実行することができます。

しかし、デバイスで使用している言語によって認識できる言語が決まります。

HoloLens 2ではOSの言語を設定から簡単に変更できます。

redhologerbera.hatenablog.com

そのためUnityアプリで独自の音声認識のコマンドを実行した場合、音声コマンドが使えないという場面が発生する可能性があります。

今回はユーザーの使用している言語に合わせて音声コマンドを使用できるようにします。

〇言語を取得する

アプリ内に使用している言語に合わせて適応される音声コマンドを変化させるためにはまずアプリ内でデバイスの使用している言語を取得する必要があります。

これは次のコードで実現します。

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

public class LangageManager : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        string lang = Application.systemLanguage.ToString();
        Debug.Log(lang);
    }
}

UnityではApplication.systemLanguageを使用するととで実行されているOSの使用言語を取得できます。

docs.unity3d.com

これを実行することでコンソールウィンドウに使用しているPCの言語名が表示されるようになりました。

〇言語ごとの音声コマンド

MRTKを使用したHoloLensアプリの場合MixedReality Configureで使用する音声コマンドを登録します。

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

[SpeechInputHandler]コンポーネントなどを用いてUnityアプリ内で音声コマンドとそのイベントを設定します。

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

今回はこの特性を利用して日本語用のゲームオブジェクトと英語用のゲームオブジェクトの二つを作成して、使用しているOSの言語に応じて選択されるようにしました。

今回[Start]と[スタート]という二つの音声コマンドを設定しました。

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

①hierarchyウィンドウに2つのゲームオブジェクトを追加してそれぞれ[JapanVoiceInput]と[EnglishVoiceInput]と名付けます。

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

②次に[JapanVoiceInput]、[EnglishVoiceInput]にそれぞれ[SpeechInputHandler]コンポーネントを加えます。

・[JapanVoiceInput]

[keyword]に日本語で[スタート]と入力します。

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

・[EnglishVoiceInput]

[keyword]に英語で[Start]と入力します。

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

③シーンに2つの異なる色のキューブを配置します。

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

④配置したキューブをディアクティブにします。

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

⑤[JapanVoiceInput]、[EnglishVoiceInput]オブジェクトでそれぞれ赤色のキューブ、白色のキューブが出現するように設定します。

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

これで[Start]と認識した場合白色のキューブが、[スタート]と認識した場合赤色のキューブが出現するようになったことで発話を区別できます。

⑥新しいゲームオブジェクトを作成して[LanguageManager]と名付けます。

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

⑦[LanguageManager]オブジェクトに次のスクリプトを作成してアタッチします。

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

public class LangageManager : MonoBehaviour
{

    [SerializeField]
    GameObject _JapanesePrefab;
    [SerializeField]
    GameObject _EnglishPrefab;
    
    // Start is called before the first frame update
    void Start()
    {
        //get Langage using users device.
        string lang = Application.systemLanguage.ToString();
        Debug.Log(lang);
        switch(lang)
        {
            case "Japanese":
                _JapanesePrefab.SetActive(true);
                break;
            case "English":
                _EnglishPrefab.SetActive(true);
                break;
        }
    }
}

このオブジェクトは実行時にデバイスのOSの言語によって[JapanesePrefab]か[ EnglishPrefab]のどちらかをアクティブにします。

実際のOSでは日本語英語以外に様々な言語があるので今回は今後の拡張を考えてSwitch文を使用しています。

⑧[JapaneesePrefab]、[ EnglishPrefab]にはそれぞれ対応する[JapanVoiceInput]、[EnglishVoiceInput]を設定します。

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

⑨最後に[JapanVoiceInput][EnglishVoiceInput]をディアクティブにします。

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

以上でデバイスの言語に合わせた音声認識を提供できました。

xRアプリは日本国内の場合日本語が一般的ではありますが、グローバルで誰もが使いやすいアプリを考えたときには今回のようなテクニックが役立ちます。