Google Home, Nest Hub向けにアクションを作ろう - 第5話: Intentの作成
本日は、会話の受け皿であるIntentを一から作っていく方法を説明します。
前回のおさらい
前回はDefault Welcome IntentというもともとあるIntentに、「コケコッコー」、「カッカドゥー」などの言葉を入れて、Google Homeから発話させるところをやりました。
このDefault Welcome Intentというのは、アクションが立ち上がったときに一番最初に”一方的に”にしゃべるIntentです。
入力:アプリ起動というイベント
出力:挨拶
というのがDefault Welcome Intentです。
この回では、”ユーザーの呼びかけの言葉に反応して何かを返すIntent”、
入力:ユーザーの何らかの呼びかけ
出力:呼びかけに応じる返答
というIntentを作成していきたいと思います。
Intentを作る
まず、右側のメニューからIntentsをクリックしてIntenents一覧を開きます。
ここでCRETAE INTENTボタンをクリックします
(メニューのIntentsの右の+ボタンを押しても同じことができます。)
まずIntentの名前にwhat_is_thisという名前をつけます。
what_is_this=これはなんですか?という名前のIntentにしました。
Training phrasesに、下のようなフレーズをいれてください。
マグロって何?
ばけつは何?
サメはなんですか?
犬はなんですか?
このTraining phrasesとは何でしょうか?、これは
ユーザーが喋ってくるであろう会話の想定です。
"what_is_thisインテントで受ける会話はこういうものだよ"、という想定の例をここに列挙します。
このインテントでは、ユーザーから聞かれたものが、動物なのか、魚なのか、それ以外なのかを判定する会話を作ろうと思います。(そういう意味でwhat_is_thisという名前にしました。)
マグロって何?
などの会話が想定されるため、そのようなフレーズをここに列挙します。
ここは多ければ多いほど、会話をただしくDialog Flowが判定してくれますが、練習ですので、まずはこの4つのフレーズで始めます。
Entityを作る
次にメニューから、Entitiesを選択します。
ここでは、同じように、CREATE ENTITYボタンを押します。
ここで、animalという名前のEntity nameに設定します。
次に下のClick here to edit entityという箇所をタップし、
Enter reference valueに、イヌ
Enter synonymに、犬、いぬ、イヌを代入します。
第2回で、
Entity = こちらが知りたいキーワード
と説明しました。今回、こちらが知りたいキーワードの一つはanimal、つまり動物です。ユーザーが喋った言葉に動物が含まれているか知りたいため、animalという名前のEntityをつくりました。
それでは、動物に該当するワードが入っているかを判断するための辞書がこのanimal Entityになります。
Entityを作ったら、このEntity内に「何が動物なのか?」という辞書を作らないとけません。それが、上で説明した
イヌ : 犬、いぬ、イヌ
です。Reference value (左辺)はイヌというキーワード、右辺のsynonymが類似後です。
このentryの意味は、「犬、いぬ、もしくは、イヌという言葉をGoogle Assistantが聞き取ったら、これを”イヌ”と解釈する」という定義です。
Google Assistantは、音声を文字列に変換するため、変換された文字が漢字の場合もあればカタカナかひらがなである場合もあります。どれがきても”イヌ”と解釈されるようにこのような辞書を登録しました。
これを更に発展させて、したのように「わんちゃん」をいれてみました。
これで、「わんちゃん」という言葉がユーザーの会話に含まれていても、「イヌ」と解釈してくれるようになります。
せっかくなので、下のようにネコとクマをanimal Entityの辞書として登録しておきます。
SAVEボタンを押して一旦セーブした後、
Entitlesメニュー右の+(プラス)ボタンを押して、もう1つEntityを作ります。
fishという名前のEntityにして、サメ、マグロ、アジを登録します。
SAVEボタンを押して保存します。
Intentに戻って、フレーズをブラッシュアップ
先につくったwhat_is_this Intentに戻って作業をつづけます。
先程Training phrasesは
ユーザーが喋ってくるであろう会話の想定です。
であると説明し、「マグロって何?」、「サメはなんですか?」などのフレーズ4つをいれましたが、当然たった4つでユーザーが喋ってくる会話のすべてを想定はできませんよね?
まず考えつくのは、マグロ、サメの部分に違う動物や魚が来るであろうし、ばけつの部分に全然違う言葉、ちりとり、やかん、宇宙船など何でも入ってくる可能性があり、それを列挙したらきりがありません。
このTraining phrasesの想定の幅を一気に広げるのが先程つくったEntityです。
Entityを使ってIntentが受けられる会話の幅を広げる
Training phrasesのマグロの部分をマウスで文字をコピーするときのように選択すると、下のようにEntityのリスト出てきます。
このリストから、@fishというものを選択します。すると、下のように、マグロの部分がピンクでマーカー付され、したのように、fishというentityがついたことがわかります。
同じように、犬をマウスでクリック&ドラッグして選択し、@animalを選択します。
こうすることで、犬の部分がオレンジにマークされ、@animal Entityが割り当てられます。
こうすることで、犬の部分がオレンジにマークされ、@animal Entityが割り当てられます。
これで、
マグロって何?
とうトレーニングフレーズは、fish Entityに登録した他の魚に対しての想定も含むことになります。fish Entityにはさきほど「サメ」と」「アジ」を登録したので、「サメってなに?」と「アジって何?」という言葉も想定に含まれることになりました。fish Entityに魚の名前の辞書を追加することで追加した魚全てにこのフレーズが反応する(想定の対象とする)ようになります。
同様に
犬はなんですか?
というTraining phraseもanimal Entityに含まれる動物(ネコ、クマ)も想定にいれることになりました。
このようにして、what_is_thisインテントが受け皿として受けられるフレーズの幅がEntityによって一気に広がりました。
それでは、残りのサメはなんですか?のサメの部分にも@fish Entityを割り当てましょう。
また、ここまできて、2つのフレーズが抜けているのに気づきましたので、いかのフレーズを足してください。
犬って何?
ばけつはなんですか?
「犬って何?」の犬の部分に@animal Entityを割り付けます。
今、皆さんのTraining phrasesはこのようになっていると思います。オレンジのところに@animal(動物のEntity)、ピンクのところに@fish(魚のEntity)が割り当てられています。
System Entityを使ってIntentが受けられる会話の幅をさらに広げる
次に、
ばけつはなんですか?
ばけつってなに?
の「ばけつ」のところにEntityを割り当てます。
ばけつの部分をマウスで選択し、リストのなかにある@sys:anyというSystem Entityを選択します。
この@sys.anyとは、「any=すべての単語」を意味するEntityであり、この部分には「ありとあらゆる単語が来ます」という想定をつくることができます。
このように定義することで、@animal Entityでも@fish Entityでも想定していないフレーズで「***って何?」、あるいは「***はなんですか?」というフレーズがきたら、すべてこの@sys:anyを使ったフレーズが受け皿として機能するようになります。
最終的にこのようなTraining phrases (フレーズの想定)が出来上がりました。
ここまでで、このwhat_is_thisエンティティが
「***って何?」
と
「***はなんですか?」
の2つのフレーズを受けることができるようになりました。
次にこの受けたフレーズから、応答を作るステップに移ります。
応答を作る
では、次回からWebhookを作成します。前回のDefault Welcome Intentでは、Intentの中のResponseに応答のリストを入れることでDialogFlowから直接応答をするように作りました。
次回は、下の図のように、DialogFlowからWebhookであるFirebase Functionsを介して、応答を作る方法を説明します。
Webhookをオンにする
次回への準備として、what_is_thisインテントがWebhookへリクエストを王来るような設定をしておきます。
what_is_thisインテントのFulfillmentというセクションに移動して、
Enable webhook call for the intentというボタンをOnにします。
お疲れさまでした!、非常に長い回だったので、一度休憩を取ってください!
本日のまとめ
入力:ユーザーの何らかの呼びかけ、に対して出力:呼びかけに応じる返答、をつくるwhat_is_thisインテントを作成した。
Training phrasesには、”ユーザーが喋ってくるであろう会話の想定”を列挙する
フレーズの中で抽出したいキーワードをEntityに割り当てる
Entityは抽出したいキーワードの候補の集合(辞書)
Entityを割り当て得ることでTraining phraseの受け皿の幅を広げる
もともと用意されているシステム Entityのなかの@sys:anyエンティティはあらゆる単語を候補としたEntity
このブログに関する質問やActions on Googleの開発の相談はこちらから↓↓↓
@mizutory
mizutori@goldrushcomputing.com
次回は会話の返答を生成するWebhookを作りましょう! ↓↓↓