Google Home, Nest Hub向けにアクションを作ろう - 第2話: Dialog Flow & Webhook
アクションを作るため、Googe Homeを使った一連の会話の流れがどのように処理をされているか説明します。
単純な会話のフロー
声 -> Google Home(マイク) -> Google Assistant -> Dialog Flow -> Google Home(スピーカー)
という流れになります。
1.声がGoogle Homeのマイクに拾われる
2.Google Homeの中のGoogle Assitsantが声をテキスト(文字)に変換する。
3.Google Assistantがテキスト変換された文字列の構文を解析・解釈し、アクションを呼び出す
(アクションを呼び出す=Dialog Flowで作られたIntentを呼び出す)
4.Dialog Flowのインテントが呼び出され、我々が作った会話のルールに従って、返答を生成する
5.スピーカーがこの返事を音声で再生する。
複雑な会話のフロー
声 -> Google Home(マイク) -> Google Assistant -> Dialog Flow -> Firebase Functions (Webhook) -> Dialog Flow -> Google Home(スピーカー)
1.声がGoogle Homeのマイクに拾われる
2.Google Homeの中のGoogle Assistantが声をテキスト(文字)に変換する。
3.Google Assistantがテキスト変換された文字列の構文を解析・解釈し、アクションを呼び出す
(アクションを呼び出す=Dialog Flowで作られたIntentを呼び出す)
4.Dialog Flowのインテントが呼び出される。
5.返答をするためのルールを複雑に構成したい場合をリクエストを一旦、Firebase Functionsに投げる。
6.Firebase Functions内で、リクエストを受け取り、ここで返答を生成する。
7.この返答をDialog Flowを経由してスピーカーに返す
5.スピーカーがこの返事を音声で再生する。
ここでいう、「単純な場合」と「複雑な場合」の境界は曖昧ですが、
- データベースを使うとき (例:しりとりなどで言葉のデータベースを参照する。)
- 外部のAPIを使いたいとき (例:天気をAPIを使って取得する)
- 外部のファイルを使いたいとき(例:音声ファイルを使ってBGMを流す)
- じゃんけんやしりとりなど返答にゲーム性やロジックが絡むとき
のようなときは、複雑、つまりFirebase Functions (Webhook)を使うことになると思います。
Webhookとは
Firebase Functionsは、普通のWeb APIを使うときにも使いますが、アクションを作るときには、このFirebase FunctionsのことをWebhookと言うことがあります。
Webhook=Web APIで、会話をフックする(会話の内容を言葉を引っ掛けて、違う返答を生成する)というような意味で、Webhookという呼び方をします。
Webhook = 会話をフックするWeb APIということなので、実はFirebase Functions以外でもPythonなど他の言語でも対応するAPIを作ってWebhookとして使うことができるのですが、現在はFirebase Functionsが一番Googleのサポートも厚く王道となっています。
Webhookと言われたら、Firebase Functionsの部分なのだと思って読むと公式のドキュメントも読みやすくなります。
Dialog Flowとは
先にWebhookのほうから説明してしまいましたが、Dialog Flowは一番最初に会話のリクエストを受け付けるゲートウェイです。Dialog Flowには、
1.会話の内容ごとに受け皿を作り、これをインテント呼びます。
1つ1つの会話の受け皿=インテント
2.インテントで受けた後、その中から、こちらの知りたい言葉を抽出します。
このこちらが知りたいキーワードのことをEntity(エンティティ)といいます。
Entity = こちらが知りたいキーワード
こちらが知りたいキーワードとはなんでしょうか?
例えば、我々がユーザーの年齢を知りたいと思い
”あなたは何歳ですか?”
とGoogle Homeを介して聞くとします。
ユーザーが
”私は30歳です”
と応えた場合、
”私は39歳です”という文字列の中から39という部分だけ抜き取って教えてくれたら便利ですよね?
この場合知りたいキーワードは”年齢の値”ということになり、これを1つのEntityとして定義します。
Entityとして定義するとは、”私は39歳です”という言葉の中にIntegerの値が1つあり、それが年齢に値するはずだ。
と定義することです。
このようにEntityを定義すると、
Dialog Flowが勝手に文章を解析し、Integerである部分を探してその値(39)をEntityに格納してくれます。あとは、このEntityを使えば
”えぇ、30歳なんですね?”
というようなオウム返しの返答を作る事もできますし、
”もうすぐ、40ですねえ。。”というような返答を作ることができます。
このようにDialog Flowの仕事は、Entityに知りたいキーワードの値を入れることと言っていいでしょう。
本日のまとめ
簡単な会話は
声 -> Google Home(マイク) -> Google Assistant -> Dialog Flow -> Google Home(スピーカー)
複雑な会話のフロー
声 -> Google Home(マイク) -> Google Assistant -> Dialog Flow -> Firebase Functions (Webhook) -> Dialog Flow -> Google Home(スピーカー)
Webhook=会話をフックするWeb APIで、Firebase Functionsで実装する。
会話から抽出したいキーとなる言葉の定義をEntityという。
Entityを定義する目的は会話からキーとなる言葉の値を抽出すること
Dialog Flowの仕事は、Entityに知りたいキーワードの値を入れること
返答は、抽出されたEntityの値を使って生成する
Entity = 年齢 = 39 -> ”もうすぐ40歳ですね!”
このブログに関する質問やActions on Googleの開発の相談はこちらから↓↓↓
@mizutory
mizutori@goldrushcomputing.com
次回からいよいよアクション制作のプロジェクトを作ります。第3回 プロジェクトの作成 ↓↓↓