「本気のしりとり」Google Homeアプリを作りました。

こんなの作りました。

こんにちは。GMOソリューションパートナーのH.Tです。
Google Homeを買いました。
リビングにBluetoothスピーカーがほしいなあと思っていた矢先、
半額セールをしていたので会社の昼休みに衝動買いしてしまいました。
因みに社内の他の方はみなさんAmazon Echo派の方が多いですね。

色々試してみて便利だったのですが、しりとりができなかったんです。
僕はGoogle Homeにしりとりの相手をしてほしかったのですができないようです。
正確に言いますとやってみるもののなぜか速攻で「ん」を付けて自爆してしまうんです。
相手すんのめんどくさいってことでしょうか。

だったら。Google Assistantに本気のしりとりというものををたたきこんでやる!
と、アプリを作ってみることにしました。

Google Homeとはご存じのとおりスマートスピーカーで
中身はGoogle AssistantというAIになっています。
そのGoogle Assistantから呼び出されるサードパーティのアプリは
Actions On Googleというプラットフォームから作ることができます。

こちらをご一読いただくと概要がつかめるかと思います。
Google Home アプリ開発の流れ

以下、今回行ったアプリ開発の簡単な流れとなります。
1.Actions On Google
→プロジェクトを作る。

2.Dialogflow
→会話の設計、
アプリの実装(FirebaseというMBaasが使われます。)

3.Firebase
→アプリのログ、データベースの確認など
(Firebase Functions→ロジック)
(Firebase Databse→DB)

 

今回作ったしりとりアプリの概要


Googleのチュートリアルを参考に筆者が作成

 

1.Actions On Goole
から新規プロジェクトを作成します。
「ACTIONS CONSOLE」をクリックします。

 

↓ Add/import projectをクリックします。

 

↓ プロジェクトネームを入れてリージョンを選択して「CREATE PROJECT」をクリックします。

 

↓ 今回はDialogflowでアプリをつくりました。Dialogflowの「BUILD」をクリックします。

 

↓ ポップアップが開いたら「CREATE ACTIONS ON DIALOGFLOW」をクリックします。

この後はDialogflowでの作業になります。

 

2.Dialogflow

Dialogflowは音声認識の処理からアプリをトリガーするところを設定できます。
アプリのソースコード自体もInline Editorという画面で編集することができます。
(今回はInline Editorは使わずローカルで開発、デプロイしました。)

まずはAgentの作成になります。(AgentとはDialogflowでのプロジェクト)

「CREATE」をクリックします。

 

↓ 次にインテントの一覧画面になります。

・Intent
Intentは処理のトリガーとなる言葉とそれに紐づく処理を定義します。
デフォルトでアプリ呼び出し用のウェルカムインテントと

会話が途切れた時のフォールバックインテントが存在します。

今回作ったしりとりアプリにはデフォルトのインテントに加えて下記を追加しました。

・shiritori メイン処理用

・shiritoriOwari 「しりとり終わり」と言われた時の処理用

・end 「やめる」とか「おわる」とかで中断したとき用

 

↓ しりとりアプリのウェルカムはこのようになっています。

呼び出しワードをいろいろ登録しましたw 「User Says」の欄に入力してエンターで登録されます。
「Action」が呼び出し関数のキーとなります。デフォルトのままで大丈夫です。
fulfillmentのwebhookにチェックを入れましょう。
(後述のフルフィルメントの設定をしないとここの選択肢が出ません。フルフィルメントを作成したら戻ってきましょう。)

 

↓ shiritoriのインテントです。
「User says」に「めだか」と入れてありますが何でもいいです。
「Action」を「shiritori」とました。これが呼び出し関数のキーとなります。
「User says」の「めだか」をダブルクリックするとメニューが出てきますので「@sys.any」を選んで画像のようになればOKです。
フルフィルメントは前述のとおりです。

 

↓ endのインテントです。
終わりたいときの単語を登録しText responseにグーグルアシスタントの返事を入力します。

 

↓ shiritoriOwariのインテントです。
画像のとおり設定します。

 

ここまででインテントの設定は一通り終わりです。
これだけでも発話のテストができます。「Try it now」に入力してみましょう。

 

・Entities
会話の中で抽出したい単語と表記ゆれを定義します。
(今回は使わないので説明は省きます。)

 

・Fulfillment(ドキュメント)
実行処理の定義です。WebhookかInline Editorをのどちらかを選べます。
ここでwebhookの設定をします。
Inline Editorは使わないのですが、アプリのソースコードのベースにしたいのでコピーして保存しておきます。
その後Inline EditorのスライダーをDISABLEDにします。

WebhookにダミーのURLを入れて(まだデプロイしてないので)saveしておきます。(これでインテントのwebhookが選択できるようになります。)

 

さあ。やっとここからソースコードを書き始めます。
今回はローカルでの開発をご紹介します。
まずはお使いのPCかMacにnode.js(v6.11.1)をインストールしてください。
それから任意のディレクトリを切って移動します。
そしたらfirebaseようの初期設定をしていきます。

JavaScriptかTypeScriptかとか聞かれますので適宜選択します。

うまくいったら、functionsフォルダが作成されますので下記の通り実行します。

しりとりの処理に形態素解析が必要だったのでKuromojiを入れています。

そしたら./functions/index.jsを編集します。

ソースきたないですがこんなです。

編集したらデプロイします。

ここまででうまくいったらfirebaseのコンソールに行ってみましょう。

ログインしてコンソールに移動します。

左メニューの「Database」を選択して

データベースにしりとり辞書用のマスターデータをインポートします。

辞書の作成はこちらのAPIを使わせていただきました。

こんな感じで辞書のマスターデータと状態保持のためのjsonデータを登録しました。
これでdatabaseとfunctionがすべて揃ったのでdialogflowのフルフィルメントにWebhookを設定してあげます。

これでアプリは動くはずです。
ソースコードに関する説明がほとんどできず申し訳ありません。
ドキュメントをご参考ください。

Dialogflowに戻ります。
Integrationsを選択し、Google Assistantの「INTEGRATION SETTINGS」をクリックします。

 

↓「Implicit invocation」にインテントを入力して「TEST」をクリックします。

 

↓するとActions on GoogleのコンソールのSimulator画面に飛ぶのでこちらのweb画面上から動作テストができます。
また、この状態で「テスト用アプリにつないで」とGoogle Homeに言うと実機テストもできます。

 

あとはFirebaseコンソールに行ってログなどを確認しましょう。

3.Firebase
コンソールからログやアクセス状況などを確認できます。
リアルタイムデータベースなのでGUI上で更新されるデータを確認できます。

以上となります。

 

実際の動きを動画にしてみました。
データの更新がリアルに見えるのでテストしやすいですね。