Dialogflowのeventを使ってみる。


はじめに

Dialogflowでは、ユーザーのテキスト入力(キーボード or 音声)に対してintentが反応する仕組みですが、テキスト入力の代わりにeventを発生させて、それに反応するintentを作ることができます。ただ、使い方がわかりにくい(情報が少ない)ので、わかる限りで整理してみました。

今回は、あるIntentが呼び出されたら、それがEventを発生させて、別のIntentが呼び出される、という単純な処理を行います。

IntentでのEventの設定。

最初に、Eventが発生した時に 呼び出される側 の設定です。公式の解説はこちらです。Intentの設定でEventsのところにEventの名前(ここではGood morning)を入れるだけです。

こちらのIntentでは、「おはよう」と言うと「おはようございます。今日も良い一日を。」とText Responseを返すようにしました。

Fulfillmentの設定。

今度は、イベントを起こす側の設定です。そのためには、Fulfillmentを設定します。これはWebhookを用いて、intentが呼び出されたことをサーバーへ伝えて、そちらで何らかの処理を行って、結果を受け取ります。公式の解説はこちらこちらをご覧ください。

Fulfillmentは、左のメニューのFullfilmentから設定できます。

今回は、簡単なテスト用にInline Editorを使うので、下のスライダーを押して Enabled にしてください。

これで、index.js 内のスクリプトを編集できるようになります。すでにサンプルコードが書いてありますが、長くて読むのが大変なので、公式のこちらにあるシンプルなコードを基にして作ってみました。

index.js
'use strict';

const functions = require('firebase-functions'); 

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    response.setHeader("Content-Type", "application/json");
    response.send(
     JSON.stringify({
        "followupEvent": {
           "name": "GoodMorning"
        }
     })
    );
   }
);

リクエストに対してJSONを返すだけのスクリプトです。スクリプトにはfulfillmentでeventを発生させるには、上記の通り JSON内にfollowupEventパラメータを設定する必要があります(詳しくは公式ページの下の方を参照)。これを設定すると、speech, displayText, dataフィールドは無視されるの注意してください。

コードを入力したら、右下のDeployボタンを押せば、実行可能になります。

Eventを呼び出すIntentの設定

イベントを呼び出す側のIntentを作りましょう。「あいさつはじめ」と入れると呼び出されます。

今までと違って、Intent設定画面の下に、Fulfillmentに関する設定が出てきます。ここで、Use webhookを有効にしてください。

注意:webhookを有効にするのは、呼び出す側だけです。呼び出される側には不要です。

やってみる

画面右のシミュレータでテストしましょう。”try it now”のところに「あいさつはじめ」と入れると、Eventが起きて、あさのあいさつのIntentが実行されます。

下のSHOW JSONボタンを押すと、何が起きたかがわかります。

ここで重要なのはmetadataのExectionSequenceで、これを追っていくと、何がEventを発生させて、その結果何のIntentが起こったのかがわかります。

おわりに

とりあえず、もっともシンプルな形でEventを発生させられました。ただし、現状では何のFulfillmentでも必ずGoodMorningイベントが発生してしまうので、修正が必要になります。それについてはまた今後。