連載
» 2018年01月19日 05時00分 公開

Google Homeプログラミングを始めよう:DialogflowからAzure Functionsを呼び出してみる (1/3)

今回はWebhookを利用して、DialogflowからAzure Functionsを利用してみよう。

[かわさきしんじ,Insider.NET編集部]
「Google Homeプログラミングを始めよう」のインデックス

連載「Google Homeプログラミングを始めよう」

 前回は、Dialogflowを利用して、簡単なGoogleアシスタントアプリを作成した。今回は、DialogflowからAzure Functionsを呼び出してみよう。

作成するアプリ

 ここでは、前回作成したアプリに機能を追加していく。Googleアシスタント対応アプリプロジェクトの新規作成や、インテントの作成、シミュレーターによる実行確認などは前回の記事を参考にしてほしい。

 Azure Functionsを呼び出すといってもその前にはいろいろとやることがある。以下では、次のようなことを行っていこう。

  • エンティティの作成
  • インテントの作成
  • Azure Functionsアプリのスケルトン作成
  • GoogleアシスタントアプリとAzure Functionsアプリの接続
  • 動作確認
  • Azure Functionsアプリの実装

 今回は「電気を点けて」「テレビを消して」などと入力すると、「照明を入れました」「テレビを消しました」などと答えるアプリを作成してみよう(もちろんサンプルなので、そう答えるだけで実際にはそんなことはしない)。この返答する部分をAzure Functionsを使って実装し、DialogflowからはWebhookを利用してこれを呼び出してみる。

エンティティとインテントの作成

 Dialogflowにおける「エンティティ」(Entity)とは、ユーザーの音声やキーボードによる自然言語入力から、何らかの処理を行うためのパラメーターの値を取得するために使うものだ。例えば、「電気を点けて」なら「電気」「点けて」という2つの語を基に照明をオンにすることになる。この「電気」「点けて」(点ける)といった要素がエンティティとなる。「テレビを消して」なら「テレビ」「消して」(消す)がエンティティだ。

 さらに、「電気」「テレビ」は操作の対象、「点けて」「消して」は操作であることから、上の例ではエンティティは「操作」と「操作の対象」の2種類がある。ここではこれらのエンティティに「verb」(動詞)と「objective」(対象)という名前を付けることにする。

 インテント(ユーザーがしたいこと)は、これらのエンティティによって構成される。そのため、インテントを作成する前にまずはエンティティを作成しよう。まずはActions on Googleコンソールで前回作成したプロジェクトを選択して、[Actions]をクリックする(下の画像では8個のエラーが発生しているが、これは画像を用意していないことなどが原因なので、本稿では無視する)。

前回作成したGoogleアシスタントアプリのプロジェクト 前回作成したGoogleアシスタントアプリのプロジェクト

 そして、[Dialogflow actions]リンクをクリックして、[Use Dialogflow to add actions to your Assistant app]ダイアログの[EDIT ACTIONS ON DIALOGFLOW]ボタンをクリックする。

[EDIT ACTIONS ON DIALOGFLOW]ボタンをクリックする [EDIT ACTIONS ON DIALOGFLOW]ボタンをクリックする

 すると[Intents]ページが表示されるが、ハンバーガーボタンをクリックして、メニューから[Entities]を選択する。すると、以下に示すような[Entities]ページが表示される。

[Entities]ページが表示される [Entities]ページが表示される

 ここで先ほど述べたようなエンティティを作成していく。[Create first one]リンクをクリックしよう。

エンティティの作成画面 エンティティの作成画面

 すると、エンティティの作成画面が表示される。最初にobjectiveエンティティ(操作の対象)から作成することにして、エンティティ名には「objective」と入力する。続けて、下にある[Click here to edit entry]をクリックすると、参照値とその同義語を入力する画面が表示されるので、これを入力していく。ここでいう参照値(reference value)とはある種類のエンティティを代表する値のことで、これは同義語(synonym)を持つことができる(この種類のエンティティを「マッピング」と呼ぶ。列挙値など、同義語がない種類のエンティティもある)。例えば、「テレビ」には「TV」という同義語を持たせられる。以下は4つのマッピングを定義したところだ。

マッピングを持つエンティティ「objective」の定義 マッピングを持つエンティティ「objective」の定義

 同義語はユーザーからの入力のぶれを吸収して、何かを参照する特定の値へとまとめるために使われる。例えば、上の例ならユーザーが「TV」と入力しても内部では、それは「テレビ」を参照するものとして扱われる。

 また、エンティティにはシステム定義のエンティティ、今行っているように開発者が定義するエンティティ、ユーザーレベルのエンティティの3種類がある。前回利用した@sys.last-nameはシステム定義のエンティティだ。

 最後にページ上部の[SAVA]ボタンをクリックしてエンティティを保存したら、同様にして、エンティティ「verb」も定義しよう。

エンティティ「verb」の定義 エンティティ「verb」の定義

 「verb」としたはいいが、実際には「入れる」「点ける」などを「On」に、「消す」「切る」などを「Off」にマッピングしている。以上でエンティティの作成が終わったので、次にこれらを利用してインテントを作成しよう。

 作成したエンティティを使って、インテントを作成するにはハンバーガーボタンをクリックして、メニューから[Intents]をクリックする。

[Intents]ページ [Intents]ページ

 [CREATE INTENT]ボタンをクリックすると、次の画面が表示されるので、ここでインテントの作成を行っていく。

インテントの作成画面 インテントの作成画面

 この画面の[User says]領域でインテントがどうなるかを入力していく。テキストボックスにはダブルクオート(")が表示されているが(これを「エグザンプルモード」という。前回はこのモードを使用)、クリックするとアットマーク(@)が表示されるようになる。このモードのことを「テンプレートモード」と呼び、このモードでは先ほど作成したエンティティをアットマーク付きで参照できる。実際の入力は「@エンティティ名:パラメーター名」となる。

 例えば、「テレビを点けて」「エアコンを消して」といった「インテント」はobjective/verbの2つのエンティティを使うと「@objective:objectiveを@verb:verb」といった具合に記述できるということだ(エンティティ名とパラメーター名を同じにしているので、一見面倒くさい表記になっている)。

 これを実際に入力したのが以下だ。インテント名は「家電操作」としてある。

インテントの作成 インテントの作成

 コロンで分けた左側が[ENTITY]欄に、右側が[PARAMETER NAME]欄に表示されている。なお、「エアコンを消して」などの入力が思った通りにパースされるかは右側の[Try it now]ボックスで試せる。以下は「エアコンを消して」と実際に入力した結果だ。

objectiveパラメーターの値は「エアコン」に、verbパラメーターの値が「Off」になっていることが分かる objectiveパラメーターの値は「エアコン」に、verbパラメーターの値が「Off」になっていることが分かる

 verbパラメーターの結果を見ると、「消して」が「Off」になっていることが分かる。マッピングを利用すると、ユーザー入力がぶれても、意味が同じであれば同じエンティティの値が選択されるので、処理が煩雑にならずに済むはずだ。

 実際に、[Actions]領域で今の2つのパラメーターを必須にして、入力がない場合に表示するプロンプトを指定する必要もあるだろう(ここでは設定は省略)。取りあえず、Azure Functionsを呼び出すためのWebhook関連の設定は後にして、今度はAzure Functions側の操作に移ろう。

       1|2|3 次のページへ

Copyright© 1999-2018 Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。