iwathiの/var/log

生活と仕事の効率化が趣味。

GoogleHome miniと会話してプチ人生ドラクエ化してみた

f:id:iwathi3:20171202004246j:plain

人生をドラクエ化したい

 人生ドラクエ化マニュアルという本をちょっと前に読みまして、人生とRPGの融合って考え方は面白いなーとか思ったりしてました。

 ドラクエをプレイしている時の様な感覚で人生に向き合い、自分の目標の達成のために経験値集めてレベルアップしていく、っていうのは理想的な考え方だと思いますし、そうでありたいなーとは思います。

 そういうあるべき姿に感化されたのもあって今回はGoogle Home miniを王様化して人生のプチドラクエ化をしてみました。

Google Home miniを王様化?

簡単に言えば

「自分」が「勇者」という役割を演じ、

Google Home mini」に「王様」を演じさせる

ことで実際に口頭でのロールプレイングを実現しようというものです。

ゲームの中でいうこんな場面ですね。

f:id:iwathi3:20171128062655j:plain


実際にロールプレイしてみた感じはこちら

www.youtube.com


会話での王様のセリフは下記の台詞集から参考にさせていただきました。

ドラクエ1村人会話集

王様との会話の流れに必要な要素

必要な要素は下記の2つです。

  1. 会話のキャッチボール
  2. 発言内容の理解

それぞれについて説明していきます。

1. 会話のキャッチボール

今回は王様との2パターンの大きな会話の流れに関して実装します。

1つ目パターンは「死んだ」場合です。

2つ目のパターンは上記動画の通り、「生還した」場合です。


適当な感じで図にまとめるとこんな感じです。

パターン1「死んだ」場合

 パターン1の「死んだ」場合に関しては王様が「死んでしまうとは なにごとだ! しかたのない やつじゃな。」と一方的に罵声を浴びせてくるだけなので、Google Home miniが「死んだ」という発言を聞き取ったら定型文を喋らせるだけです。

パターン2「生還した」場合

 一方でパターン2の「生還した」場合も基本的にはその繰り返しです。ですがパターン1と異なるのはユーザから同じ内容の返答(はいorいいえ)がくることです。

つまり、返答の内容だけを判断して次の質問を行うことができないということになります。


 下記はユーザの返答だけで次の王様の発言を決定する場合ですが、Noと言い続けるとループしてしまいバグってします。

つまり、王様が永遠にゲームをやめさせてくれないクソゲーになります。


 それを解決するためにどの質問をしたのか?を質問した際に王様は理解していなければなりません。

そこで使うのが状態遷移という考え方です。

monoist.atmarkit.co.jp

 例えば、TVのリモコンは電源のON/OFFをボタン一つで行うことが出来ます。

これは「TV OFF」「TV ON」といった状態という概念があるので、【電源ボタン】というイベントが一つでも、動作を切り替える(遷移)させることができます。

(丸で囲んだ「TV OFF」「TV ON」が状態、【電源ボタン】がイベント、矢印が状態の遷移)


それを踏まえた上で先ほどの全体図をみると、質問・選択肢としては下記の5つがあります。

  1. 会話の選択
  2. 冒険を記録する?
  3. 何番の冒険の書に記録する?
  4. このまま旅を続けるか? x 2
  5. ここまでの冒険消えるよ?

4は同じ質問ですが返答によって次の質問が変わるので合計で6つの状態があることが分かります。

この合計6つの状態によって会話を成立させていきましょう。

2. 発言内容の理解

 続けて「発言内容の理解」に関してです。

ここでは「はい、いいえ」以外の少し理解が必要な内容の理解に関して説明していきます。


今回の例だと「何番の書に記録する?」という質問は他と返答が異なります。

返答の流れとしては

  1. 王様が「何番の書に記録する?」と質問する
  2. ユーザーが「1番の書」と返答する
  3. 王様が「1番の書に記録したぞ」と発言する


 この際、冒険の書が1〜3番までしかないと、4や5と言われても記録できません。 そのためユーザの「●番の書」という発言から●の部分の数字を理解してそれが1〜3なのかを判断をしてあげなくてはいけません。

 ここで、下手したら形態素解析とかって技術が必要になってきそうですが、その辺りはGoogleさんの力を借りて解決します。


ということで、上記を実装する方法であるGoogle DialogFlowを使っていきます。

Action on Google と DialogFlowのセットアップ

この会話をAction on Google と DialogFlow(API.AI)を使う準備をしなければなりません。

開発の準備に関しては下記リンク辺りが参考になるかと思います。

qiita.com

 上記の設定をすることでGoogle Home miniとGoogle Assistantの連携までは完了するはずです。ここまで出来た方はなんとなくGoogle Home miniに自分の言ったことを反応させることができるということはお分かりの状態かと思います。

 では次からは実際にGoogle DialogFlowの説明に移っていきます。

DialogFlow

f:id:iwathi3:20171201225423j:plain

Action on Google のDialogFlowを使用することで会話のキャッチボールをすることができます。

DialogFlowでは下記の機能を使って実装します。

  1. Contextsによる状態遷移の設定
  2. User saysによるユーザ発言の判断条件の設定
  3. Entriesによるユーザー発言の解析・抽出
  4. Text responseによる次の王様の発言の指定


f:id:iwathi3:20171201234702j:plain

会話のキャッチボール

また、質問のための状態設定の例を下記の手順で設定していきます。

  1. Default Welcome Intentへ初期の状態と発言を設定
  2. 「生還した」Intentへ状態と発言の設定

1. Default Welcome Intentで初期状態を設定

 まず、Default Welcome Intentというのが初期にGoogle Home miniが読み上げる内容になるのでそこに状態と発言の設定をします。


やりたいのは「前の質問についての回答かどうか」という判断です。

そのためにContextで状態を取り扱います。

Contextsの「Add output context」に質問用の状態を設定します。

そしてText responseに質問内容・選択肢を入力します。

f:id:iwathi3:20171201235159j:plain

2. 「生還した」Intentへ状態と発言の設定

 続けて行うのは1でした質問に対する返答によって、更に次の質問をするということです。


1で設定した現在の状態をAdd input contextに入力します。

することで、1の質問と今回の返答が紐づく様になり、User saysに「生還した」と入力すると 【1の質問に対する回答が「生還した」だったら】という意味になります。

そして、次の質問をする際には、1と同じようにAdd output contextへ今回の質問用の状態を設定し、Text responseへ質問の内容を記入します。


ここで、現在の状態は不要になるので、頭の数字を0に変更することで削除を行います。

f:id:iwathi3:20171201235617j:plain


基本的にはこの1と2の繰り返しで会話を成立させることができるようになります。 この様にIntent同士のContextsに関係性を持たせることによって会話を実装することができます。

発言内容の理解

まず冒険の書の番号に使うEntitiesを作成しましょう。 ここでは1〜3を使うので1→1のような対応表のように作成を行います。

f:id:iwathi3:20171202002144j:plain

続いて、Actionの部分でENTITYを設定します。

するとUser saysに入力したものが黄色くなり、その部分の意味を変数とヒモつけて抽出してくれるようになります。

最後にText responseでその変数を使った王様の発言を作成すると、ユーザの返答内容の抽出と引用は完了です。

f:id:iwathi3:20171202002001j:plain

こうすることでどの冒険の書に保存するかを聞き取り、保存するようなことができるようになります。


だいたいこの様な流れを繰り返していくことで今回の王様との会話の流れを実装することができます。

ぜひやってみてください。


ちなみに全体で作成した全てのIntentは下記の様な感じです。

f:id:iwathi3:20171202003934j:plain

まとめ

  • あなたは AIスピーカとの会話を 実装できるようになった
  • あなたは Google Home miniを王様化することが できるようになった
  • あなたは 実際にドラクエでの会話の様なことが できるようになった

今後の予定

 今回はとりあえず経験値の値とかは固定値で設定しましたが、自分のその日のTodoの消化具合によって経験値が蓄積されてレベルアップしていくとかTodo消化できなかったら、「死んでしまうとはなさけない」ってなったりする、みたいなのも作れたらいいなーと思っています。

 人生をドラクエ化をすることで、死んだら終わりのクソゲーからスリル満点でワクワクの人生に昇華させたいところです。