雑に書いていく運動
今回のテーマ
「声」
GoogleHomeで遊べるアプリを作ろうと思った。
企画
GoogleHomeで簡単な時間あてゲーム。 イメージは、10歩歩いて振り返って撃ち抜く荒野のガンマンのイメージ。
「10秒で勝負!」
...10秒後
「バン!」
でもって指定時間誤差であれば、勝利するという簡単なゲーム.
スケジュール感
3/10
- 12:30-13:00 企画決定
- 13:00-18:00 GoogleHome勉強&試行錯誤
3/11
- 16:00-18:00 GoogleHome試行錯誤
作業時間7時間程度確保。 少なめなのは、歯医者とTOEICが要因。。
結果
完全に作り切ることはできなかった。 終了後にちょっと調整して一通り遊べる感じには出来上がった。
作ってみての感じた問題点
- 時間遅延がひどい (3-5秒くらいずれる。ゲームとして致命的)
- 開始タイミングがわかりづらい
1の要因
- 音声認識時間 (発話してから認識してくれるまでの時間ずれ、GoogleHome -> DialogFlowの通信時間も含む)
- 通信時間 (DialogFlowから用意したFirebase Cloud Functionsへの通信時間)
- 関数実行時間 (Cloud Functionにリクエストが来てから、関数実行してレスポンスを返すまでの時間)
2の要因
- 言葉でタイミングを伝えるというのが難しかった。
- 例えば、「よーい、ドン! 」で開始するとする。実際には「よ」の音声再生開始から「ドン」のタイミングまでを考慮して時間を計算して引かなければならない。
- 実際には1の要因もくわわるので、ローカルで実行完結する環境でないと難しいゲームだった.
ハマリポイント
Dialog FlowのIntentからUser saysが消えている問題
かわりにTraining phrasesのところに、入力してあげれば認識してくれた。 ぐぐるとUser saysに入力するって記述が多いので要注意
Fillfullmentでnot handled問題
Fillfullmentでイベントをフックするには、FillfullmentでWebHook用のURLの設定と、IntentでのFillfullmentセクションのトグルが必要。 さらに重要なのは、Actionのところにきちんと値を指定すること。
こんな感じでactionMapに対応するactionを指定するのだけど、対応actionが見つからないと not handledなerrorが出る。 初めintent名がactionMapのkeyと対応していると考えていたのだけど、そうでなくてハマってしまった。
tellとask
DialogFlowのレスポンス関数として、tellとaskが用意されている。 tellは会話終了. askは会話継続。tellでなんとかしようとしてハマってしまった。
感想とか
sayコマンドで実機検証するのよかった。 発話するのが恥ずかしい人にオススメ。
say "オッケーグーグル。テスト用アプリにつないで"
ただ共同作業スペースなどでやると周りの人がびっくりするので注意.
GoogleHomeおもしろい。 DialogFlowの賢さにも感心した。 「10秒で勝負」って入力するだけで、勝手に「5秒で勝負」といった数字部分の変更抜き出し対応ができるのがすごい。 あと「10秒でスタート」「10秒で勝負」といった曖昧な単語バリエーションにも反応してくれる。 ただ、擬音系が弱いようで、「バン」「パン」「バキュン」などどれが認知しやすい擬音かどうか何度も試行錯誤した。