RAKUS Developers Blog

株式会社ラクスのエンジニアブログ

GoogleHomeアプリを開発しよう!Dialogflowチュートリアル

こんにちは、 west-c です。

スマートスピーカー、国内でも各社から販売され盛り上がっていますね。 私も弊社開発チーム内での GoogleHome モニター選考に当選し*1、自宅で使い方を模索中です。

GoogleHome(厳密には GoogleHome 内蔵のGoogleアシスタント)は、ユーザが自由にアプリを開発したり公開したりすることができます。 簡単な対話アプリであればノンプログラミングで作成することも可能です。 今回は、自分で作成したスクリプトと組み合わせたアプリの作成手順を説明したいと思います。

作成するアプリの説明

今回は「指定した路線の遅延有無を教えてくれるアプリ」を題材に説明します。以下のような会話が行えることを目標としましょう。

ユーザ:「OK Google, XX線の遅延情報を教えて」
GoogleHome:
(遅延が発生している場合)「XX線で遅延発生中です。」
(遅延が発生していない場合)「現在XX線では遅延は発生していません。」

このアプリの流れを図にすると以下のようになります。 f:id:west-c:20171128171848p:plain

図内に登場する単語を簡単に説明します。

  • Action on GoogleGoogle アシスタント対応のアプリ開発を行えるプラットフォームです。Action on Googleで作成するアプリの単位をプロジェクトと呼びます。
  • Dialogflow:自然言語対話のプラットフォームです。Dialogflowを使うことで、GUIで簡単に会話形アプリを作成することができます。Dialogflowで作成するアプリの単位をエージェントと呼びます。
  • 遅延情報取得プログラム:今回作成するスクリプトです。遅延情報の取得処理はこのスクリプトで行います。Dialogflow 上でFulfillmentとして設定することで Dialogflow と連携することができます。

以下から詳細な手順を説明します。

Action on Googleでプロジェクトを作成する

GoogleHomeと連携しているGoogleアカウントでAction on Googleのコンソールにアクセスし、Add/import project から新しいプロジェクト TrainDelayInfo を作成しましょう。
作成したプロジェクトをクリックし、ADD ACTIONSから Dialogflow のBUILDを選択します。 f:id:west-c:20171127160038p:plain

CREATE ACTIONS ON DIALOGFLOWをクリックすると、Dialogflowのコンソールに遷移します。

Dialogflowでエージェントを作成する

ここからDialogflow上での設定になります。 コンソールには以下のような画面が表示されるので、CREATEをクリックします。 f:id:west-c:20171127161851p:plain

今回 Dialogflow で設定することは大きく以下の3点です。 順番に設定していきましょう。

  • Entitiesの作成
  • Intentsの作成
  • Fulfillmentの実装

Entitiesを作成する

Entitiesでは、ユーザからの入力として受け付ける単語を定義します。例えば、Dialogflowで提供しているEntityに@sys.colorがありますが、これは色名の単語(赤色・青色・黄色など)が定義されています。 「赤」という入力を「赤色」と判断するなど、単語の揺れを補正することも可能です。

今回は電車の路線名を入力として受け取る必要があるため、路線名を定義する @train-route というEntityを新しく作成します。 Entityの作成は Entities> CREATE ENTITYから行います。

f:id:west-c:20171127170046p:plain

左側(reference value)には「パラメータの単語」を、右側(synonym)には「その単語の同義語」を入力します。 日本語の場合、ひらがなで認識される可能性もあるため synonym にひらがなも入力すると良いでしょう。 上記の場合、ユーザが「おだきゅうせん」や「小田急」と発言しても、「小田急線」として認識されます。

作成が完了したらSAVEで保存しましょう。

Intentsを作成する

Intentsではユーザの会話によってどの処理を実行するのかを定義します。

今回は「路線名の遅延情報を教えて」という会話に反応するIntentを作成するため、Intents > Default Welcome Intentで以下のように編集しました。

f:id:west-c:20171127172330p:plain

  • User says:このIntentとして認識される例文を入力します。追加で「路線名は遅延している?」という呼びかけでも認識するようにしました。黄色背景部分(路線名)はパラメータとなる部分です。
  • Action:上のテキストボックスにはアクション名を指定します。後述のFulfillmentの実装で利用します。2つ目のテーブルではパラメータを指定します。
    • REQUIRED:必須有無を選択できます。必須の場合、このパラメータが入力されないと次の Intent には遷移しません。
    • PARAMETER NAME:パラメータ名です。Fulfillmentにてパラメータを識別するために利用します。
    • ENTITY:このパラメータのEntityです。今回は先ほど作成したEntityの@train-routeを指定しています。
    • IS LIST:複数の値を受け取る場合に指定します。
    • PROMPTS:パラメータの入力を促す文章を定義します。REQUIREDにチェックしたパラメータについて、ユーザからの入力が無かった場合やEntityに存在しない単語を入力された場合に使われます。
  • Response:このIntentでのユーザへの返答を定義します。今回はFulfillmentを使って返答するため、デフォルトで設定されているものは削除します。

作成が完了したらSAVEで保存しましょう。

Fulfillmentを実装する

IntentとEntityを使って路線名は取得できましたので、いよいよFulfillmentで遅延情報を確認するスクリプトを書いていきましょう。

今回は、Fulfillmentの実装に Firebase というサービスを利用します。 DialogflowはFirebaseと連携しているため、Dialogflow上でFulfillmentの実装・デプロイをすることができます。

Fulfillment > Inline Editor > ENABLED で表示されるエディタにスクリプトを記述しましょう。 f:id:west-c:20171127175826p:plain

今回実装したコードは以下のようなものです。 遅延情報を取得する処理は割愛しますが、API等を利用するなどして遅延有無をisDelayフラグにセットする想定です。

'use strict';

process.env.DEBUG = 'actions-on-google:*';
const App = require('actions-on-google').DialogflowApp;
const functions = require('firebase-functions');

// Intentのアクション名を指定
const NAME_ACTION = 'confirm_delay';

// パラメータのPARAMETER NAMEを指定
const ROUTE_ARGUMENT = 'train-route';

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    const app = new App({request, response});

    function confirmDelay (app) {
        // 路線名を取得する
        let route = app.getArgument(ROUTE_ARGUMENT);

        let isDelay = false;

        /* 指定した路線の電車遅延情報を取得する処理をここに書く */

        if (isDelay) {
            app.tell(route + 'で遅延発生中です。');
        } else {            
            app.tell('現在' + route + 'では遅延は発生していません。');
        }
    }
    let actionMap = new Map();
    actionMap.set(NAME_ACTION, confirmDelay);

    app.handleRequest(actionMap);
});

下部のDEPLOYボタンを押せばFirebaseへのデプロイが完了します。

IntentからFulfillmentを呼び出すためには、Intents > Default Welcome Intent > Fulfillment > Use webhook にチェックを付けてください。 f:id:west-c:20171127180755p:plain

動作確認をする

これで設定は概ね完了したので、動作確認をしてみます。 右側のテキストエリアに会話文を入力することで、Dialogflowでの動作確認を行えます。 早速「おだきゅうの遅延情報を教えて」と入力してみましょう。

f:id:west-c:20171127181406p:plain

USER SAYSにはユーザが入力した文章が表示されます。 作成したEntity@train-routeにて、「おだきゅう」は「小田急線」の同義語と定義したため、パラメータtrain-routeには小田急線がセットされています。 このパラメータがセットされた状態でFulfillmentが呼び出され、レスポンスとして「現在小田急線では遅延は発生していません」という文章が返ってきました。

GoogleHome実機でのテストは、Integrations > Google Assistant > TESTGoogleアシスタントと連携することで実施できます。

おわりに

以上でGoogleHome上で動作するアプリを作成することができました。 Dialogflow自体はSlackやTwitterとも連携しているため、今回説明した内容を応用すればアプリ開発Bot開発の幅が広がりそうですね。 ほぼすべての設定をWeb上で実施でき敷居も低いと思いますので、皆さんもぜひお試しください。

お知らせ

ラクスでは去年に引き続き、ラクス Advent Calendar 2017を実施いたします! Qiitaにカレンダーを公開していますのでお楽しみに。 qiita.com

参考

*1:選考方法:じゃんけん

Copyright © RAKUS Co., Ltd. All rights reserved.