こんにちは、 west-c です。
スマートスピーカー、国内でも各社から販売され盛り上がっていますね。 私も弊社開発チーム内での GoogleHome モニター選考に当選し*1、自宅で使い方を模索中です。
GoogleHome(厳密には GoogleHome 内蔵のGoogleアシスタント)は、ユーザが自由にアプリを開発したり公開したりすることができます。 簡単な対話アプリであればノンプログラミングで作成することも可能です。 今回は、自分で作成したスクリプトと組み合わせたアプリの作成手順を説明したいと思います。
作成するアプリの説明
今回は「指定した路線の遅延有無を教えてくれるアプリ」を題材に説明します。以下のような会話が行えることを目標としましょう。
このアプリの流れを図にすると以下のようになります。
図内に登場する単語を簡単に説明します。
- Action on Google:Google アシスタント対応のアプリ開発を行えるプラットフォームです。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を選択します。
CREATE ACTIONS ON DIALOGFLOWをクリックすると、Dialogflowのコンソールに遷移します。
Dialogflowでエージェントを作成する
ここからDialogflow上での設定になります。 コンソールには以下のような画面が表示されるので、CREATEをクリックします。
今回 Dialogflow で設定することは大きく以下の3点です。 順番に設定していきましょう。
- Entitiesの作成
- Intentsの作成
- Fulfillmentの実装
Entitiesを作成する
Entitiesでは、ユーザからの入力として受け付ける単語を定義します。例えば、Dialogflowで提供しているEntityに@sys.color
がありますが、これは色名の単語(赤色・青色・黄色など)が定義されています。 「赤」という入力を「赤色」と判断するなど、単語の揺れを補正することも可能です。
今回は電車の路線名を入力として受け取る必要があるため、路線名を定義する @train-route
というEntityを新しく作成します。 Entityの作成は Entities> CREATE ENTITYから行います。
左側(reference value)には「パラメータの単語」を、右側(synonym)には「その単語の同義語」を入力します。 日本語の場合、ひらがなで認識される可能性もあるため synonym にひらがなも入力すると良いでしょう。 上記の場合、ユーザが「おだきゅうせん」や「小田急」と発言しても、「小田急線」として認識されます。
作成が完了したらSAVEで保存しましょう。
Intentsを作成する
Intentsではユーザの会話によってどの処理を実行するのかを定義します。
今回は「路線名
の遅延情報を教えて」という会話に反応するIntentを作成するため、Intents > Default Welcome Intentで以下のように編集しました。
- 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 で表示されるエディタにスクリプトを記述しましょう。
今回実装したコードは以下のようなものです。 遅延情報を取得する処理は割愛しますが、API等を利用するなどして遅延有無をisDelay
フラグにセットする想定です。
下部のDEPLOYボタンを押せばFirebaseへのデプロイが完了します。
IntentからFulfillmentを呼び出すためには、Intents > Default Welcome Intent > Fulfillment > Use webhook にチェックを付けてください。
動作確認をする
これで設定は概ね完了したので、動作確認をしてみます。 右側のテキストエリアに会話文を入力することで、Dialogflowでの動作確認を行えます。 早速「おだきゅうの遅延情報を教えて」と入力してみましょう。
USER SAYSにはユーザが入力した文章が表示されます。 作成したEntity@train-route
にて、「おだきゅう」は「小田急線」の同義語と定義したため、パラメータtrain-route
には小田急線
がセットされています。 このパラメータがセットされた状態でFulfillmentが呼び出され、レスポンスとして「現在小田急線では遅延は発生していません」という文章が返ってきました。
GoogleHome実機でのテストは、Integrations > Google Assistant > TEST でGoogleアシスタントと連携することで実施できます。
おわりに
以上でGoogleHome上で動作するアプリを作成することができました。 Dialogflow自体はSlackやTwitterとも連携しているため、今回説明した内容を応用すればアプリ開発やBot開発の幅が広がりそうですね。 ほぼすべての設定をWeb上で実施でき敷居も低いと思いますので、皆さんもぜひお試しください。
お知らせ
ラクスでは去年に引き続き、ラクス Advent Calendar 2017を実施いたします! Qiitaにカレンダーを公開していますのでお楽しみに。
qiita.com