GoogleHomeに話しかけて検索結果をブラウザに表示させる　❶Dialogflowで簡単なチャットボットを作成

GoogleHome(mini)を購入したので、聞き取ったキーワードから
PCのブラウザに**Googleの検索結果1位のサイトを表示**して、そのサイトの**タイトルを読み上げる**アプリを作成しました。検索したキーワードがDBに無かった場合はキーワードとURLとタイトルを登録します。
##**最終的に出来たアプリ**
![1_牛正大好き💛.png](https://qiita-image-store.s3.amazonaws.com/0/237418/f5acb6cf-38a8-7892-665c-01e7783f3779.png "牛正というお店はワタシが大好きな焼肉屋さんです")
##**ワタシがやったこと**
極力Googleさんのサービスだけで完結したいなーということで、DialogflowとFirebaseを使用
Firebaseがホスティングサーバーとデータベースと関数の管理と色々サービスを担ってくれているので
全部お任せしました。
![2_ワタシがやったことjpg.png](https://qiita-image-store.s3.amazonaws.com/0/237418/ad8611c7-628d-7d79-3d09-d8805a0472cb.png "本当Firebaseって素敵なサービスです💛")


:one:　**[Dialogflow](https://dialogflow.com/)**を使用して簡単なチャットボットを作成
:two:　**[Firebase](https://console.firebase.google.com/)のFunctions(cloud functions)**を使用して、:one:で作ったボットが適切な返事するように設定
:three: 　:two: を実行する際に**FirebaseのDatabase**にデータを追加するように設定
:four:  　:three: のデータ追加をトリガーに**FirebaseのHosting**で作成したページ(htmlファイル)にパラメータを渡し、
　　　windowopenで対象のページを開くように設定
:five:  　Google検索で一番上に表示されてるページを一発で表示させてみる(I'm feeling luckey!)
:six: 　データ登録時にページタイトルとサイトURLはオリジナルのものを保存する
　　　(webスクレイピングには**[cheerio-httpcli](https://www.npmjs.com/package/cheerio-httpcli)**を使用しました )
:seven:　 フリーのMP3データを**FirebaseのStorage**に入れてレスポンスに音声データを返す(SSML)

---
##:one: **[Dialogflow](https://dialogflow.com/)を使用して簡単なチャットボットを作成**##
![3_stage1.png](https://qiita-image-store.s3.amazonaws.com/0/237418/68b6d9ce-0096-7151-2b7f-6dbcccbf03c0.png)



ワタシも横文字弱いので、突っかかった言葉は解説したりわかりやすい言葉で書いていきます。
まずチャットボットってなに？？「対話(chat)」する「ロボット(bot)」でchatbotです。


　:person_frowning_tone1:：OK google ホヤぼーやにつないで　　※ホヤぼーやはワタシが付けたアプリの名前です。
　:robot:：はい、ホヤぼーやのテストバージョンにお繋ぎします。
　　  　...お待たせしました。ホヤぼーやです。(ボット起動)
　:person_frowning_tone1:：おはよう
　:robot:：おはようございます。ご機嫌いかがですか？
　:person_frowning_tone1:：まぁまぁかな。
　:robot:：それは何よりです。
　:person_frowning_tone1:：バイバーイ
　:robot:：また何かあったら呼んでください。ブツッ(ボット終了)

こんなのを最初に作りました。一切プログラムを書かなくても、
**自分が話す言葉**とスピーカーに**返事してほしい言葉**を登録すればとその通りに返してくれます。
そんなチャットボットが作れるツールを提供しているサービス　それが**Dialogflow**です。
###**では、早速　[ここをクリックしてDialogflowをスタート‼](https://dialogflow.com/)**###

わわわ！英語出てきたよ～:scream:‼‼と怖がる必要はありません。ワタシも一緒です。下図のように進めて下さい。
何書いてるかわからないのに安易にクリック出来るかい！って方は**[これで翻訳](https://qiita.com/tedkuma/items/5774f29f09fbf7d2a743)**してみて下さいね。
![4_Dialogflow入口.png](https://qiita-image-store.s3.amazonaws.com/0/237418/c8fcd0f2-a24d-8ee6-e2ac-485e4597f390.png)


![5_Google_Login.png](https://qiita-image-store.s3.amazonaws.com/0/237418/6fa17909-c75f-6aff-e2f2-2a0a656c7d46.png)


うわー！英語いっぱい出てきたー！
でも私には**[Google翻訳さん](https://qiita.com/tedkuma/items/5774f29f09fbf7d2a743)**がついているから全然怖くないのね♪　　　　☟右図のように快適になります。
![6_DFアカウントの設定.png](https://qiita-image-store.s3.amazonaws.com/0/237418/8a6f052c-f71e-3e65-cc53-87a9278ed193.png)


####**はい、ではエージェントを作成してみます。**####
![7_エージェントを作成.png](https://qiita-image-store.s3.amazonaws.com/0/237418/f948c27e-2e37-4923-4e8e-9c7ba30c2813.png)


今回はエージェント名を**FirstAPP**としてみました。
DEFAULT LANGUAGE(既定の言語)が英語になってるので日本語に直してCREATEボタンを押します
![8_FirstAPP作成.png](https://qiita-image-store.s3.amazonaws.com/0/237418/dddc9fc5-240d-c585-69b8-47ea851b7247.png)


少し待つと...ジャーン！新しいエージェントが作成されました。
左上のdialogflowのロゴの下に**FirstAPP**と表示されています。![9_エージェントが出来ました.png](https://qiita-image-store.s3.amazonaws.com/0/237418/5a98a577-b363-ecf2-d8d4-7769cde47358.png)


左側に何やら見慣れない言葉が並んでいます。ここで苦手意識湧いてきます(ワタシはうわーってなりました。)が、実際に今回の簡単なチャットボットを作るのには【**Intents**-インテンツ】と【**Entities**-エンティティーズ】しか使いません。

ワタシなりの解釈で書きます。
　　-  **Entities**：単語登録
　　-  **Intents** ：単語を使う場面とその時の対応を予め決めておく

例えば、「おはよう」とか「おはよ」とか「おはようございます」とかを単語として登録するのが【**Entities**】
Entitiesに登録した単語はGoogle Homeが聞き取ったら(あっ！これは知ってる言葉だぞ!)と認識してくれます。

その「おはよう」とか「おはよ」とかの単語で話しかけられたら朝の挨拶をされているよ
朝の挨拶をされたら、『おはようございます』って返すんだよというルールを設定するのが【**Intents**】

だから、Entitiesに「おはよう」という言葉を予め登録して、
Intentsに「おはようございます」と返すんだよと設定しておけば

　:person_frowning_tone1:：おはよう
　:robot:：おはようございます。　　　　　　　と言わせるチャットボットはすぐに出来ます。

##**では早速Entitiesの登録から始めます。**###
左側のタブをEntitiesに切り替えたらCRATE ENTITIYボタンを押します。
![10_Entities登録.png](https://qiita-image-store.s3.amazonaws.com/0/237418/542dc1bb-c1ab-bfc7-3e46-aef0b2b01b41.png)



今回は、Entity名を **Greeting_in_the_morning** にしました
こんな感じで下の入力欄におはようと認識してほしい言葉をガシガシ登録します。そして忘れずにSAVE
![11_Entities登録.png](https://qiita-image-store.s3.amazonaws.com/0/237418/638373ca-4abb-d618-45ee-9bf5ef1cffc5.png)


###**続いてIntentsの登録をします。**###
左側のタブをIntentsに切り替えたらCRATE INTENTボタンを押します。　さっきと一緒ですね。
![12_Intents登録.png](https://qiita-image-store.s3.amazonaws.com/0/237418/d4329eb4-50b0-7c42-b99e-3d2116fea022.png)



すると...うわうわわわ:scream:...なーんて落ち着いて。翻訳してください
本当、これ作ってる時英語まみれで、翻訳の拡張知ってたらなーってしみじみ・・・。　難しくないです。
☟日本語だとこんなことが書かれています。
![13_こんなことが書かれています.png](https://qiita-image-store.s3.amazonaws.com/0/237418/f73c9397-85a8-4c5b-52d3-93f4e22b94da.png)


ではINTENTを登録します。今回INTENT名は**朝の挨拶**にしました。
続いて Traning phrases にある ADD TRAINING PHRASES をクリックします。
![14_intents登録.png](https://qiita-image-store.s3.amazonaws.com/0/237418/0dde29c2-0228-30fd-bc5a-ef4663ae07a4.png)


Traning phrasesには　おはよう　と入力
続いて Responsesにある ADD RESPONSE をクリックします。
![15_intents登録.png](https://qiita-image-store.s3.amazonaws.com/0/237418/aa7efe16-8376-b60f-bf72-2cf9c8478b84.png)


Responsesに　おはようございます　と入力したらSAVEを押して保存します。
これで「おはよう」と話しかけたら「おはようございます」と返してくれるチャットボットが出来ました。
![16_intents登録.png](https://qiita-image-store.s3.amazonaws.com/0/237418/f84f8ed3-d8ae-dfa2-a1a3-ba321c608905.png)


本当かな~??というわけでテストしてみましょう！
右側の画面は何かな~と思っていた方もいたと思いますが、ここはテストをするときに使います。
![17_テストしてみます.png](https://qiita-image-store.s3.amazonaws.com/0/237418/b0dc0274-9ad3-8359-0ef6-1a2dc8620ede.png)


Try it now　のところに　おはようと入力してみます。![18_ほらできたー！.png](https://qiita-image-store.s3.amazonaws.com/0/237418/f92c5a53-9443-dadc-35df-47c7ae156e7b.png)

おはようございますと返していますー！そしてINTENTに朝の挨拶と表示されています。
朝の挨拶をされたと認識して、おはようございますを返しているんですね。

Try it nowの横にあるマイクをクリックすれば音声でやり取りができます。
ポップアップブロックを解除してマイクを使用するにして下さい。
![19_マイク使いたいときはコレ.png](https://qiita-image-store.s3.amazonaws.com/0/237418/47992549-55e0-2c85-6832-23d183356dc8.png)


こう言ったらこう返して欲しいってのをIntentsやEntitiesに
たくさん登録しておけば自然な会話ができるようになります。

では、ボットを終了するIntentsの登録方法を紹介します。
Intentsの登録時にResponsesの下にある Set this intent as end of conversation をONにすればOK!
これでバイバーイと言ったときにボットが終了します。
![20_ボット終了の設定.png](https://qiita-image-store.s3.amazonaws.com/0/237418/552a6019-ccdb-b910-6d91-1ad2a20a4435.png)


そろそろ佳境です。
右側のテストする画面の　See how it works in Google Assistant. をクリックします。![21_Asistantと繋ぎます.png](https://qiita-image-store.s3.amazonaws.com/0/237418/d1cdef49-39f7-60d6-d00b-d66660bca937.png)

ACCEPTを押します。
![22_Simulator画面.png](https://qiita-image-store.s3.amazonaws.com/0/237418/810675a2-0467-fe37-aa83-cd331362efc3.png)


このSimulator画面では、よりチャットらしいテストができます。
テスト用アプリにつないでと表示されているところでEnterしてみます。
![23_Simulator画面.png](https://qiita-image-store.s3.amazonaws.com/0/237418/fc7d28de-fad8-308c-28b4-7ad0ad3ff2d6.png)



<details><summary>**もしも、ココでつまづいたら読んでください**</summary>
![24_もしエラーになったら.png](https://qiita-image-store.s3.amazonaws.com/0/237418/443f4797-aeee-ee83-24a9-c0f975cd6168.png)
<div>エラーが出てSimulator画面が作動しない場合は、**[Googleのアクティビティ管理](https://myaccount.google.com/activitycontrols)の設定**を確認して下さい。<br>端末情報と音声アクティビティがオフになっているとエラーでシミュレーターが動かないみたいです。<br>設定を変更してブラウザのキャッシュを消去したら正常に動くかもしれません。
</div>![25_エラー解消法.png](https://qiita-image-store.s3.amazonaws.com/0/237418/9aaa4351-1cb8-2dba-b256-6804b0b56832.png)

***
</details>

おー！:clap_tone1:こんにちわ！と返してくれています。
![26_シミュレーター正常に動作した場合.png](https://qiita-image-store.s3.amazonaws.com/0/237418/c30cdc72-e390-32fd-6a5d-aa543c9b314d.png)


手直ししたIntentsでここまでは出来ました。
ここまでくればGoogleHomeに話しかけても同じように返答してくれます。
![27_だんだん出来てきました.png](https://qiita-image-store.s3.amazonaws.com/0/237418/e7c0ec9f-ba63-13b9-61e9-829847a47468.png)

でも、:confused:もうちょっと手を加えたいです。
**①テスト用アプリじゃなく「ホヤぼーやにつないで」って言いたいな**
**②起動した時に「こんにちわ！」じゃなく「お待たせしました。ホヤぼーやです」って言って欲しいな**

####**・・・というわけで①ボット名を変更します。**####
デフォルトではテスト用アプリという設定になっているので
この名前を変えれば呼び方も「ホヤぼーやにつないで」に変更されます。

Actions on Googleの画面で左側にあるOverviewをクリックすると下図の画面が出てきます。
❷App informationのEDITボタンを押します。
![28_アプリ名を変更する.png](https://qiita-image-store.s3.amazonaws.com/0/237418/8f4f3664-5af5-3472-819c-af69d45e125e.png)


この画面はアプリの情報を登録する画面なので、項目を埋めないとエラーっぽい画面が出ますが気にせず
今回は名前だけ登録します。そしてSAVE
![29_名前登録.png](https://qiita-image-store.s3.amazonaws.com/0/237418/a76d8693-8bb2-ccf6-d797-c13207a904e7.png)


左のSimulatorを選んでシミュレーター画面に戻ると、ホヤぼーやにつないでに変更されています。
![30_名前が変わりました.png](https://qiita-image-store.s3.amazonaws.com/0/237418/c4afdda2-efef-178c-03ad-177c0f14cdd4.png)


####**続いて②起動時のメッセージを変更します。**####
が、その前にデフォルトで設定されているIntentsについて説明します。
新規でエージェントを作成した時からIntentsの中にある２つは以下の応答をしています。
  　 -  **Default Fallback Intent**：登録されていない文言に対する返答
  　 -  **Default Welcome Intent**：ボットが呼ばれた時の返答　　
![31_Default Intents.png](https://qiita-image-store.s3.amazonaws.com/0/237418/b3b38c4f-fde2-2189-b8c4-c35f31f8f052.png)


中身を見てみると
![32_Default_Intent.png](https://qiita-image-store.s3.amazonaws.com/0/237418/955ff621-8c04-e907-c07a-51f3d1410681.png)


Fallback Intentの方はText responseに6つの返答が登録されています。この中からランダムで返答をします。
Welcome Intentは「こんにちわ」しか登録されていないので、起動時に毎回「こんにちわ」と返してきます。
だから、このText responseを変更すれば好きな言葉を起動時に言ってもらえます。
・・・というわけでDefault Welcome Intentを手直しして完成です。
![33_完成です。.png](https://qiita-image-store.s3.amazonaws.com/0/237418/1ccb3740-432c-7501-e89c-82da52bb68ec.png)

この他にもDialogflowにはたくさん便利機能があります。
今回は簡単なチャットボットを作るということだけに特化して、必要な箇所だけを書き出しました。

次回以降の記事でワタシが使用した機能は書いていきます。
長々と書いてしまいましたが最後まで読んでいただき有難うございました。

---
   　　　　　　**次の記事：[❷FirebaseのFunctionsでボットに返事をさせる(Dialogflow V2 API)](https://qiita.com/tedkuma/items/d892ec31c3cdaf35753b)**