シーンから、日々の取り組みを裏表なく発信します。シーンから、日々の取り組みを裏表なく発信します。シーンから、日々の取り組みを裏表なく発信します。vol.1こんにちは、イシイです。弊社では社内会議室の施設予約管理をGoogleカレンダーで行っているのですが、今回はスマートスピーカーなどを通じて音声対話形式でこの施設予約ができるようなアプリケーションの開発にトライしてみたいと思います。音声対話形式のアプリケーションは、Googleアシスタントからの利用を想定して作ってみたいと思います。Googleアシスタントを使ったアプリを作成するにはGoogleアシスタントから会議室予約を行う場合、フローのイメージとしては、Googleアシスタントから会議室予約アプリを内部的に呼び出し、呼び出された会議室予約アプリとの対話で会議室予約まで行うような流れになります。Googleというものになります。SDK」といったものが用意されているようです。「テンプレート」を使うと、ユーザーの問いに対して予め用意した回答を返すような、特定の限られた応答などを行うものをコードを書かずに作成できるようです。SDK」ではIDE部分が担っているビルドやデプロイまでを手動で行う形式のようです。SDKを使ってね、と大括りで捉え、今回はDialogflowを使ってみることにしました。対話内容をイメージしてみるまずは、施設を予約を行いたいユーザーと、それに応答するアプリケーションの会話イメージを起こしてみます。今回は予約状況の確認や予約のキャンセルなどの処理は考えず、一方通行で予約登録を行う場合のみを考えます。」アシスタント:「こんにちは。予約したい日付は何月何日ですか?」ユーザー:「7月1日」アシスタント:「開始時間は何時からですか?」ユーザー:「14時」アシスタント:「時間はどれくらいですか?」ユーザー:「1時間」アシスタント:「どこの会議室を使用しますか?」ユーザー:「A1会議室」アシスタント:「かしこまりました。7月1日の14時から1時間、A1会議室を予約しました。以上のような流れをイメージしてみます。これらの要素を対話の中で決定し、すべての要素が取得できたら予約処理を行う、という仕組みになりそうです。CONSOLE」からコンソールページへと移動します。LANGUAGEを「日本語」に、タイムゾーンを東京にして「CREATE」を実行します。今回は「4009」というエージェントを作成してみました。Intent」というインテントが入っています。インテントとエンティティここから進める前に、これから作業などに出てくるインテントとエンティティについて、先に触れておこうと思います。software.とあるので、おおまかにはユーザーとの対話におけるアクションを定義するもの、と解釈できそうです。EntitiesとしてEntitiesの項目を追加していくような感じのようです。イベントが指定されています。ポイントであることを示します。アシスタントはこのイベントを使ってアプリを起動します。あるので、「事前に準備された、アプリケーション起動時に最初にユーザーと対話するアクションを設定するもの」というように解釈できそうです。今回の対話イメージに沿って、起動時の最初の対話部分を作ってみます。responsesフィールドに「こんにちは!」というテキストが既に入っているので、「こんにちは。予約したい日付は何月何日ですか?」に書き換えて、「SAVE」を実行します。これで、ユーザーがアプリを開いたときの最初のアクションができました。Intent」は、ユーザーとの対話の中でこちらが意図して設計したもの以外のアクションのとき(例えば、何を言ったのか聞き取れなかったとき。該当のエンティティがないときなど)に使われそうです。今回は特に手を加えずにそのままにしておきます。場所」になりますが、インテントがおおまかに「ユーザーとの対話におけるアクションを定義するもの」とした場合、インテントの作成方法が2つ考えられます。ひとつは「会議室予約に必要な要素を対話の中で聞き出す」といった要素全体をひとつのインテントで取得しきってしまう方法、もうひとつは各要素を取得するインテントをそれぞれ作成していく方法です。今回は、前者のひとつのインテントで取得する方法を試してみたいと思います。ACTION」をそれぞれ押下し、メニューを開きます。開いた状態がこちらです。Intent」としました。phrases」にユーザーからの返答の仕方などを登録していきます。ここでは試しに、「7月1日」「7月の1日」「7月1日でお願いします」「7月」「1日」というように、月日まで言うパターン、月日の他に言葉を添えるパターン、月か日しか言わないパターンなどをいくつか登録してみました。入力を済ますと、要素に該当しそうな部分が自動で解析されハイライト表示されます。ハイライト表示された部分にズレがある場合には、カーソルをあわせて手動で調整することも可能です。parameters」の方にも要素が追加されていて、マッチする要素が色分けされていることがわかります。Entitiesです。Entitiesのページで見ることができますが、今回の最初の対話部分で欲しいのは「月」と「日」になりますので、「月」の部分が「@sys.date-period」、「日」または「月日」の部分が「@sys.date」であって欲しいので、このENTITYの項目は自動で割り当てられたものがそのまま使えそうです。この月日の要素は必ず取得したい要素なので、REQUIREDの項目にチェックを入れます。prompts」というリンクテキストが現れました。prompts」で指定した内容でレスポンスを返し、別のインテントに飛ばないようにする仕組みのようです。prompts」をクリックし、「予約したい日付を月日で教えてください。ここでは、「date」の方にはREQUIREDのチェックを入れ、「date-period」の方にはREQUIREDのチェックを入れませんでした。「date-period」で取得できる部分は月のみであり、結局のところここで取得したものは月日に該当する「date」の方だけなので、ユーザーが月だけしか伝えてこなかったときに「date-period」の方で補完されます。phrases」で入力したユーザーからの返答の仕方に応じて出来た項目をベースに作ってみています。場所」を作っていきます。つのフレーズで必要な入力情報をすべて話す必要もありません。して設定することができます。これによりエージェントは、ユーザーが必要なすべてのパラメータを指定するまで、入力を処理しません。このスロット充填機能を使って進めます。parameters」に追加してみます。prompts」に「開始時間は何時からですか?」を設定します。parameters」に追加します。prompts」に「何時間のご利用ですか?」を設定します。最後に、「会議室の場所」を作成したいのですが、会議室の場所というものは限られており、ユーザーが発した言葉のどこでも良い、というわけではありません。Entitiesというものを使います。左サイドメニューの「Entities」から、独自のエンティティの作成が行なうことができます。今回作成したいエンティティは「会議室の種類」で、種類は「A1会議室」と「A2会議室」の2つのみとします。ENTITY」からエンティティ作成ページを開きます。ここではエンティティ名を「RoomType」としました。Synonyms」にチェックが入っていますが、これは指定した名称の類義語を許容するかどうかのチェックボックスで、こちらを有効にしておくことで、「A1会議室」という呼び名だけでなく、類義語登録した呼び名(例えば、A1、エーイチ、エーワンなど)も「A1会議室」として認識できるようになります。Expansion」の方は、ここで登録していない類義語についても自動で追加していくようですが、今回は使用せず、定義した類義語のみで進めてみますので、チェックは付けずにそのままにしておきます。作業後の画面は下記になります。「A1会議室」「A2会議室」というValueとそれに紐づく類義語を登録してみました。Mapping」にあたります。左サイドメニューの「Intents」から、先程作成途中だったインテントを選択してページを開きます。parameters」に追加してみます。prompts」に「どの会議室をご利用ですか?」を設定します。prompts)などの設定が終わりましたので、すべての要素が揃った後の応答部分を作成します。RESPONSE」をそれぞれ押下し、メニューを開きます。parameters」の項目で設定した「VALUE」を使うことで、取得した要素を変数として返答内容に盛り込むことができます。7月1日の14時から1時間、A1会議室を予約しました。いうようなレスポンスを返したいので、「かしこまりました。$dateの$start-timeから$use-time、$room-typeを予約しました。conversation」をONにしておきます。Googleで提供されているシミュレータを使って動作を確認してみたいと思います。アクティビティ」の3つのアクセス許可をオンにします。SETTINGS」をクリックすると、下図のような画面になります。Intent」が入力された状態になっていますが、これはGoogleアシスタントからアプリを呼び出したときに表示されるインテントが指定されています。Intent」にて、レスポンスを「こんにちは。予約したい日付は何月何日ですか?」と指定したので、アプリを呼び出したときにはこちらのレスポンスで返してくることになります。Googleのシミュレータ画面へ遷移し、音声またはキーボードから対話をしてみます。これで、対話の中で会議室予約を行うために必要な要素を取得し、対話を終了する流れまでができました。次回に向けて今回はDialogflowを使って、対話から会議室予約に必要な要素を得るところまでを作り、その動作をシミュレータで確認するところまで行ってみましたが、Googleカレンダーの予約を行うまでにはまだいくつか対応が必要です。1番肝心な部分であるカレンダーとの連携機能についてはまだ触れていません。Dialogflowのレスポンス機能を使った応答まではできていますが、カレンダーとの連携機能の処理を行うにあたっては、今回触れなかったフルフィルメントの機能を使って実装を進める必要があります。細かいところだと、シミュレータからの返答が「かしこまりました。2018-07-01の14:00:00から1時、A2会議室を予約しました。」となっていて、利用時間の部分は「1時間」と取得して返してきてほしかったのですが、ここでは「1時」となってしまっています。Entitiesの@sys.durationに該当するところですが、想定と違う形になってしまっているので、ここをうまく処理してあげたり、Googleアシスタントからの呼び出しが「テスト用アプリにつないで」となっているので、ここを今回用のアプリ名称から呼び出すように変更する必要もあります。最後に実機での確認もしたいところです。これらの部分については、次回エントリーにて進めてみたいと思います。CORPORATION.。