ハンズオン: Women in Voice ワークショップ

1. はじめに

このラボでは、Dialogflow を使用してシンプルなアクションを作成し、Google アシスタントと統合する方法を学びます。

ここでは、一般的なクラウド開発プロセスの手順に沿って以下の順序で演習を進めます。

  1. Dialogflow v2 エージェントを作成する
  2. エンティティを作成する
  3. インテントを作成する
  4. GCP Cloud Functions を使用して Webhook を設定する
  5. ナレッジベースを使用してよくある質問をインポートする
  6. chatbot をテストする
  7. Google アシスタントの統合を有効にする

作業内容

Women in Voice ミートアップ グループ向けの Google アシスタント アプリを作成します。次回の交流会の日程、記事、予約のヒントやグループに関する一般的な質問。

学習内容

  • Dialogflow v2 を使用して chatbot を作成する方法
  • Dialogflow で直線的な会話を作成する方法
  • エンティティの使用方法
  • ナレッジベースの活用方法
  • Dialogflow と GCP の関数を使用して Webhook フルフィルメントを設定する方法
  • Actions on Google を使用してアプリケーションを Google アシスタントに取り込む方法

前提条件

2. 設定方法

ブラウザでウェブ アクティビティを有効にする

  1. http://myaccount.google.com/activitycontrols をクリックします。

  1. ウェブと[アプリのアクティビティ] が [有効] になっている場合:

bf8d16b828d6f79a.png

Dialogflow エージェントを作成する

  1. https://console.dialogflow.com を開きます。

  1. 左側のバーのロゴの下にある [Create New Agent] を選択します。既存のエージェントがいる場合は、まずプルダウンをクリックします。

1d7c2b56a1ab95b8.png

  1. エージェント名を指定: yourname-wiv(独自の名前を使用)
  2. デフォルトの言語として [English - en] を選択します。
  3. デフォルトのタイムゾーンとして、最も近いタイムゾーンを選択します。
  4. [Mega Agent] は選択しないでください。(この機能を使用すると、「サブ」エージェント間のオーケストレーションが可能な包括的なエージェントを作成できます。今は必要ありません)。
  5. [作成] をクリックします。

382af956cbf308a4.png

Dialogflow を構成する

  1. 左側のメニューで、プロジェクト名の横にある歯車アイコンをクリックします。

1d7c2b56a1ab95b8.png

  1. エージェントの説明として「音声エージェントの女性」と入力します。
  2. [ベータ版の機能] まで下にスクロールし、スイッチを切り替えてベータ版の機能を有効にします。
  3. [Log Settings] まで下にスクロールし、両方のスイッチを切り替えて、[Dialogflow のインタラクションをログに記録] と [Google Cloud Stackdriver のすべてのインタラクションをログに記録] をオンにします。これは、後でアクションをデバッグする場合に必要になります。

e80c17acc3cce993.png

  1. [保存] をクリックします。
  2. [完了] をクリックします

Actions on Google を設定する

  1. 右側のパネルの [Google アシスタントでの動作を確認] にある [Google アシスタント] のリンクをクリックします。

5a4940338fc351e3.png

http://console.actions.google.com を開きます。

注: Dialogflow と同じ Google アカウントでログインしていることを確認してください。

Actions on Google を初めて使用する場合は、まずこちらのフォームに入力する必要があります。

3fd4e594fa169072.png

  1. プロジェクト名をクリックして、シミュレーターでアクションを開いてみてください。**
  2. メニューバーで [Develop] を選択します。

[ユーザーの言語設定と一致させる] チェックボックスをオフにします。テキスト読み上げの音声合成機能が、アシスタントのデフォルト言語によってオーバーライドされないようにします。

3b6bc284050571f5.png

  1. [保存] をクリックします。
  2. メニューバーの [テスト] を選択します。

dd55b141677932fe.png

  1. シミュレータが [English] に設定されていることを確認して、[Talk to my test-app] をクリックします。

このアクションにより、Dialogflow の基本的なデフォルト インテントが表示されます。つまり、Action on Google との統合の設定がうまくいったということです。

Google Cloud を構成する

このチュートリアルでは、請求先アカウントが関連付けられた GCP アカウントが必要です。アカウントをお持ちでない場合は、以下の手順で作成できます。

通常、請求先アカウントにはクレジット カードなどのお支払い方法が必要です。このワークショップでは、ワークショップ クレジットをご利用いただけますが、その場合はこのプロセスを省略できます。

  1. この URL に移動してログインします

gcpcredits.com/wivnl

  1. こちらをクリックしてクレジットにアクセスするをクリックします。
  2. [同意して続行

これで準備完了です。25 ドルの請求先アカウントを作成しました。Cloud Functions を長期間使用するにはこれで十分です。

Google Sheets API を有効にする

エージェントが静的なインテント レスポンス以上のものを必要とする場合(ウェブサービス、データベース、スプレッドシートからデータを取得する場合など)、フルフィルメントを使用してウェブサービスをエージェントに接続する必要があります。ウェブサービスを接続すると、ユーザーの式に基づいてアクションを実行し、動的なレスポンスをユーザーに返すことができます。

たとえば、ユーザーがブログや本のヒントを受け取りたい場合、ウェブサービスがデータベースをチェックし、ユーザーに記事を返すことができます。

このチュートリアルでは、データベースを使用せず、代わりに Google スプレッドシートを使用します。シートが更新されると、Google アシスタントのアクションも更新されます。使用できます。

  1. この Google スプレッドシートを新しいブラウザタブで開きます(まだ開いていない場合)。
  2. https://docs.google.com/spreadsheets/d/1UWx3WYVCrqz0D4uJ_pO56WeqEPa9rQDG1cfc_H11kgY/edit#gid=1240329448
  3. 重要: このシートのコピーを作成してください。[ファイル] >コピーを作成
  4. シートがコピーされたら、[共有] をクリックします。
  5. Dialogflow サービス アカウントに編集権限を付与する必要があります。これを行うには、Dialogflow >設定(歯車)
  6. [Google Project] まで下にスクロールします。
  7. サービス アカウント(メールアドレス)のアドレスをコピーします。次のようになります: dialogflow-<someid>@<my-gcp-project>.iam.gserviceaccount.com

8bc778a04efb3dd2.png

  1. このサービス アカウントを Google スプレッドシートの [Share] ポップアップに貼り付けて、編集権限を付与します。

e296b9c069c2028e.png

  1. 次に、現在作業しているシート ID を覚えておく必要があります。

f9061a3724086bf7.png

    The Sheets URL will look something like this:

https://docs.google.com/spreadsheets/d/1fPd8b_z19U7ZzAaY327QhYoogn6q8c1rpGSNF8KIR_o/edit#gid=1240329448

    But we are only interested in the Sheet id, which is the part between:

https://docs.google.com/spreadsheets/d/ および /edit#gid=1240329448(スラッシュなし)

    So it will look something like this: **1fPd8b_z19U7ZzAaY327QhYoogn6q8c1rpGSNF8KIR_o**

    **Write this Sheet ID down**, or copy it to Notepad. In the Webhook steps we will use this again.
  1. 別のブラウザタブで開くhttp://console.cloud.google.com.(他にも Google Cloud プロジェクトがある場合は、新しい Dialogflow プロジェクト yourname-wiv を有効にしてください)。- 検索バーで「Google Sheets API」を検索します。

8b42de259eb40547.png

  1. ここをクリックして、上部の [Google Sheets API を有効にする] ボタンをクリックします。

4b41a64a6cd5a37e.png

3. カスタム エンティティ

エンティティとは、アプリやデバイスがアクションを実行するオブジェクトです。パラメータ / 変数と考えることができます。私たちの行動では、以下について尋ねます。

「Google Chat の

chatbot

/

音声*"*

チャットボット、音声、両方という表現のどれを使用しても、これらはカスタム エンティティから収集され、ウェブサービスへのリクエストでパラメータとして使用されます。

Dialogflow エンティティの詳細については、こちらをご覧ください

チャネル エンティティの作成

  1. Dialogflow コンソールのメニュー項目 [Entities] をクリックします。
  2. [エンティティを作成] をクリックします。
  3. エンティティ名: tech(すべて小文字にしてください)
  4. オプションと類義語を指定します。(インターフェースは Tab キーで移動できます)。
  • Chatbots - Chatbots, Chat, Web
  • Voice - Voice, Voicebots, Voice Assistants
  • Both - Both, All

f9b213472a75915b.png

5**.**青色の保存ボタンの横にあるメニューボタンをクリックして、[**Raw Edit**] モードに切り替えます。

e294b49b123e034f.png

  1. すべてのエンティティを CSV 形式で入力することもできます。これは、作成する必要があるエンティティが多い場合に役立ちます。
"Chatbots","Chatbots","Chat","Web"
"Voice","Voice","Voicebots","Voice Assistants"
"Both","Both","All"

6cfaa328bcd2bad3.png

  1. [保存] をクリックします。

4. インテント

Dialogflow は、インテントを使用してユーザーの意図を分類します。インテントにはトレーニング フレーズが含まれます。トレーニング フレーズとは、ユーザーがエージェントに話しかける可能性のあるフレーズのサンプルです。

たとえば、ユーザーが次の予定を知りたい場合は、次のように質問します。

「次の会合はいつ?」

ユーザーが何かを書いたり話すことを「ユーザー表現」と呼び、Dialogflow はユーザー表現をエージェント内の最適なインテントにマッチングします。インテントのマッチングは「インテント分類」とも呼ばれます。

Dialogflow インテントの詳細については、こちらをご覧ください

Default Welcome Intent の変更

新しい Dialogflow エージェントを作成すると、2 つのデフォルト インテントが自動的に作成されます。Default Welcome Intent(デフォルトのウェルカム インテント)は、エージェントとの会話を開始したときに最初に表示されるフローです。Default Fallback Intent(デフォルトのフォールバック インテント)は、エージェントがユーザーを理解できない場合や、話した内容とインテントをマッチングできない場合に発生するフローです。

  1. [Intents(インテント)] >Default Welcome Intent(デフォルトのウェルカム インテント)

Google アシスタントの場合は、Default Welcome Intent で自動的に起動します。これは、Dialogflow が Welcome イベントをリッスンしているためです。ただし、入力したトレーニング フレーズのいずれかを言って、インテントを呼び出すこともできます。

17610dbd5450e53.png

以下は、Default Welcome Intent のウェルカム メッセージです。

ユーザー

エージェント

「OK Google, <あなたの名前>-WIV と話して」

「こんにちは。Women in Voice の仮想エージェントの Anna です。」「ミートアップの情報、Women in Voice、読書のヒントについて質問できます。」

  1. [Responses] までスクロールします。
  2. すべての返信テキストをクリアします。
  3. デフォルト タブで、次の 3 つのレスポンスを作成します。(改行ごとに、[Add Responses] > [Text] または [SSML Response] をクリックします)。
  • こんにちは、Women in Voice の仮想エージェントのアンナです
  • ミートアップ、Women in Voice、読書のヒントについて質問できます。
  • 確認したい情報

構成はこのスクリーンショットのようになります。

a0078ea79188dcb3.png

  1. 上記の出力は chatbot に使用されており、特に Google アシスタント用に出力を少し変更できます。SSML(音声合成マークアップ言語)を使用して、文章に一時停止を組み込んでいきます。[Google Assistant] タブをクリックします。
  • このチャットボット メッセージは再利用されないため、[デフォルト] の切り替えは有効にしないでください
  • [回答を追加 >シンプルなレスポンス
  • 次のテキスト バージョンを追加します。

Hey there, I'm Anna, the virtual agent of Women in Voice.

You can ask me for information about meetups, Women in Voice or a reading tip. What would you like to know?

  • [音声出力をカスタマイズ] をクリックします。
  • 次の SSML バージョンを追加します。

<speak><p><s>Hey there, I'm Anna, the virtual agent of Women in Voice.</s><s>

You can ask me for information about meetups, Women in Voice or a reading tip.</s></p><break time="500ms"/><p><s> What would you like to know?</s></p></speak>

構成はこのスクリーンショットのようになります。

62f0f58753463fbe.png

  1. [保存] をクリックします。

Actions on Google の SSML について詳しくは、こちらをご覧ください

  1. このインテントをテストしましょう。まず、Dialogflow シミュレータでテストします。

Hello」と入力します。このメッセージが返されます。

12d40056fbd25dfe.png

  1. Actions on Google コンソールに戻りましょう

(別のタブで開いたままにしておくことをおすすめします)。

[Talk to my test app] をクリックします。新しいウェルカム メッセージも確認します。

デフォルトのフォールバック インテントの変更

  1. [Intents(インテント)] >デフォルトのフォールバック インテント
  2. [Responses] までスクロールします。
  3. すべての返信テキストをクリアします。
  4. デフォルト タブで、次のレスポンスをそれぞれ改行して作成します。これにより、オプションが交互に切り替わります。
  • Sorry, can you repeat this?
  • I didn't understand you. You can ask me questions about Women in Voice, a book or article tip or when the next meetup will be.

bdecc217bafff97b.png

  1. [保存] をクリックします。

Google アシスタントの出力を入力しない場合は、デフォルトの出力が使用されます。

停止インテントを作成する

  1. [Intents] メニュー項目をクリックします。
  2. [インテントを作成] をクリックします。
  3. [Intent Name] に、Stop Intent を入力します。
  4. [トレーニング フレーズを追加] をクリックします。
  • No
  • That's it
  • Bye
  • I don't want that
  • Goodbye
  • It's ok for now
  • Quit
  • I want to stop
  • Close this
  • End the conversation

7ec6455cabdf7e36.png

  1. [Responses] まで下にスクロールします。>レスポンスを追加
  2. 次のテキスト オプションを追加します。
  • Alright! Hopefully we will see you at one of our meetups!
  • No problem. See you at one of our meetups!
  1. スイッチを切り替える: [Set this intent as the end of conversation]。これにより、このインテントが一致すると、Google アシスタントのアクションが終了します。

ba532398680d457d.png

  1. [保存] をクリックします。

Meetup インテントを作成する

Meetup Intent には、会話の以下の部分が含まれます。

ユーザー

エージェント

「次の会合はいつ?」

「次のミーティングは <日付><time> に場所: <location>。トピックは <topic> です。スピーカーは <speakers> です。ニュースレターからご登録ください。」

  1. [Intents] メニュー項目をクリックします。
  2. [インテントを作成] をクリックします。
  3. [Intent Name] に Meetup Intent を入力します(M と I を必ず大文字で表記します。- インテントの表記が違うと、バックエンド サービスは機能しなくなります)。
  4. [トレーニング フレーズを追加] をクリックします。
  • When is the next meetup?
  • Do you have any events?
  • Which events are in the planning?
  • Are there meetup events soon?
  • I would love to attend a meetup
  • Can I join a virtual meetup?
  • When will you get together?
  • Can I join?
  • What does your calendar look like?
  1. [Fulfillment] >フルフィルメントを有効にする

7eb73ba04d76140e.png

  1. [Enable Webhook call for this intent] スイッチをオンにします。

748a82d9b4d7d253.png

  1. [保存] をクリックします。

Tip Intent を作成する

Tip Intent には、会話の以下の部分が含まれます。

ユーザー

エージェント

「読書のヒントが欲しい。」

「chatbot、音声、またはその両方について、もっと読みたいですか?」

"音声"

「はい、こちらが今日のヒントです。<type>&lt;title&gt;<author> のテーブル。他の書籍や記事のヒントが必要ですか?また、ミートアップや Google の活動についても説明いたします。どのようなご用件でしょうか?」

  1. [Intents] メニュー項目をもう一度クリックします。
  2. [インテントを作成] をクリックします。
  3. インテント名として「Tip Intent」を入力します(L と I を必ず大文字にしてください)。- インテントの表記が違うと、バックエンド サービスは機能しなくなります)。
  4. [トレーニング フレーズを追加] をクリックして、以下の内容を追加します。
  • Can I get a tip for an article?
  • I would like to receive a reading tip
  • Any book tips?
  • What's nice to read?
  • I want to learn more about Chatbots, what should I read?
  • What are nice blogs?
  • Do you have book suggestions?
  • I want to receive information about Both
  • Can I have Chatbots reading tip
  • I would like to read more about Voice
  • Voice please
  • Both are okay.
  • Reading tip
  • Tip
  • Blog
  • Article
  • Book
  • Book suggestions
  • Yes
  • Yeah
  • Another tip
  • Yes one more
  1. [Action and parameters](アクションとパラメータ)まで下にスクロールします。
  2. [tech] を [必須] としてマーク

7cdf7fdf5d2c3fbe.png

[Define Prompt] をクリックして、次のように入力します。

  • Do you want to read more about Chatbots, Voice or Both?
  1. [Fulfillment] >フルフィルメントを有効にする

今回はレスポンスをハードコードしません。Cloud Functions の関数からレスポンスが返されます。したがって、[Enable Webhook call for this intent] スイッチをオンにします。

[Fulfillment] >フルフィルメントを有効にする

7eb73ba04d76140e.png

  1. [Enable Webhook call for this intent] スイッチをオンにします。

748a82d9b4d7d253.png

  1. [保存] をクリックします。

5. ナレッジ コネクタ

ナレッジ コネクタは、定義済みのインテントを補完します。ナレッジ ドキュメントを解析して自動レスポンスを見つけます。(CSV ファイル、オンライン ウェブサイト、PDF ファイルなどに含まれるよくある質問や記事など)。ナレッジベースを構成するには、ナレッジベース(ナレッジ ドキュメントの集合)を 1 つ以上定義します。

ナレッジ コネクタの詳細

試してみましょう。

  1. en タグを選択し、上部のメニューで英語を選択します。
  2. メニューから [Knowledge](ベータ版)を選択します。

e0a3d2e03dd1076c.png

  1. 右側の青いボタン [Create Knowledge Base] をクリックします。
  2. ナレッジベース名として入力します。[Women in Voice] を選択して [保存] をクリックします。
  3. [Create the first one] リンクをクリックします。

9b2ca6b25c4100ab.png

  1. ウィンドウが開きます。

次の構成を使用します。

ドキュメント名: Women in Voice FAQ シート

ナレッジベースの種類: よくある質問

MIME タイプ: CSV

  1. このシートのデータが必要です。データシートが開いていることを確認し、[よくある質問] タブを選択します。
  2. [ファイル >ダウンロード >CSV

e7f0066408fc1721.png

  1. Dialogflow に戻り、[Upload File from Computer] をクリックして、ダウンロードした CSV ファイルを選択します。[作成] をクリックします。

ナレッジベースが作成されました。

64513e2e484dda31.png

  1. [レスポンスを追加] をクリックします。

以下の回答を作成して [保存] をクリックします。

$Knowledge.Answer[1]

  1. [詳細を表示] をクリックします。

これにより、Dialogflow に実装した FAQ がすべて表示されます。

簡単!

また、よくある質問が掲載されたオンライン HTML ウェブサイトにリンクして、エージェントによくある質問をインポートすることもできます。テキスト ブロックを含む PDF をアップロードすることも可能で、Dialogflow 自体が質問を生成します。

  1. Dialogflow メニューの [Knowledge (beta)] をクリックして、すべてのナレッジベース コネクタに戻ります。
  2. ナレッジベースの強みと弱みは変更できます。これは、よくある質問が自身の意図に勝っている、または不得手であると考える場合は理にかなっています。インテントが少ないため、ナレッジベースをもう少し強化しましょう。スケールを -0.2 に変更します。スライダーをドラッグすると、値が自動的に保存されます。

よくある質問は「補足情報」と見なされるようになりました追加することもできます。ナレッジベースに関するよくある質問ではモデルをトレーニングできません。そのため、まったく異なる方法で質問すると、自然言語理解(ML モデル)を活用しないため、適合しない可能性があります。そのため、FAQ をインテントに変換するメリットもあります。

6. Webhook フルフィルメント

Google Cloud Functions の関数を作成する

  1. 別のブラウザタブで http://console.cloud.google.com に移動します。
  2. 左側のメニューで [Cloud Functions] を選択します。
  3. [関数を作成] をクリックします。

bf2441ba1271a95e.png

  1. 次の構成を指定します。
  • 名前: dialogflow
  • 割り当てられるメモリ: 256 MiB
  • トリガー: HTTP
  • URL をクリップボードにコピーします。
  • [Inline Editor] を選択します。
  • ランタイム: NodeJS 8
  • 実行する関数: dialogflow
  1. この認証チェックボックスがオンになっていることを確認します。

317140d44ec3299c.png

61ecb8f57a6fd21b.png

  1. package.json の内容は次のとおりです。これをコピーして、エディタの package.json タブに貼り付けます。

このコードによって、適切な npm ライブラリが Google Cloud に読み込まれます。

{
 "name": "dialogflow",
 "description": "Cloud Functions",
 "engines": {
   "node": "8"
 },
 "dependencies": {
   "request": "^2.85.0",
   "request-promise": "^4.2.5",
   "dialogflow-fulfillment": "^0.6.1",
   "actions-on-google": "^2.2.0",
   "googleapis": "^48.0.0",
   "moment": "^2.24.0"
 },
 "devDependencies": {
   "eslint": "^5.12.0",
   "eslint-plugin-promise": "^4.0.1",
   "ngrok": "^3.2.7"
 },
 "private": true
}
  1. index.js の内容は次のとおりです。これをコピーして、エディタの index.js タブに貼り付けます。

このコードを googleapis ライブラリと統合して、Google スプレッドシートからデータを取得します。actions-on-google ライブラリを使用して、Google アシスタント デバイスにカードを表示します。ライブラリ dialogflow-fulfillment を使用して、Dialogflow のインテントを分類します。また、ライブラリ moment を利用して日時オブジェクトを処理します。

/* jshint esversion: 8 */
'use strict';

process.env.DEBUG = 'dialogflow:debug';

const ACCOUNTS_SHEET_ID = '1UWx3WYVCrqz0D4uJ_pO56WeqEPa9rQDG1cfc_H11kgY';

const {
 BasicCard,
 Button,
} = require('actions-on-google');

const {google} = require('googleapis');
const moment = require('moment');
moment.locale('nl');
const { WebhookClient } = require('dialogflow-fulfillment');
var books;
var meetups;

const SHEETS_SCOPE = 'https://www.googleapis.com/auth/spreadsheets.readonly';

/**
* Authenticates the Sheets API client for read-only access.
*
* @return {Object} sheets client
*/
async function getSheetsClient() {
   // Should change this to file.only probably
   const auth = await google.auth.getClient({
       scopes: [SHEETS_SCOPE],
   });
   return google.sheets({version: 'v4', auth});
}

/**
* Return a natural spoken date
* @param {string} date in 'YYYY-MM-DD' format
* @returns {string}
*/
var getSpokenDate = function(date){
   let datetime = moment(date, 'YYYY-MM-DD');
   return `${datetime.format('D MMMM')}`;
};


/* When the tipIntent Intent gets invoked.  */
function tipIntent(agent) {
 var par = agent.parameters.tech;
   var selection = [];
   //console.log(par);
   //console.log(books);
    for(var i = 0; i<books.length; i++){
     if(books[i][2].toLowerCase() == par.toLowerCase()) {
         selection.push(books[i]);
       }
   }
    var random = Math.floor(Math.random() * selection.length);
   var booktip = selection[random];
   //console.log(selection[random]);

   let spokenText = `<p><s>Alright, here's the tip of the day!</s></p><p>The ${booktip[6]} ${booktip[0]} of ${booktip[1]}.</p>`;
   let writtenText = `Alright, here's the tip of the day! The ${booktip[6]} ${booktip[0]} of ${booktip[1]}.`;
   //console.log(booktip[8]);
    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
       let conv = agent.conv();
       conv.ask(`<speak>${spokenText}</speak>`);
       conv.ask(new BasicCard({
           title: `Tip of the day!`,
           subtitle: `${par}`,
           text: `The ${booktip[6]} ${booktip[0]} of ${booktip[1]}.`,
           buttons: new Button({
               title: 'Read',
               url: `${booktip[8]}`,
           })
       }));
       conv.ask(`<speak><p><s>Do you want another book or article tip? Also, I can tell you more about meetups or what we do. How can I help?</s></p></speak>`);
       // Add Actions on Google library responses to your agent's response
       agent.add(conv);
   } else {
       agent.add(writtenText + ' Do you want another book or article tip? Also, I can tell you more about meetups or what we do. How can I help?');
   }
}


function meetupIntent(agent) {
 let conv = agent.conv();
 let record;
  console.log(meetups);
  for(var i = 0; i<meetups.length; i++){
   let d = moment(meetups[i][0], 'YYYY-MM-DD');
   let today = moment(new Date());

   if(moment(d).isSameOrAfter(today)) {
     // the i event is not in the past
     record = meetups[i];
     console.log(record);
     break; 
   }
 }
  let date = getSpokenDate(record[0]);
 let spokenText1 = `The next meetup will be ${date} at ${record[1]} in ${record[3]}.`;
 let spokenText2 = `The topic will be <emphasis level="moderate">${record[2]}.</emphasis>`;
 let spokenText3 = `You can register via our newsletter.`;
  let writtenText = `${spokenText1} The topic will be ${record[2]}. ${spokenText3}`;

 if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
   conv.ask(`<speak>${spokenText1} ${spokenText2} ${spokenText3}</speak>`);
   conv.ask(new BasicCard({
     title: `Meetup`,
     subtitle: `${record[2]}`,
     text: `${record[0]} ${record[1]} - ${record[3]}`,
     buttons: new Button({
       title: 'Register',
       url: `http://www.meetup.com`
     })
   }));
   conv.ask('<speak><p><s>Is there anything else I can help you with?</s></p></speak>');
   agent.add(conv);
 } else {
   agent.add(`${writtenText} Is there anything else I can help you with?`);
 }
}

exports.dialogflow = async (request, response) => {
 var agent = new WebhookClient({ request, response });

 console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
 console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
  const client = await getSheetsClient();   
 const allBooks = await client.spreadsheets.values.get({
   spreadsheetId: ACCOUNTS_SHEET_ID,
   range: 'Books&Blogs!A:I',
 });
 const allEvents = await client.spreadsheets.values.get({
   spreadsheetId: ACCOUNTS_SHEET_ID,
   range: 'Meetups!A:D',
 });
  books = allBooks.data.values;
 meetups = allEvents.data.values;
 books.shift();
 meetups.shift();

 var intentMap = new Map();
 intentMap.set('Tip Intent', tipIntent);
 intentMap.set('Meetup Intent', meetupIntent);
 agent.handleRequest(intentMap);
};

b130ee596061832c.png

  1. [環境変数、ネットワーキング、タイムアウトなど] リンクをクリックします。

e81c29549f696937.png

  1. Dialogflow 統合サービス アカウントを選択します。

(デフォルトでは GAE App Engine サービス アカウントを使用しますが、このチュートリアルの最初のステップで Google スプレッドシート内で共有したサービス アカウントと同じサービス アカウントにする必要があります)。

61ecb8f57a6fd21b.png

  1. Cloud Functions の関数をデプロイする前に、[index.js] タブのコードの 1 行を変更します。コードの 3 行目は次のとおりです。

const ACCOUNTS_SHEET_ID = '1Yo_E8KONgSiUm00ZmTOqtjXCwULmc2JuI3sjxRyvrkE';

最初の手順の 1 つで、このキーをメモ帳に書き留めました。この ID をコピーしてコードに貼り付けます。

  1. これで準備は完了です。[Create] ボタンをクリックします。サーバーレス関数をデプロイしているため、少し時間がかかります。

Dialogflow でフルフィルメントを有効にする

  1. Dialogflow に戻す
  2. メインメニューで [Fulfillment] をクリックします。
  3. [Webhook] スイッチを有効にします。
  4. クリップボードにコピーされた Cloud Functions の関数の URL を入力します。

例: https://us-central1-leeboonstra-wiv-uhtefa.cloudfunctions.net/dialogflow

  1. [保存] をクリックします。

89dfd437c6689538.png

  1. Webhook をテストしてコードが機能するかどうかを確認し、Dialogflow シミュレータで直接フローをテストします。

297e8f7ed1b9e801.png

7. Actions on Google

Actions on Google は、Google アシスタントの開発プラットフォームです。これにより、サードパーティによる「アクション」(拡張機能を提供する Google アシスタント用のアプレット)の開発が可能になります。

アプリを開くか話しかけて、Google アクションを呼び出す必要があります。

アクションが開き、ボイスが変わります。「native」はそのままにします。Google アシスタントのスコープ。つまり、この時点からエージェントに依頼する内容はすべて、自分で作成する必要があります。自分のアクションで、Google アシスタントに突然 Google の天気情報を尋ねることはできない。まず、現在のアクション(アプリ)の範囲から離れる(閉じる)必要があります。

Google アシスタント シミュレータでアクションをテストする

次の会話をテストしてみましょう。

ユーザー

Google アシスタント

「OK Google, テスト用アプリに話しかけて」

「アプリのテスト版を入手します。」

ユーザー

[自分の名前]-WIV

-

「こんにちは。Women in Voice の仮想エージェントの Anna です。ミートアップ、Women in Voice、読書のヒントについて私に質問できます。どのようなことをお知りになりたいですか?」

ブログに関するヒントを教えてもらえますか?

「chatbot、音声、またはその両方について、もっと読みたいですか?」

chatbot

「はい、こちらが今日のヒントです。The Article Chatbots And The Challenge Of Invisible Affordances of Cobus Greyling.その他の書籍や記事のヒントが必要ですか?また、ミートアップや Google の活動についても説明いたします。どのようなご用件でしょうか?」

次の交流会はいつ?

「次回のイベントは、4 月 29 日の午後 6 時にバーチャル ハングアウトで開催されます。トピックは「オンライン ワークショップ: Dialogflow で Google アクションを作成する」です。ニュースレターからご登録ください。他に何かご不明な点はございませんか?」

ウェブサイトの URL をご記入ください。

「www.womeninvoice.com からアクセスできます。他に何かご不明な点はございませんか?」

いいえ、結構です

「承知いたしました。イベントでお会いできることを楽しみにしています。」

  1. Google アシスタント シミュレータに戻す

https://console.actions.google.com を開きます。

  1. マイクのアイコンをクリックして、以下の質問をします。

aa43d7f1568c4d80.png

  • Talk to my test app.
  1. ここで、次の質問をしてみましょう。
  • Can I have a tip for a blog?

次のような出力が返されます

「chatbot、音声、またはその両方について、もっと読みたいですか?」

  • Chatbots

「はい、こちらが今日のヒントです。「The Article chatbots And The Challenge Of Invisible Affordances of Cobus Greyling」。

他の書籍や記事のヒントをご希望ですか?また、ミートアップや Google の活動についても説明いたします。どのようなご用件でしょうか?」

  1. 同じ質問の別のバージョンを試してみましょう。
  • "Yes, I want to read more about Voice"

「はい、こちらが今日のヒントです。『The Book Designing Voice User Interfaces: Principles of Conversational Experiences』。... キャシー パール)

他の書籍や記事のヒントをご希望ですか?また、ミートアップや Google の活動についても説明いたします。どのようなご用件でしょうか?」

Dialogflow でこのトレーニング フレーズを使用したことがないことに注意してください。適切なインテントに一致しました。

また、Dialogflow が続行するのに十分な情報を提供したため、フォローアップの質問は返されませんでした。

  1. 次のフレーズで Dialogflow を続けます。
  • What's the URL for your website
  • Bye

a0bd5578d6833c98.png

エラー:ログを確認してください。

Cloud Functions の関数のコードで console.log() を使用するたびに、GCP ログ(Stackdriver)にデータが書き込まれます。これらのログにアクセスするには、 Cloud コンソール >ロギング。

最初のプルダウンで、[Cloud Functions の関数 >ダイアログ フローを使用してログをフィルタします。

8. 完了

Dialogflow を使用した最初の Google アシスタント アクションの作成が完了しました。

お気づきのように、アクションは Google アカウントに関連付けられたテストモードで実行されていました。iOS または Android スマートフォンの Google Nest デバイスまたは Google アシスタント アプリに、同じアカウントでログインする場合。アクションをテストすることもできます。

次はワークショップのデモですただし、実際に Google アシスタントのアプリケーションを構築する場合は、アクションを送信して承認を受けることもできます。詳しくは、こちらのガイドをご覧ください。

学習した内容

  • Dialogflow v2 を使用して chatbot を作成する方法
  • Dialogflow でカスタム エンティティを作成する方法
  • Dialogflow で直線的な会話を作成する方法
  • Dialogflow と Google Cloud Functions を使用して Webhook フルフィルメントを設定する方法
  • Actions on Google を使用してアプリケーションを Google アシスタントに取り込む方法

次のステップ

この Codelab はいかがでしたか?優れたラボをご確認ください。