1. 概要
Google アシスタントのデベロッパー プラットフォームを使用すると、Google アシスタントのバーチャル パーソナル アシスタント機能を拡張するソフトウェアを作成し、スマート スピーカー、スマートフォン、自動車、テレビ、ヘッドフォンなど 10 億以上のデバイスで公開できます。ユーザーは、Google アシスタントとの会話を通じて、食料品の購入から乗車の予約までさまざまなタスクを実行できます。Google アシスタントのデベロッパー プラットフォームを使用することで、サードパーティ フルフィルメント サービスを開発し、ユーザーとの快適かつ効果的な会話型エクスペリエンスを簡単に作成、管理できます。
この Codelab では、Google アシスタント対応の開発に関する初級レベルのコンセプトについて解説します。プラットフォームを使用した経験がない方も、最後まで学習できる内容となっています。架空の地「グリフィンバーグ」の冒険に出掛けるユーザーに旅の運勢を伝える簡単なアクションを構築するのが、この Codelab です。Actions Builder レベル 2 の Codelab ではこのアクションを拡張し、ユーザー入力に基づいて運勢をカスタマイズできるようにします。
作成するアプリの概要
この Codelab では、以下の機能を備えた簡単なアクションを構築します。
- 挨拶メッセージでユーザーに応答する
- ユーザーに質問し、応答が返されたら、ユーザーの選択に基づいて適切に応答する
- 候補ワードを表示して、ユーザーがクリックで入力できるようにする
- ユーザーが初めてかどうかに応じて挨拶メッセージを変える
この Codelab を完了すると、次のような会話フローのアクションが完成します。
演習内容
- Actions Console でプロジェクトを作成する
- アクションを呼び出したユーザーにプロンプトを送信する
- ユーザーの入力を処理して応答を返す
- Actions シミュレータでアクションをテストする
- Cloud Functions エディタを使用してフルフィルメントを実装する
必要なもの
ご使用の環境で以下のツールを用意する必要があります。
- ウェブブラウザ(Google Chrome など)
2. 設定
以降のセクションでは、開発環境をセットアップして Actions プロジェクトを作成する方法について説明します。
Google の権限の設定を確認する
この Codelab で構築するアクションをテストするには、必要な権限を有効にしてシミュレータがアクションにアクセスできるようにする必要があります。権限を有効にする手順は次のとおりです。
- [アクティビティ管理] ページに移動します。
- Google アカウントにログインしていない場合は、ログインします。
- 次の権限を有効にします。
- ウェブとアプリのアクティビティ
- [ウェブとアプリのアクティビティ] で、[Chrome の履歴と Google サービスを使用するサイト、アプリ、デバイスでのアクティビティを含める] チェックボックスをオンにします。
Actions プロジェクトを作成する
Actions プロジェクトは、アクションのコンテナの役割を果たします。この Codelab の Actions プロジェクトを作成する手順は次のとおりです。
- Actions Console を開きます。
- [新しいプロジェクト] をクリックします。
- プロジェクト名(例:
actions-codelab
)を入力します。(この名前は内部参照用です。後でプロジェクトの表示名を設定することもできます)。
- [Create project] をクリックします。
- [What kind of Action do you want to build?](アクションの種類を選んでください)画面で [Custom](カスタム)カードを選択します。
- [Next] をクリックします。
- [Blank project](空のプロジェクト)カードを選択します。
- [Start building](始める)をクリックします。
請求先アカウントを関連付ける
この Codelab で、Cloud Functions を使用してフルフィルメントをデプロイするには、請求先アカウントを Google Cloud のプロジェクトに関連付ける必要があります。
プロジェクトに請求先アカウントを関連付けていない場合は、次の手順を行います。
- Google Cloud Platform の [お支払い] ページに移動します。
- [請求先アカウントを追加] または [アカウントを作成] をクリックします。
- お支払い情報を入力します。
- [無料トライアルを開始] または [送信して課金を有効にする] をクリックします。
- Google Cloud Platform の [お支払い] ページに移動します。
- [マイ プロジェクト] タブをクリックします。
- Codelab の Actions プロジェクトの [アクション] の下にあるその他アイコンをクリックします。
- [お支払い情報を変更] をクリックします。
- プルダウン メニューで、設定した請求先アカウントを選択します。[アカウントを設定] をクリックします。
料金が発生しないようにするには、この Codelab の最後にあるプロジェクトのクリーンアップの手順を行います。
3. 会話を開始する
ユーザーは、「呼び出し」によってアクションとの会話を開始します。たとえば、「OK Google, MovieTime につないで」というフレーズで、MovieTime というアクションを呼び出すことができます。この場合は、MovieTime がアクションの「表示名」です。アクションを本番環境にデプロイするには表示名が必要です。ただし、アクションのテストでは、表示名を定義する必要はありません。代わりに、シミュレータで「Talk to my test app」(テスト用アプリにつないで)というフレーズを使ってアクションを呼び出すことができます。
ユーザーがアクションを呼び出した後の動作を定義するには、「メイン呼び出し」を編集する必要があります。
Actions Builder のデフォルトでは、呼び出しがトリガーされたときの応答として汎用のプロンプト「Start building your Action by defining main invocation.」(アクションを構築するには、最初にメイン呼び出しを定義します。」)が返されます。
次のセクションでは、Actions Console でメイン呼び出しのプロンプトをカスタマイズします。
メイン呼び出しを設定する
ユーザーから呼び出されたときにアクションが応答として送信するプロンプトを変更する手順は、次のとおりです。
- ナビゲーション バーで [Main invocation] (メイン呼び出し)をクリックします。
- コードエディタで、
speech
フィールドのテキスト(Start building your action...
)を、次のウェルカム メッセージに置き換えます。A wondrous greeting, adventurer! Welcome to the mythical land of Gryffinberg! Based on your clothes, you are not from around these lands. It looks like you're on your way to an epic journey.
- [保存] をクリックします。
シミュレータでメイン呼び出しをテストする
Actions Console には、アクションのテストに使用できる「シミュレータ」というウェブツールが用意されています。インターフェースでハードウェア デバイスやその設定をシミュレートして、スマートディスプレイ、スマートフォン、スピーカー、KaiOS で実際に実行しているかのようにアクションとの会話ができます。
アクションを呼び出すと、追加したカスタム プロンプト("A wondrous greeting, adventurer!..."
)が応答するはずです。
シミュレータでアクションのメイン呼び出しをテストする手順は、次のとおりです。
- 上部のナビゲーション バーにある [Test](テスト)をクリックしてシミュレータに移動します。
- シミュレータでアクションを呼び出すには、入力欄に「
Talk to my test app
」と入力してEnter
キーを押します。
アクションのメイン呼び出しをトリガーすると、カスタマイズされたウェルカム メッセージでアシスタントが応答します。この段階では、アシスタントが挨拶で応答して会話が終了します。次のセクションではアクションに変更を加えて、さらに会話が続くようにします。
イベントログを表示する
[Test] タブを開くと、右側のパネルに会話の履歴が「イベントログ」として表示されます。イベントログには、会話のターンの間に発生したイベントが表示されます。
現在、アクションには 1 つのイベントログがあり、ユーザーの入力("Talk to my test app"
)とアクションのレスポンスが表示されます。次のスクリーンショットに示されているのは、現時点でのアクションのイベントログです。
イベントログ内の下矢印をクリックすると、会話のターンで発生したイベントが時系列で表示されます。
userInput
: ユーザー入力("Talk to my test app"
)に対応します。interactionMatch
: ユーザーの入力によってトリガーされたアクションのメイン呼び出しの応答に相当します。矢印をクリックしてこの行を展開すると、メイン呼び出しに追加したプロンプト(A wondrous greeting, adventurer!...
)が表示されます。endConversation
: 会話を終了します。Main invocation
インテントで選択された遷移に対応しています(遷移については、次のセクションで詳しく説明します)。
イベントログを使用すると、アクションの動作を可視化できます。問題が発生した際のアクションのデバッグにも役立ちます。イベント名の横の矢印をクリックすると、次のスクリーンショットのようにイベントの詳細を表示できます。
4. アクションの会話を作成する
前のセクションでは、ユーザーがアクションを呼び出した直後の動作を定義しました。このセクションでは、アクションによる会話の続きを作成します。先に進む前に、以下の用語の定義を読み、アクションの会話の仕組みを理解してください。
アクションには 1 つ以上のシーンを含めることができ、各シーンは実行する前にアクティブにする必要があります(この Codelab で構築するアクションでは、Start
という 1 つのシーンのみ作成します)。シーンをアクティブにする方法として最も一般的なのは、そのシーンに遷移するときにアクティブにする方法です。ユーザー入力がシーンのユーザー インテントに一致したら、そのインテントが別のシーンへの遷移をトリガーするときにアクティブにするようにアクションを設定します。
たとえば、動物についての豆知識を提供するアクションがあるとします。ユーザーがこのアクションを呼び出すと、Main invocation
インテントに一致し、Facts
という名前のシーンへの遷移がトリガーされます。この遷移により、Facts
シーンが有効になり、ユーザーに次のプロンプトが送信されます。Would you like to hear a fact about cats or dogs?
Facts
シーン内には Cat
というユーザー インテントがあり、これには「猫の豆知識を聞きたい...」や「猫の話題」など、ユーザーが猫の意見を聞くためのトレーニング フレーズが含まれています。ユーザーが猫の豆知識をリクエストすると、Cat
インテントに一致し、Cat fact
というシーンへの遷移がトリガーされます。Cat fact
シーンを有効にすると、猫の豆知識を含むプロンプトがユーザーに送信されます。
図 1. Actions Builder で作成する、アクションの一般的な会話ターンのフロー
シーン、インテント、遷移を組み合わせ、会話のロジックを構成することで、ユーザーがアクションでの会話中に通るさまざまなパスを定義できます。次のセクションでは、シーンを作成し、ユーザーがアクションを呼び出した後にそのシーンをアクティブにするように定義します。
メイン呼び出しからシーンに遷移する
このセクションでは、Start
という新しいシーンを作成し、ユーザーに運勢を聞きたいかどうかを尋ねるプロンプトを送信できるようにします。また、メイン呼び出しからこの Start
シーンへの遷移も追加します。
シーンを作成して遷移を追加する手順は次のとおりです。
- ナビゲーション バーの [開発] をクリックします。
- サイド ナビゲーション バーで [Main invocation] (メイン呼び出し)をクリックします。
- [Transition] でプルダウン メニューをクリックし、テキスト フィールドに「
Start
」と入力します。
- [Add](追加)をクリックします。これで、
Start
というシーンが作成され、アクションがユーザーに歓迎のプロンプトを表示した後にStart
シーンに遷移するように設定できました。 - サイド ナビゲーション バーの [Scenes](シーン)をクリックし、シーンのリストを表示します。
- [Scenes] で [Start](開始)をクリックし、
Start
シーンを表示します。 Start
シーンの [On Enter](開始時)で [+] をクリックします。- [Send prompts] をオンにします。
speech
フィールドの文(Enter the response that users will see or hear...
)を、ユーザーに尋ねる質問(Before you continue on your quest, would you like your fortune told?
)に置き換えます。
- [Save] をクリックします。
Google アシスタントは、ユーザーが Start
シーンに遷移したときに、このプロンプト(Before you continue on your quest...
)を表示します。
候補ワードを追加する
候補ワードとは、ユーザーに提示する応答の候補です。ユーザーはクリックで選択でき、その候補がユーザー入力として処理されます。このセクションでは、候補ワードを追加し、ユーザーがデバイスの画面上で選択できるようにします。
Start
シーンのプロンプトに候補ワードを追加する手順は次のとおりです。
Start
シーンで、[suggestions](候補)をクリックします。この操作で、候補ワードが 1 つ追加されます。title
フィールドで、Suggested Response
を'Yes'
に置き換えます。- 同じ形式を使用して、
'No'
という候補ワードを手入力で追加します。コードの該当部分は次のようになります。
suggestions:
- title: 'Yes'
- title: 'No'
- [保存] をクリックします。
シミュレータでアクションをテストする
ここまでの変更により、メイン呼び出しから Start
シーンに遷移し、運勢を占うかどうかをユーザーに尋ねることができるようになりました。シミュレーション画面には候補ワードも表示されます。
シミュレータでアクションをテストする手順は次のとおりです。
- ナビゲーション バーで、[Test] をクリックしてシミュレータに移動します。
- シミュレータでアクションをテストするには、入力欄に「
Talk to my test app
」と入力してEnter
キーを押します。アクションはMain invocation
プロンプトで応答し、Start
シーンのプロンプト"Before you continue on your quest, would you like your fortune told?"
を追加します。
このやり取りを次のスクリーンショットに示します。
- 候補ワードの [
Yes
] または [No
] をクリックしてプロンプトに応答します(「Yes」(はい)または「No」(いいえ)と音声で応答するか、入力欄に「Yes
」または「No
」と入力することもできます)。
プロンプトに応答すると、アクションから入力を認識できないことを示すメッセージ「Sorry, I didn't catch that. Can you try again?」(認識できませんでした。もう一度お願いします)が返されます。アクションがまだ「Yes」や「No」を認識して応答できるようには設定されていないため、入力に一致するのは NO_MATCH
インテントとなります。
NO_MATCH
システム インテントはデフォルトでは汎用の応答を返しますが、この応答をカスタマイズして、ユーザー入力を理解できなかったことをユーザーに伝えることもできます。ユーザー入力が 3 回連続で一致しない場合、アシスタントはユーザーとアクションの会話を終了します。
yes
インテントと no
インテントを追加する
アクションからの質問にユーザーが応答できるようになったので、次は、アクションがユーザーの応答(「Yes」または「No」)を理解できるように設定しましょう。次のセクションでは、ユーザーが「Yes」または「No」と応答したときに一致するユーザー インテントを作成し、これらのインテントを Start
シーンに追加します。
yes
インテントを作成する
yes
インテントを作成する手順は次のとおりです。
- ナビゲーション バーの [開発] をクリックします。
- ナビゲーション バーの [Custom Intents] をクリックしてインテントのリストを開きます。
- インテントのリストの下部にある [+](プラス記号)をクリックします。
- 新しいインテントに
yes
という名前を付け、Enter
キーを押します。 yes
インテントをクリックしてyes
インテント ページを開きます。- [Add training phrases](トレーニング フレーズを追加)で、[Enter Phrase](フレーズを入力)テキスト ボックスをクリックし、次のフレーズを入力します。
Yes
Y
I would
Tell me
- [保存] をクリックします。
yes
インテントを Start
シーンに追加する
これで、アクションはユーザーが「Yes」のインテントを返したときに理解できるようになりました。yes
ユーザー インテントを Start
シーンに追加して、ユーザーが Start
プロンプト(クエストを続行する前に、運勢を占いますか)に応答しているためです。
このユーザー インテントを Start
シーンに追加する手順は次のとおりです。
- ナビゲーション バーの [Start] シーンをクリックします。
Start
シーンで [User intent handling] の横にある [+](プラス記号)をクリックします。- インテントのプルダウン メニューで [yes] を選択します。
- [Send prompts] をクリックし、
speech
フィールドのテキストを次のメッセージに置き換えます。Your future depends on the aid you choose to use for your quest. Choose wisely! Farewell, stranger.
エディタのコードの該当部分は次のようになります。
candidates:
- first_simple:
variants:
- speech: >-
Your future depends on the aid you choose to use for your quest. Choose
wisely! Farewell, stranger.
- [Transition] でプルダウン メニューをクリックし、[End conversation](会話を終了)を選択します。
- [保存] をクリックします。
シミュレータで yes
インテントをテストする
アクションはこの段階で、運勢を聞きたいというユーザーのインテントを理解し、適切な応答を返せるようになりました。
シミュレータでこのインテントをテストする手順は次のとおりです。
- ナビゲーション バーで、[Test] をクリックします。
- シミュレータでアクションをテストするには、入力欄に「
Talk to my test app
」と入力してEnter
キーを押します。 - 入力欄に「
Yes
」と入力し、Enter
キーを押します。または、候補ワードの [Yes] をクリックします。
アクションはユーザーに応答し、どのアイテムを選ぶかで運勢が変わることを伝えます。その後、セッションが終了します。先ほどの設定で yes
インテントの遷移として End conversation
を選択したためです。
no
インテントを作成する
次に、運勢を聞きたくないというユーザーの回答を理解し、応答できるようにするため、no
インテントを作成します。このインテントを作成する手順は次のとおりです。
- ナビゲーション バーの [開発] をクリックします。
- ナビゲーション バーの [Custom Intents] をクリックしてインテントのリストを開きます。
- インテントのリストの下部にある [+](プラス記号)をクリックします。
- 新しいインテントに
no
という名前を付け、Enter
キーを押します。 - [no] をクリックして [**
no
**インテント] ページを開きます。 - [Add training phrases] で、[Enter Phrase] テキスト ボックスをクリックし、次のフレーズを入力します。
No
N
I don't want
nope
- [保存] をクリックします。
no
インテントを Start
シーンに追加する
これで、アクションはユーザーが「No」またはそれに類似する応答(「nope」など)のインテントを返したときに理解できるようになりました。この no
ユーザー インテントも Start
シーンに追加する必要があります。ユーザーが応答しているのは Start
のプロンプト(「Before you continue on your quest, would you like your fortune told?」)であるためです。
このインテントを Start
シーンに追加する手順は次のとおりです。
- ナビゲーション バーの [Start] シーンをクリックします。
Start
シーンで [User intent handling](ユーザー インテントの処理)の横にある [+](プラス記号)をクリックします。- [Intent](インテント)のプルダウン メニューで [no] を選択します。
- [メッセージを送信] をクリックします。
speech
フィールドを次のテキストに更新します。I understand, stranger. Best of luck on your quest! Farewell.
エディタのコードの該当部分は次のようになります。
candidates:
- first_simple:
variants:
- speech: >-
I understand, stranger. Best of luck on your quest! Farewell.
- [Transition] のプルダウン メニューから [End conversation](会話を終了)を選択します。
- [保存] をクリックします。
シミュレータで no
インテントをテストする
アクションはこの段階で、運勢を聞きたくないというユーザーのインテントを理解し、適切な応答を返せるようになりました。
シミュレータでこのインテントをテストする手順は次のとおりです。
- ナビゲーション バーで、[Test] をクリックします。
- 入力欄に「
Talk to my test app
」と入力し、Enter
キーを押します。 - 入力欄に「
No
」と入力し、Enter
キーを押します。代わりに、候補ワードの [No] をクリックすることもできます。
アクションは、ユーザーに運勢を伝えることなく、ただ旅の幸運を祈ります。その後、セッションが終了します。先ほどの設定で no
インテントの遷移として End conversation
を選択したためです。
5. フルフィルメントを実装する
現時点でのアクションの応答は静的で、プロンプトを含むシーンがアクティブになると毎回同じプロンプトが送信されます。このセクションでは、より会話らしい動的な応答を作成するため、ロジックを含む「フルフィルメント」を実装します。
このフルフィルメントでは、ユーザーがアクションにアクセスするのが初めてか、2 回目以降(リピーター)かを識別し、それに応じて挨拶メッセージを変更します。リピーター向けのメッセージは、冒険に戻ってきたことを歓迎する、次のような短い文章にします。「A wondrous greeting, adventurer! Welcome back to the mythical land of Gryffinberg!」(グリフィンバーグへようこそ!すばらしい冒険の旅に戻りましょう!)
この Codelab では、「Cloud Functions エディタ」を使用してフルフィルメント コードの編集とデプロイを行います。
アクションは、シーンの呼び出し中または一部実行中に発生したイベントについて、そのフルフィルメントを通知する「Webhook」をトリガーできます。Webhook がトリガーされたら、イベントの処理に使用するハンドラの名前とともに、JSON ペイロードを含むリクエストをフルフィルメントに送信します。このハンドラがロジックを実行し、対応する JSON レスポンスを返します。
フルフィルメントを構築する
ユーザーがアクションを呼び出すのが初めてか 2 回目以降かに応じて異なるプロンプトが生成されるように、インライン エディタでフルフィルメントを編集しましょう。
このロジックをフルフィルメントに追加する手順は次のとおりです。
- ナビゲーション バーの [開発] をクリックします。
- ナビゲーション バーの [Webhook] タブをクリックします。
- [インライン Cloud Functions] チェックボックスをオンにします。
- [確認] をクリックします。
index.js
ファイルとpackage.json
ファイルにボイラープレート コードが自動的に追加されます。
index.js
の内容を次のコードに置き換えます。
index.js
const { conversation } = require('@assistant/conversation');
const functions = require('firebase-functions');
const app = conversation({debug: true});
app.handle('greeting', conv => {
let message = 'A wondrous greeting, adventurer! Welcome back to the mythical land of Gryffinberg!';
if (!conv.user.lastSeenTime) {
message = 'Welcome to the mythical land of Gryffinberg! Based on your clothes, you are not from around these lands. It looks like you\'re on your way to an epic journey.';
}
conv.add(message);
});
exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);
- [Save Fulfillment](フルフィルメントを保存)をクリックします。
- [Deploy Fulfillment](フルフィルメントをデプロイ)をクリックします。
Cloud Functions でフルフィルメントのプロビジョニングとデプロイが完了するまで数分待ちます。コードエディタの上に「Cloud Function deployment in progress...」(Cloud Functions のデプロイ中です)というメッセージが表示されます。コードが正常にデプロイされると、「Your Cloud Function deployment is up to date」(Cloud Functions のデプロイは最新です)というメッセージに変わります。
コードを理解する
ここで構築したフルフィルメントは、Actions on Google Node.js フルフィルメント ライブラリを使用しており、Google アシスタントからの HTTP リクエストに応答できます。
上記のコード スニペットで定義している greeting
ハンドラでは、lastSeenTime
プロパティを介して、ユーザーがアクションにアクセスするのが初めてかどうかをチェックします。lastSeenTime
が定義されていない場合は初めてアクセスしたユーザーと認識され、greeting
ハンドラは新規ユーザー用の挨拶メッセージを返します。
メイン呼び出しで Webhook がトリガーされるようにする
greeting
関数を定義したら、メイン呼び出しのインテントで greeting
イベント ハンドラを設定し、ユーザーがアクションを呼び出したときにこの関数が呼び出されるようにします。
新しい greeting
ハンドラを呼び出すようにアクションを設定する手順は次のとおりです。
- ナビゲーション バーで [Main invocation] (メイン呼び出し)をクリックします。
- [メッセージを送信] をクリアします。
- [Call your webhook](Webhook を呼び出す)チェックボックスをオンにします。
- テキスト ボックスに「
greeting
」と入力します。
- [保存] をクリックします。
変更後のメイン呼び出しをシミュレータでテストする
シミュレータでアクションをテストする手順は次のとおりです。
- ナビゲーション バーで、[Test] をクリックしてシミュレータに移動します。
- 入力欄に「
Talk to my test app
」と入力し、Enter
キーを押します。
すでにこの Codelab の前半でアクションをテストしているため、新規ユーザーとは認識されず、次の短い挨拶メッセージが返されます。「A wondrous greeting, adventurer! Welcome back to the mythical land of Gryffinberg!...」
プロジェクトをクリーンアップする(推奨)
料金が発生するのを避けるため、使用する予定のないプロジェクトは削除することをおすすめします。この Codelab で作成したプロジェクトを削除する手順は次のとおりです。
- Cloud プロジェクトとリソースを削除するには、プロジェクトのシャットダウン(削除)の手順を行います。
- (省略可)Actions Console からプロジェクトをすぐに削除するには、[プロジェクトを削除する] に記載された手順を完了します。この手順で削除していないプロジェクトは、約 30 日後に自動的に削除されます。
6. 完了
この Codelab では、Google アシスタントのアクションを構築するための基本を学びました。
学習した内容
- Actions Console で Actions プロジェクトを設定する方法
- ユーザーがアクションとの会話を開始できるように、メイン呼び出しにプロンプトを追加する方法
- シーン、インテント、遷移、候補ワード、フルフィルメントで構成される会話型インターフェースを作成する方法
- Actions シミュレータを使ってアクションをテストする方法
詳細
Google アシスタントのアクションの構築について詳しくは、以下のリソースをご覧ください。
- Actions Builder を使用して Google アシスタントのアクションを構築する(レベル 2): この Codelab で構築した会話型アクションをさらに複雑なものにします
- Google アシスタントのアクションの開発に関する公式ドキュメント サイト
- Actions on Google GitHub ページのサンプルコードとライブラリ
- Google アシスタントを使用するデベロッパー向けの Reddit 公式コミュニティ
- Twitter の @ActionsOnGoogle(最新のお知らせは #AoGDevs でツイートしてください。作成したものを共有してください)
フィードバック アンケート
最後に、簡単なアンケートにご協力ください。