本日は昨日に引き続きMap-SDKを学んでいきます。
〇音声コマンドの実装
音声コマンドを使用するためにプロファイラーを設定していきます。
①[MixedRealityToolkit]オブジェクトのinspectorウィンドウから[MixedRealityToolkit]の[Input],[Speech]を開きます。
②[+ Add a New Speech Command]を選択し新しいスピーチコマンドを作成します。
③新しく作成されたコマンドに[Hokkaido]と都市名を入力します。
④ ②,③を繰り返し47都道府県すべてをコマンドとして入力します。
以上ですべての都道府県で音声コマンドの実装が完了しました。
次に音声コマンドをどのように使用するかを設定していきます。
〇音声認識による処理
①コマンドを認識した後の処理を記述します。
今回次のようなスクリプトを書き空のゲームオブジェクトにアタッチします。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Microsoft.Geospatial; using Microsoft.Maps.Unity; public class StateMapChanger : MonoBehaviour { [SerializeField] MapRenderer _renderer; public void StateMapChangewithVoice() { float zoom = 10f; //Hokkaido _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(43.06417, 141.34694), zoom-3.5f)); } }
[MapRenderer]にはMapオブジェクトの[MapRenderer]を指定します。
このスクリプトではStateMapChangewithVoice関数を実行することで地図の表示が北海道でズームされます。
②[SppechInputHandler]コンポーネントをアタッチします。
[Keyword]にプロファイラーで指定した都市名(Hokkaido)を入力します。
この状態で実行してデバックキーによって音声認識の動作を確認します。
この際[SppechInputHandler]コンポーネントの[Is Forcus Required]のチェックを外しオブジェクトを見つめていなくても音声コマンドが使用できるようにします。
音声コマンドで北海道へズームされるようになりました。
これを47都道府県すべてにズームできるようにします。
スクリプトを以下のように変更しました。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Microsoft.Geospatial; using Microsoft.Maps.Unity; public class StateMapChanger : MonoBehaviour { [SerializeField] MapRenderer _renderer; public void StateMapChangewithVoice(int stateNum) { float zoom = 10f; Debug.Log(stateNum); switch (stateNum) { case 1: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(43.06417, 141.34694), zoom-3.5f)); break; case 2: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(40.82444, 140.74), zoom)); break; case 3: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(39.70361, 141.1525), zoom)); break; case 4: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(38.26889, 140.87194), zoom)); break; case 5: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(39.71861, 140.1025), zoom)); break; case 6: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(38.24056, 140.36333), zoom)); break; case 7: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(37.75, 140.46778), zoom)); break; case 8: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(36.34139, 140.44667), zoom)); break; case 9: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(36.56583, 139.88361), zoom)); break; case 10: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(36.39111, 139.06083), zoom)); break; case 11: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.85694, 139.64889), zoom)); break; case 12: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.60472, 140.12333), zoom)); break; case 13: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.68944, 139.69167), zoom)); break; case 14: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.44778, 139.6425), zoom)); break; case 15: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(37.90222, 139.02361), zoom)); break; case 16: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(36.69528, 137.21139), zoom)); break; case 17: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(36.59444, 136.62556), zoom)); break; case 18: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(36.06528, 136.22194), zoom)); break; case 19: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.66389, 138.56833), zoom)); break; case 20: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(36.65139, 138.18111), zoom)); break; case 21: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.39111, 136.72222), zoom)); break; case 22: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.97694, 138.38306), zoom)); break; case 23: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.18028, 136.90667), zoom)); break; case 24: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.73028, 136.50861), zoom)); break; case 25: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.00444, 135.86833), zoom)); break; case 26: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.02139, 135.75556), zoom)); break; case 27: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.68639, 135.52), zoom)); break; case 28: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.69139, 135.18306), zoom)); break; case 29: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.68528, 135.83278), zoom)); break; case 30: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.22611, 135.1675), zoom)); break; case 31: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.50361, 134.23833), zoom)); break; case 32: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(35.47222, 133.05056), zoom)); break; case 33: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.66167, 133.935), zoom)); break; case 34: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.39639, 132.45944), zoom)); break; case 35: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.18583, 131.47139), zoom)); break; case 36: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.06583, 134.55944), zoom)); break; case 37: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(34.34028, 134.04333), zoom)); break; case 38: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(33.84167, 132.76611), zoom)); break; case 39: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(33.55972, 133.53111), zoom)); break; case 40: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(33.60639, 130.41806), zoom)); break; case 41: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(33.24944, 130.29889), zoom)); break; case 42: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(32.74472, 129.87361), zoom)); break; case 43: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(32.78972, 130.74167), zoom)); break; case 44: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(33.23806, 131.6125), zoom)); break; case 45: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(31.91111, 131.42389), zoom)); break; case 46: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(31.56028, 130.55806), zoom)); break; case 47: _renderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(26.2125, 127.68111), zoom)); break; } } }
Switch文を使用しており、StateMapChangewithVoiceメソッドに渡される引数のint stateNumの値によってそれぞれの場所へズームするようにしました。
引数を与えたことで[SppechInputHandler]コンポーネントのイベントで数値を設定できます。
[StateMapChanger]コンポーネントに対応するように47都道府県分のイベントを設定していきます。
これによって47都道府県のそれぞれに合わせて緯度と経度が切り替わるようになりました。
〇実機で確認
日本の名詞のため英語osの場合発話を認識できない(しにくい)点がありますが任意の都市を表示することが出来ました