1. 概要
Google アシスタントのデベロッパー プラットフォームを使用すると、スマート スピーカー、スマートフォン、自動車、テレビ、ヘッドフォンなど、10 億台を超えるデバイスで Google アシスタント(仮想パーソナル アシスタント)の機能を拡張するソフトウェアを作成できます。ユーザーは、アシスタントと会話することで、食料品の購入や乗車の予約などを行うことができます。デベロッパーは、アシスタントのデベロッパー プラットフォームを使用して、ユーザーと独自のサードパーティ フルフィルメント サービスの間の快適で効果的な会話エクスペリエンスを簡単に作成し、管理できます。
この Codelab では、Google アシスタント、Cloud Functions、Cloud Firestore を使った開発に関する中級レベルのコンセプトについて説明します。この Codelab では、Google アシスタントを使用してユーザーに単語のスペルを尋ねる「スペルチェックの練習」というゲームを作成します。
作成するアプリの概要
この Codelab では、次の機能を備えた高度なゲームを作成します。
- ユーザーからスペルの応答を受け取り、その値に応じて会話のプロンプトを変更する
- 単語の意味や繰り返しなど、単語のスペルに関連するヒントで応答します
- ユーザーが単語のつづり後に再びアシスタントとやり取りできるように、ゲームループを作成します。
作成を始める前に、「OK Google, スペルチェックと話す」と話しかけて、Google アシスタント搭載デバイスでライブ アクションを操作できます。リピーターの場合、このアクションを通るデフォルトのパスは次のようになります。
この Codelab を終了すると、完成したアクションは次の会話フローになります。
ラボの内容
- Cloud Firestore の操作方法
- スロットを使用してユーザーからデータを収集する方法
- ユーザーの入力を処理してレスポンスを返す方法
- 条件を使用してシーンにロジックを追加する方法
- ゲームループを追加する方法
必要なもの
この Codelab の前提条件は次のとおりです。
2. 関数コードを取得する
コマンドラインから GitHub リポジトリのクローンを作成します。
$ git clone https://github.com/FirebaseExtended/codelab-actions-firestore
3. Firebase プロジェクトを作成してアプリを設定する
Firebase プロジェクトを作成する
- Firebase にログインします。
- Firebase コンソールで [プロジェクトを追加](または [プロジェクトを作成])をクリックし、Firebase プロジェクトに「
Spelling-Practice
」という名前を付けます。
- プロジェクト作成オプションをクリックします。プロンプトが表示されたら、Firebase の利用規約に同意します。このアプリではアナリティクスを使用しないため、Google アナリティクスの設定をスキップします。
Firebase プロジェクトについて詳しくは、Firebase プロジェクトについて理解するをご覧ください。
Blaze お支払いプランにアップグレードする
Cloud Functions for Firebase を使用するには、Firebase プロジェクトを Blaze 料金プランにアップグレードする必要があります。これにより、Google Cloud 請求先アカウントがプロジェクトに関連付けられます。クレジット カードなどのお支払い方法を指定する必要があります。
すべての Firebase プロジェクト(Blaze プランのプロジェクトを含む)は、引き続き Cloud Functions の無料の使用量割り当てをご利用いただけます。この Codelab で概説している手順は、無料の使用量上限に収まります。ただし、Cloud Storage から少額の料金(約 $0.03)が発生します。Cloud Storage は、Cloud Functions のビルドイメージをホストするために使用されます。
4. Firebase CLI をインストールする
Firebase CLI(コマンドライン インターフェース)を使用して、Cloud Functions の関数をデプロイできます。
Firebase CLI をインストールする方法は、オペレーティング システムやユースケースに応じて複数あります。次の手順では、Cloud Functions も使用している場合に最も一般的なオプションについて説明します。
$ npm -g install firebase-tools
- 次のコマンドを実行して、CLI が正しくインストールされていることを確認します。
$ firebase --version
Cloud Functions に必要な最新の機能がすべて含まれるように、Firebase CLI のバージョンは 9.0.0 以降にしてください。そうでない場合は、上記のように npm install -g firebase-tools を実行してアップグレードします。
- 次のコマンドを実行して Firebase CLI を承認します。
$ firebase login
- shortcuts-functions-start ディレクトリから、Firebase プロジェクトを使用するように Firebase CLI を設定します。次のコマンドを実行して、プロジェクト ID を選択し、手順に沿って操作します。プロンプトが表示されたら、任意のエイリアス(
codelab
など)を選択できます。
$ firebase use --add
5. 関数ディレクトリ
次に、Firebase SDK for Cloud Functions を使用してゲームのバックエンドを構築する機能「スペルチェック」を追加します。
Cloud Functions を使用すると、サーバーを設定することなく、クラウドでコードを実行できます。この Codelab では、Firebase Authentication、Cloud Storage、Firebase Realtime Database のイベントに反応する関数を作成する方法について説明します。まず、認証から始めましょう。
Firebase SDK for Cloud Functions を使用する場合、関数のコードは functions
ディレクトリにあります(デフォルト)。作業を容易にするため、コードを配置する functions/index.js
ファイルはすでに作成されています。次に進む前に functions
ディレクトリを確認してください。
$ cd functions $ ls
関数のコードも Node.js アプリであるため、アプリに関する情報を提供し、依存関係を一覧表示する package.json
が必要です。
Node.js に慣れていない場合は、Codelab を続行する前に、Node.js について学習することをおすすめします。
package.json
ファイルには、Firebase SDK for Cloud Functions と Firebase Admin SDK の 2 つの必要な依存関係がすでにリストされています。ローカルにインストールするには、functions
ディレクトリから npm install
を実行します。
$ npm install
次に、index.js
ファイルを見てみましょう。
index.js
/** * Copyright 2021 Google Inc. All Rights Reserved. * ... */ // TODO(DEVELOPER): Import the Cloud Functions for Firebase and Firebase Admin modules here. Also import the Actions SDK here. // TODO(DEVELOPER): Write the getWordDetailsFromDictionaryAPI function here. // TODO(DEVELOPER): Write the createSpellingPracticeWord function here. // TODO(DEVELOPER): Write the app Handle getSpellingWordList function here. // TODO(DEVELOPER): Write the app Handle getSpellingWord function here. // TODO(DEVELOPER): Write the app Handle repeatSpellingWord function here. // TODO(DEVELOPER): Write the app Handle definitionOfSpellingWord function here. // TODO(DEVELOPER): Write the app Handle verifySpellingWord function here.
まず必要なモジュールをインポートしてから、TODO の代わりに 4 つの関数を記述します。Codelab の次のステップに進んでモジュールをインポートします。
6. 必要なモジュールをインポートする
この Codelab には 3 つのモジュールが必要です。
firebase-functions
モジュールを使用すると、Cloud Functions のトリガーを作成できます。firebase-admin
モジュールにより、管理者権限のあるサーバー上で Firebase プラットフォームを使用できます(Cloud Firestore に書き込むなど)。- Actions SDK Node.js フルフィルメント ライブラリは、Google アシスタント用の Actions SDK ハンドラを提供します。
- 次の npm コマンドを実行して、Actions SDK をインストールします。
$ npm install @assistant/conversation
index.js
ファイルで、最初の TODO を次のように置き換えます。
これらの変更により、必要な各モジュールがインポートされます。
また、Firebase Admin SDK を Cloud Functions 環境または他の Google Cloud コンテナにデプロイすると、自動的に構成できます。以下の変更では、admin.initializeApp();
を呼び出すとこの処理が行われています。
index.js
/** * Copyright 2021 Google Inc. All Rights Reserved. * ... */ // Import the Actions SDK const {conversation} = require('@assistant/conversation'); const https = require('https'); const app = conversation(); const cors = require('cors')({origin: true}); // Import the Firebase SDK for Cloud Functions. const functions = require('firebase-functions'); // Import and initialize the Firebase Admin SDK. const admin = require('firebase-admin'); admin.initializeApp(); // To access Cloud Firestore const db = admin.firestore(); // TODO(DEVELOPER): Write the getWordDetailsFromDictionaryAPI function here. // TODO(DEVELOPER): Write the createSpellingPracticeWord function here. // TODO(DEVELOPER): Write the shuffleWordList function here. // TODO(DEVELOPER): Write the app Handle getSpellingWordList function here. // TODO(DEVELOPER): Write the app Handle getSpellingWord function here. // TODO(DEVELOPER): Write the app Handle repeatSpellingWord function here. // TODO(DEVELOPER): Write the app Handle definitionOfSpellingWord function here. // TODO(DEVELOPER): Write the app Handle verifySpellingWord function here.
それでは、関数を使用して、アシスタントのアクションをサポートするビジネス ロジックを追加しましょう。
7. 関数を作成する
単語の定義を取得して Cloud Firestore に書き込む
dictionaryapi.dev
公開 API を使用して単語の定義を取得します。
index.js
ファイルで、getWordDetailsFromDictionaryAPI
の TODO を次のように置き換えます。
index.js
// Retrieves word definition and audio pronunciation from api.dictionaryapi.dev service // Function uses service provided by https://dictionaryapi.dev/ async function getWordDetailsFromDictionaryAPI(word) { let responseData=""; let req = https.request({ host: 'api.dictionaryapi.dev', port: 443, path:'/api/v2/entries/en/' + word, method:'GET' }, (res) => { res.setEncoding('utf8'); res.on('data', d => { responseData+=d; }) res.on('end',function(){ let object = JSON.parse(responseData) const wordListRef = db.collection('wordlist'); wordListRef.doc(object[0].word).set( object[0] ); return responseData; }); }); req.end(); }
Cloud Firestore トリガーを追加する
次に、Cloud Firestore で新しいドキュメントが作成されるたびにトリガーされる Cloud Functions の関数を作成します。dictionaryapi.dev
API を呼び出して、先ほど作成した getWordDetailsFromDictionaryAPI
関数を介して単語の定義を取得します。
index.js
ファイルで、createSpellingPracticeWord
の TODO を次のように置き換えます。
index.js
// 新しい Firestore ドキュメントごとに getWordDetailsFromDictionaryAPI を介して単語の定義を取得する Firestore トリガー
exports.createSpellingPracticeWord = functions.firestore .document('wordlist/{word}') .onCreate((snap, context) => { const newValue = snap.data(); const word = newValue.word; getWordDetailsFromDictionaryAPI(word); });
ゲームの単語のリストを取得する
アシスタント用に Cloud Firestore からスペル練習単語のリストを取得する Cloud Functions の関数を記述できます。これにはアプリハンドラを使用します。
index.js
ファイルで、getSpellingWordList
の TODO を次のように置き換えます。
この関数を特別な app.handle
に追加することで、アシスタントから関数にアクセスできるようになります。
index.js
// Store the list of spelling words in Assistant session app.handle('getSpellingWordList', conv => { const wordListRef = db.collection('wordlist').limit(50); const snapshot = wordListRef; if (snapshot.empty) { console.log('No matching documents.'); return; } VocabularyList = [] return snapshot.get().then(snapshot => { snapshot.forEach(doc => { if (doc.data().word) { let definition = 'unknown'; let audio = 'unknown'; try { if(doc.data().hasOwnProperty('meanings')) { if(doc.data().meanings[0].hasOwnProperty('definitions')) { definition = doc.data().meanings[0].definitions[0].definition; } } if(doc.data().hasOwnProperty('phonetics')) { if(doc.data().phonetics.length > 0) audio = doc.data().phonetics[0].audio; } } catch (error) { console.log(error); } let obj = { word: doc.data().word, answer: doc.data().word.split("").join(" "), definition: definition, audio: audio } VocabularyList.push(obj); } // Shuffle the array let currentIndex = VocabularyList.length, temporaryValue, randomIndex; while (0 !== currentIndex) { randomIndex = Math.floor(Math.random() * currentIndex); currentIndex -= 1; temporaryValue = VocabularyList[currentIndex]; VocabularyList[currentIndex] = VocabularyList[randomIndex]; VocabularyList[randomIndex] = temporaryValue; } conv.session.params.vocabWord = VocabularyList; conv.session.params.vocabWordIndex = 0; }); }); })
アシスタント セッションから単語を取得する
単語リストから次のスペルの単語を返す Cloud Functions の関数を記述できます。
index.js
ファイルで、getSpellingWord
の TODO を次のように置き換えます。
index.js
// Returns a spelling practice word to Google Assistant and uses Speech Synthesis Markup Language (SSML) to format the response app.handle('getSpellingWord', conv => { if (!conv.session.params.vocabWord.empty) { conv.session.params.vocabWordIndex+=1; const ssml = '<speak>' + '<audio src="'+ conv.session.params.vocabWord[conv.session.params.vocabWordIndex].audio +'">Use phonetics to spell the word.</audio> ' + '</speak>'; conv.add(ssml); } else conv.add('Great job! You completed the Spelling practice'); });
単語の繰り返しをゲームで有効にする
ゲームの現在の単語を繰り返す Cloud Functions の関数を記述できます。
index.js
ファイルで、repeatSpellingWord
の TODO を次のように置き換えます。
index.js
// Returns current spelling word app.handle('repeatSpellingWord', conv => { if (!conv.session.params.vocabWord.empty) { const ssml = '<speak>' + '<audio src="'+ conv.session.params.vocabWord[conv.session.params.vocabWordIndex].audio +'">Use phonetics to spell the word. </audio> ' + '</speak>'; conv.add(ssml); } else conv.add('Great job! You completed the Spelling practice'); });
単語の定義を調べる
ゲームの現在の単語の定義を提供する Cloud Functions の関数を記述できます。
index.js
ファイルで、definitionOfSpellingWord
の TODO を次のように置き換えます。
index.js
// Returns spelling word definition from Assistant session parameter app.handle('definitionOfSpellingWord', conv => { conv.add( 'It means ' + conv.session.params.vocabWord[conv.session.params.vocabWordIndex].definition); });
ユーザーのスペル返信を確認する
ゲームの現在の単語のスペルに対するユーザーのレスポンスを検証する Cloud Functions の関数を作成できます。
index.js
ファイルで、verifySpellingWord
の TODO を次のように置き換えます。
index.js
// Verifies user spelling response app.handle('verifySpellingWord', conv => { try { userResponse = conv.intent.params.userresponse.resolved.join(""); if (userResponse.toLowerCase() === conv.session.params.vocabWord[conv.session.params.vocabWordIndex].word.toLowerCase()) { conv.add('You are correct. Say next to continue.'); } else { conv.add('Sorry, wrong answer. The correct answer is ' + conv.session.params.vocabWord[conv.session.params.vocabWordIndex].answer + ' . Say next to continue.'); } } catch (error) { conv.add('Sorry. I did not understand your response' ); } }); exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);
すべての関数をデプロイする
Cloud Functions の関数は、Firebase にデプロイした後にのみアクティブになります。
spelling-functions-start
ディレクトリのルートから次のコマンドを実行します。
$ firebase deploy --only functions
コンソールに次のような出力が表示されます。
i deploying functions i functions: ensuring necessary APIs are enabled... ⚠ functions: missing necessary APIs. Enabling now... i env: ensuring necessary APIs are enabled... ⚠ env: missing necessary APIs. Enabling now... i functions: waiting for APIs to activate... i env: waiting for APIs to activate... ✔ env: all necessary APIs are enabled ✔ functions: all necessary APIs are enabled i functions: preparing functions directory for uploading... i functions: packaged functions (X.XX KB) for uploading ✔ functions: functions folder uploaded successfully i starting release process (may take several minutes)... i functions: creating function createSpellingPracticeWord(us-central1)... ✔ functions[createSpellingPracticeWord(us-central1)]: Successful create operation. i functions: creating function ActionsOnGoogleFulfillment(us-central1)... ✔ functions[ActionsOnGoogleFulfillment(us-central1)]: Successful create operation. ✔ Deploy complete! Project Console: https://console.firebase.google.com/project/spelling-practice-1234/overview
後で使用できるように、ActionsOnGoogleFulfillment 関数の HTTP エンドポイント URL をメモします。エンドポイントを取得するには、Firebase コンソールを開き、[spelling-practice] プロジェクトをクリックします。Functions ダッシュボードを開いて、関数のエンドポイントを表示します。
必要な関数がすべて追加されました。次に、Cloud Firestore の設定に進みます。
8. Cloud Firestore を有効にする
Cloud Firestore を有効にする必要があります。
Firebase コンソールの [構築] セクションで、[Firestore] をクリックします。次に、[データベースを作成] をクリックします。
Cloud Firestore のデータへのアクセスは、セキュリティ ルールによって制御されます。まず、データに対して基本的なルールをいくつか設定する必要があります。[Firestore] をクリックし、Firebase コンソールの [ルール] タブで以下のルールを追加して [公開] をクリックします。
次のルールは、ログインしているユーザーにデータアクセスを制限します。これにより、認証されていないユーザーは読み書きできなくなります。
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { // // WARNING: These rules are insecure! We will replace them with // more secure rules later in the codelab // allow read, write: if request.auth != null; } } }
9. Cloud Firestore にスペル単語のデータを追加する
このステップでは、アシスタント(とゲーム)用に単語のリストを生成できるように、スペルの単語のデータを Cloud Firestore に書き込みます。
Cloud Firestore のデータは、コレクション、ドキュメント、フィールド、サブコレクションに構造化されています。ゲームの各単語は、wordlist
というトップレベルのコレクションに独自のドキュメントとして保存されます。Firestore コレクション内の新しいドキュメントごとに create スペルチェックプラクティス Word 関数がトリガーされ、Dictionary API サービスから単語の詳細が取得されます。
Cloud Firestore コレクションを作成する
- Firebase コンソールで、Cloud Firestore セクションに移動します。
- [+ コレクションを開始] をクリックします。
- [コレクション ID] テキスト ボックスに「
wordlist
」と入力し、[次へ] をクリックします。
次に、単語 agreement のドキュメントを作成します。
- [ドキュメント ID] テキスト ボックスに「
agreement
」と入力します。 - [Field] テキスト ボックスに「
word
」と入力し、[Value] テキスト ボックスに「agreement
」と入力します。 - [保存] をクリックします。
このドキュメントを Cloud Firestore に追加すると、create スペルチェックプラクティスワード 関数がトリガーされ、単語の定義の詳細が取得されます。単語ごとに新しいドキュメントを作成して、単語を追加します(例: 「awe」、「車」、「true」、「Tell」、「Better」、「come」)。
10. Google アシスタントを設定する
以下のセクションでは、Google アシスタントの開発環境をセットアップし、Actions プロジェクトを作成する方法について説明します。
Google の権限の設定を確認する
この Codelab で作成するアクションをテストするには、必要な権限を有効にして、シミュレータがアクションにアクセスできるようにする必要があります。権限を有効にする手順は次のとおりです。
- [アクティビティ管理] ページに移動します。
- まだログインしていない場合は、Google アカウントでログインします。
- 次の権限を有効にします。
- ウェブとアプリのアクティビティ
- [ウェブとアプリのアクティビティ] で、[Chrome の履歴と Google サービスを使用するサイト、アプリ、デバイスでのアクティビティを含める] の横にあるチェックボックスをオンにします。
Actions プロジェクトを作成する
Actions プロジェクトは、アクションのコンテナです。この Codelab の Actions プロジェクトを作成する手順は次のとおりです。
- Actions Console を開きます。
- [新しいプロジェクト] をクリックします。
- 利用規約に同意する
- Firebase コンソールを使用して作成した
spelling-practice-codelab
を入力するか、選択します。(この名前は内部参照用です。後で、プロジェクトに外部名を設定できます)。
- [プロジェクトをインポート] をクリックします。
- [What kind of Action do you want to build?](アクションの種類を選んでください)画面で [Custom](カスタム)カードを選択します。
- [Next] をクリックします。
- [空のプロジェクト] カードを選択します。
- [Start Building] をクリックします。
- 表示名として「スペルチェック」と入力し、[保存] をクリックします。
ユーザーは呼び出しによってアクションとの会話を開始します。たとえば、ユーザーは「OK Google, スペルチェックの練習と話して」のようなフレーズを言ってアクションを呼び出すことができます。ここで、スペルチェックの練習は、表示名です。
アクションを本番環境にデプロイする場合は、アクションに表示名が必要です。ただし、アクションをテストする場合、表示名を定義する必要はありません。代わりに、シミュレータで「Talk to my test app」というフレーズを使用してアクションを呼び出すことができます。
フルフィルメントの構成
この Codelab で前に記述してデプロイした Cloud Functions のイベント ハンドラをアシスタントに接続する必要があります。
フルフィルメントを構成する手順は次のとおりです。
- サイド ナビゲーションで [Webhook] をクリックします。
- フルフィルメント オプションとして [HTTPS エンドポイント] を選択します。
- [HTTPs エンドポイント] テキスト ボックスに関数のエンドポイントの URL を入力し、[保存] をクリックします。
次のセクションでは、Actions Console でメイン呼び出しのプロンプトをカスタマイズします。
メイン呼び出しを設定する
メイン呼び出しを編集して、ユーザーがアクションを呼び出した後の動作を定義する必要があります。
デフォルトでは、Actions Builder は呼び出しがトリガーされたときに汎用のプロンプトを表示します(「Start building your Action by defining main invocation」など)。
ユーザーがアクションを呼び出したときにアクションからユーザーに返されるプロンプトを変更する手順は次のとおりです。
- ナビゲーションの [Main invocation] をクリックします。
- [
Call your webhook
] のチェックボックスをオンにして、テキスト ボックスにイベント ハンドラ名「getSpellingWordList
」を追加します。 - コードエディタで、
speech
フィールドのテキストを次のウェルカム メッセージに置き換えます。Welcome to Spelling Practice
注: プロンプトの編集には、YAML 形式または JSON 形式のいずれかを使用できます。
- [保存] をクリックします。
シミュレータでメイン呼び出しをテストする
Actions Console には、シミュレータと呼ばれる、アクションをテストするためのウェブツールが用意されています。インターフェースはハードウェア デバイスとその設定をシミュレートするため、スマートディスプレイ、スマートフォン、スピーカー、KaiOS で実行されているかのようにアクションと会話できます。
シミュレータでアクションのメイン呼び出しをテストする手順は次のとおりです。
- 上部のナビゲーション バーで [Test] をクリックしてシミュレータに移動します。
- シミュレータでアクションを呼び出すには、左上の入力フィールドに「
Talk to Spelling Practice
」と入力して、キーボードの Enter キーを押します。
アクションのメイン呼び出しをトリガーすると、カスタマイズされたウェルカム メッセージでアシスタントが応答します。この時点で、アシスタントが応答メッセージで応答すると会話は終了します。
イベントログを表示する
[テスト] タブを開くと、右側のパネルにイベントログが表示されます。このイベントログでは、会話履歴がイベントログとして表示されます。各イベントログには、会話のターン中に発生したイベントが表示されます。イベントログを表示するには、イベントの前にある灰色のアイコンをクリックします。
現在、アクションには 1 つのイベントログがあり、ユーザーの入力(「Talk to スペルチェックの練習」)とアクションの応答の両方を確認できます。次のスクリーンショットは、アクションのイベントログを示しています。
11. スペルチェックの練習を行うための会話を作成する
ユーザーがアクションを呼び出した後の動作を定義したら、アクションの残りの会話を作成できます。スペルチェックにはシーンが 4 つあり、実行する前に各シーンを有効にする必要があります。シーンをアクティブにする最も一般的な方法は、ユーザーがシーン内のユーザー インテントに一致したときに、そのインテントが別のシーンへの遷移をトリガーしてアクティブになるようにアクションを設定することです。
メイン呼び出しから開始シーンへの移行
このセクションでは、Start
という新しいシーンを作成します。このシーンでは、スペルチェックの練習を開始するかどうかをユーザーに尋ねるプロンプトが送信されます。また、メイン呼び出しから新しい Start
シーンへの遷移も追加します。
このシーンを作成して、切り替え効果を追加する手順は次のとおりです。
- 上部のナビゲーションで [Develop] をクリックします。次に、左側のナビゲーションで [Main invocation](メイン呼び出し)をクリックします。
- 右側の [Transition] セクションでプルダウン メニューをクリックし、テキスト フィールドに「
Start
」と入力します。
- [追加] をクリックします。これにより、
Start
というシーンが作成され、アクションがユーザーにウェルカム プロンプトを配信した後、Start
シーンに移行するよう指示します。 - 左側のナビゲーションで [Scenes](シーン)をクリックして、シーンのリストを表示します。
- [Scenes] で [Start] をクリックして
Start
シーンを表示します。 Start
シーンの [On Enter] セクションで [+] をクリックします。- [プロンプトを送信] を選択します。
speech
フィールドの文(Enter the response that users will see or hear...
)を、ユーザーへの質問「Use phonetic alphabet to spell the word. For example alpha for a, bravo for b, charlie for c etc. Do you want to continue?
」に置き換えます。
候補ワードは、アクションがユーザー入力として処理するクリック可能な候補をユーザーに提示します。このセクションでは、先ほど構成したプロンプト(Do you want to play
)の下に候補ワードを追加します
Spelling Practice
?
)を実装して、画面を備えたデバイスのユーザーをサポートします。
Start
シーンのプロンプトに候補ワードを追加する手順は次のとおりです。
Start
シーンで、コードエディタの下にある候補をクリックします。この操作により、候補ワードが 1 つ追加されます。- [
title
] フィールドで、Suggested Response
を'Yes'
に置き換えます。 - 同じ書式を使用して、「
'No'
」と「'Help with Phonetics'
」という名前の候補ワードを手動で追加します。コードは次のスニペットのようになります。 - [保存] をクリックします。
シミュレータでアクションをテストする
この時点で、アクションはメイン呼び出しから Start シーンに遷移し、続行するかどうかユーザーに確認する必要があります。候補ワードはシミュレーション表示にも表示されます。
シミュレータでアクションをテストする手順は次のとおりです。
- ナビゲーション バーで [Test] をクリックすると、シミュレータが表示されます。
- シミュレータでアクションをテストするには、入力フィールドに「
Talk to Spelling Practice
」と入力します。 - Enter キーを押すと、アクションは、
Main invocation
プロンプトと、追加されたStart
シーンのプロンプトで「Welcome to スペルチェックの演習にようこそ。発音アルファベットを使用して単語のつづりをします。たとえば、a に alpha、b に bravo、c に charlie といった具合です。続行しますか?」
次のスクリーンショットは、このインタラクションを示しています。
- 候補ワードの
Yes
、No
、Help with Phonetics
をクリックして、プロンプトに対応します。(「はい」、「いいえ」、「発音学に関するヘルプ」と話しかけるか、[入力] フィールドにYes
、No
、またはHelp with Phonetics
と入力することもできます)。
プロンプトに応答すると、アクションが入力を認識できないことを示すメッセージ「"申し訳ございません。キャッチできませんでした。もう一度お試しください。」まだ [Yes] または [No] の入力を理解して応答するようにアクションを構成していないため、アクションは入力を NO_MATCH
インテントに一致させます。
デフォルトでは、NO_MATCH
システム インテントは一般的なレスポンスを提供しますが、これらのレスポンスをカスタマイズして、入力を理解できなかったことをユーザーに示すことができます。ユーザー入力と 3 回一致しない場合、アシスタントはユーザーとアクションとの会話を終了します。
no インテントと発音インテントを追加する
アクションが提示する質問にユーザーが回答できるようになったので、ユーザーの回答(「はい」、「いいえ」、または「発音記号に関するヘルプ」)を理解するようにアクションを設定できます。以降のセクションでは、ユーザーが「はい」、「いいえ」、または「発音学に関するヘルプ」と話しかけた場合に一致するユーザー インテントを作成し、Start
シーンに追加します。ここではシステム インテント yes
を使用し、他のインテントを作成します。
no
インテントを作成する
次に、no
インテントを作成して、ユーザーがゲームをプレイしたくない場合を理解し、対応する必要があります。このインテントを作成する手順は次のとおりです。
- ナビゲーションで [Develop] をクリックします。
- ナビゲーションで [Custom Intents] をクリックして、インテントのリストを開きます。
- インテントのリストの末尾にある +(プラス記号)をクリックします。新しいインテントに「
no
」という名前を付け、Enter キーを押します。 - [no] をクリックして
no
インテント ページを開きます。 - [Add training phrases] セクションで、[Enter Phrase] テキスト ボックスをクリックして次のフレーズを入力します。
No
N
I don't want
nope
- [保存] をクリックします。
no
インテントを Start
シーンに追加する
これで、アクションが、ユーザーが「いいえ」または「いいえ」に類似する表現(「いいえ」など)を表明しているかどうかを認識できるようになりました。no
というユーザー インテントを Start
シーンに追加する必要があります。これは、ユーザーが Start
のプロンプト(「Welcome to スペルチェックの練習にようこそ。発音アルファベットを使用して単語のつづりをします。たとえば、a に alpha、b に bravo、c に charlie といった具合です。続行しますか?」)。
Start
シーンにこのインテントを追加する手順は次のとおりです。
- ナビゲーションの [Start] シーンをクリックします。
Start
シーンのユーザー インテント処理の横にある +(プラス記号)をクリックします。- [Intent(インテント)] セクションで、プルダウンから [no] を選択します。
- [プロンプトを送信] をクリックし、[
speech
] フィールドを「Good Bye
」に更新します。
エディタ内のコードは、次のスニペットのようになります。
candidates: - first_simple: variants: - speech: >- Goodbye.
- [移行] セクションで、プルダウンから [会話を終了] を選択します。
- [保存] をクリックします。
シミュレータで no
インテントをテストする
この時点で、アクションはユーザーがゲームをプレイしたくないタイミングを把握し、適切なレスポンスを返します。
シミュレータでこのインテントをテストする手順は次のとおりです。
- ナビゲーション バーで、[Test] をクリックします。
- 入力欄に「
Talk to Spelling Practice
」と入力し、Enter
を押します。 - 入力フィールドに「
No
」と入力し、Enter キーを押します。または、[候補なし] をクリックします。
システムの YES
インテントを Start
シーンに追加する
次に、Start
シーンに SYSTEM インテント "YES" を追加します。これは、ユーザーが Start
プロンプト(「Welcome to スペルチェックの練習にようこそ。発音アルファベットを使用して単語のつづりをします。たとえば、a に alpha、b に bravo、c に charlie といった具合です。続行しますか?」)。
このユーザー インテントを Start
シーンに追加する手順は次のとおりです。
- ナビゲーションの [Start] シーンをクリックします。
Start
シーンの [User intent handle] の横にある [+(プラス記号)] をクリックします。- [All System Intents] のインテント プルダウンで [Yes] を選択します。
- [Call your webhook] をクリックし、
event handler
テキストボックスを先ほど作成した関数(getSpellingWordList
)に変更します。 - [Transition] セクションで、プルダウンをクリックして [End conversation] を選択します。
- [保存] をクリックします。
シミュレータで YES
インテントをテストする
この時点で、アクションはユーザーがゲームをプレイしたいタイミングを把握し、適切なレスポンスを返します。
シミュレータでこのインテントをテストする手順は次のとおりです。
- ナビゲーション バーで、[Test] をクリックします。
- シミュレータでアクションをテストするには、入力フィールドに「
Talk to Spelling Practice
」と入力して、Enter キーを押します。 - 入力フィールドに「
Yes
」と入力し、Enter キーを押します。または、候補ワードYes
をクリックします。
アクションがすべてのスペル練習単語のリストを取得し、セッションに保存します。次に、YES
インテントに End conversation
遷移を選択したので、セッションは終了します。
Phonetics
インテントを作成する
Phonetics
インテントを作成する手順は次のとおりです。
- ナビゲーションで [Develop] をクリックします。
- ナビゲーションで [Custom Intents] をクリックして、インテントのリストを開きます。
- インテントのリストの末尾にある +(プラス記号)をクリックします。新しいインテントに
phonetics
という名前を付け、Enter
を押します。 phonetics
インテントをクリックして、phonetics
インテント ページを開きます。- [トレーニング フレーズを追加] セクションで、[フレーズを入力] テキスト ボックスをクリックし、次のフレーズを入力します。
how do I spell words
phonetics
help me with phonetics
phonetic alphabet
- [保存] をクリックします。
phonetics
インテントを Start
シーンに追加する
これで、アクションはユーザーが「フリガナ」インテントを表現しているかどうかを把握できるようになりました。phonetics
というユーザー インテントを Start
シーンに追加できます。これは、ユーザーが Start
というプロンプト(例: 「Welcome to スペルチェックの演習。発音アルファベットを使用して単語のつづりをします。たとえば、a に alpha、b に bravo、c に charlie といった具合です。続行しますか?」)。
このユーザー インテントを Start
シーンに追加する手順は次のとおりです。
- ナビゲーションの [Start] シーンをクリックします。
Start
シーンのユーザー インテント処理の横にある [+](プラス記号)をクリックします。- インテントのプルダウンで [phonetics] を選択します。
- [移行] セクションで、プルダウンをクリックして [会話を終了] を選択します。
- [保存] をクリックします。
開始シーンからスペルシーンへの移行
このセクションでは、「スペルチェック」という新しいシーンを作成します。このシーンでは、発音アルファベットを使用して単語をスペルするようユーザーにプロンプトを送信します。
このシーンを作成して、切り替え効果を追加する手順は次のとおりです。
- 上部のナビゲーションで [Develop] をクリックします。次に、左側のナビゲーションで [Start] シーンをクリックします。
- [User intentHandling] セクションで
when actions.intent.YES is matched
をクリックし、右側の [transition] セクションの右側にあるプルダウン メニューをクリックして、テキスト フィールドに「Spelling
」と入力します。 - [追加] をクリックします。これにより、
Spelling
というシーンが作成され、「はい」というインテントとの照合の後にSpelling
シーンに移行するようアクションに指示されます。 - 左側のナビゲーションで [Scenes](シーン)を開いて、シーンのリストを表示します。
- [Scenes] で [スペルチェック] をクリックして
Spelling
シーンを表示します。 Spelling
シーンの [On Enter] セクションで [+] をクリックします。- [Call your webhook] をクリックし、イベント ハンドラのテキスト ボックスに「getScrollingWord」と入力します。
- [プロンプトを送信] を選択します。
speech
フィールド(Enter the response that users will see or hear...
)の文を {} に置き換えます。実際のプロンプトは、Webhook によって入力されます。
候補ワードは、アクションがユーザー入力として処理するクリック可能な候補をユーザーに提示します。
Spelling
シーンのプロンプトに候補ワードを追加する手順は次のとおりです。
Spelling
シーンで、コードエディタの下にある候補をクリックします。この操作により、3 つの候補ワードが追加されます。- [
title
] フィールドで、Suggested Response
を'Repeat'
に置き換えます。 - 同じ書式を使用して、「
'Skip'
」という名前の候補ワードを手動で追加します。 - 同じ書式を使用して、「
'Quit'
」という名前の候補ワードを手動で追加します。コードは次のスニペットのようになります。 - [保存] をクリックします。
suggestions: - title: 'Repeat' - title: 'Skip' - title: 'Quit'
Repeat
インテントを作成する
repeat
インテントを作成する手順は次のとおりです。
- ナビゲーションで [Develop] をクリックします。
- ナビゲーションで [Custom Intents] をクリックして、インテントのリストを開きます。
- インテントのリストの末尾にある +(プラス記号)をクリックします。新しいインテントに
repeat
という名前を付け、Enter
を押します。 repeat
インテントをクリックして、definition
インテント ページを開きます。- [トレーニング フレーズを追加] セクションで、[フレーズを入力] テキスト ボックスをクリックし、次のフレーズを入力します。
one more time please
say the word again
repeat the word
tell me again
repeat
- [保存] をクリックします。
repeat
インテントを Spelling
シーンに追加する
これで、アクションはユーザーが「繰り返し」インテントを表現していることを認識できるようになりました。ユーザーが Spelling
プロンプト(「発音アルファベットを使用して単語のつづり」に応答するため)に、repeat
ユーザー インテントを Spelling
シーンに追加できます。
このユーザー インテントを Spelling
シーンに追加する手順は次のとおりです。
- ナビゲーションの [スペルチェック] シーンをクリックします。
Spelling
シーンの [User intent handle] の横にある [+(プラス記号)] をクリックします。- インテントのプルダウンで [repeat] を選択します。
- [Call your webhook] をオンにし、イベント ハンドラのテキスト ボックスに「repeatspingWord」と入力して単語の定義を取得します。
- [プロンプトを送信する] をオンにします。
speech
フィールドの文(Enter the response that users will see or hear...
)を「'」に置き換えます。実際のプロンプトは Webhook によって入力されます。
[繰り返しが一致した場合] に候補ワードを追加する
- [User IntentHandling] の [When Repeat is matching] で、コードエディタの下にある [suggestions] をクリックします。この操作により、3 つの候補ワードが追加されます。
- [
title
] フィールドで、Suggested Response
を'Skip'
に置き換えます。 - 同じ形式を使用して、「
'Quit'
」という名前の候補ワードを手動で追加します。コードは次のスニペットのようになります。
suggestions: - title: 'Skip' - title: 'Quit'
- [保存] をクリックします。
definition
インテントを作成する
definition
インテントを作成する手順は次のとおりです。
- ナビゲーションで [Develop] をクリックします。
- ナビゲーションで [Custom Intents] をクリックして、インテントのリストを開きます。
- インテントのリストの末尾にある +(プラス記号)をクリックします。新しいインテントに
definition
という名前を付け、Enter
を押します。 definition
インテントをクリックして、definition
インテント ページを開きます。- [トレーニング フレーズを追加] セクションで、[フレーズを入力] テキスト ボックスをクリックし、次のフレーズを入力します。
I would like to know the definition
tell me the definition
what does it mean
meaning
definition
what is the definition?
- [保存] をクリックします。
definition
インテントを Spelling
シーンに追加する
これで、アクションはユーザーが「定義」インテントを表現していることを認識できるようになりました。ユーザーが Spelling
プロンプト(「発音アルファベットを使用して単語のつづり」に応答するため)に、definition
ユーザー インテントを Spelling
シーンに追加できます。
このユーザー インテントを Spelling
シーンに追加する手順は次のとおりです。
- ナビゲーションの [スペルチェック] シーンをクリックします。
Spelling
シーンの [User intent handle] の横にある [+(プラス記号)] をクリックします。- インテントのプルダウンで [definition] を選択します。
- [Call your webhook] チェックボックスをオンにして、イベント ハンドラのテキスト ボックスに「definitionOfDiscountWord」と入力して単語の定義を取得します。
- [プロンプトを送信する] をオンにします。
speech
フィールドの文(Enter the response that users will see or hear...
)を「‘`」に置き換えます。実際のプロンプトは Webhook によって入力されます。
Webhook レスポンスに候補チップを追加する
Start
シーンで、コードエディタの下にある [suggestions] をクリックします。この操作により、3 つの候補ワードが追加されます。- [
title
] フィールドで、Suggested Response
を'Skip'
に置き換えます。 - 同じ形式を使用して、「
'Quit'
」という名前の候補ワードを手動で追加します。コードは次のスニペットのようになります。
suggestions: - title: 'Skip' - title: 'Quit'
- [保存] をクリックします。
skip
インテントを作成する
skip
インテントを作成する手順は次のとおりです。
- ナビゲーションで [Develop] をクリックします。
- ナビゲーションの [Intents] をクリックして、インテントのリストを開きます。
- インテントのリストの末尾にある +(プラス記号)をクリックします。新しいインテントに
skip
という名前を付け、Enter
を押します。 skip
インテントをクリックして、skip
インテント ページを開きます。- [トレーニング フレーズを追加] セクションで、[フレーズを入力] テキスト ボックスをクリックし、次のフレーズを入力します。
next word
go next
next
skip
skip word
- [保存] をクリックします。
Skip
インテントを Spelling
シーンに追加する
これで、アクションはユーザーが「スキップ」インテントを表現していることを認識できるようになりました。ユーザーが Spelling
プロンプト(「発音アルファベットを使用して単語のつづり」に応答するため)に、skip
ユーザー インテントを Spelling
シーンに追加できます。
このユーザー インテントを Spelling
シーンに追加する手順は次のとおりです。
- ナビゲーションの [スペルチェック] シーンをクリックします。
Spelling
シーンの [User intent Handlin] の横にある [+](プラス記号)をクリックします。- インテントのプルダウンで [skip] を選択します。
- 右側の [Transition] セクションで、プルダウン メニューをクリックして [
Spelling
] を選択します。
- [保存] をクリックします。
quit
インテントを作成する
Quit
インテントを作成する手順は次のとおりです。
- ナビゲーションで [Develop] をクリックします。
- ナビゲーションの [Intents] をクリックして、インテントのリストを開きます。
- インテントのリストの末尾にある +(プラス記号)をクリックします。新しいインテントに
Quit
という名前を付け、Enter
を押します。 Quit
インテントをクリックして、[definition インテント] ページを開きます。- [トレーニング フレーズを追加] セクションで、[フレーズを入力] テキスト ボックスをクリックし、次のフレーズを入力します。
I quit
Goodbye
Cancel
Exit
Quit
- [保存] をクリックします。
Quit
インテントを Spelling
シーンに追加する
これで、アクションはユーザーが「終了」インテントを表現していることを認識できるようになりました。ユーザーが Spelling
プロンプト(「発音アルファベットを使用して単語のつづり」に応答するため)に、quit
ユーザー インテントを Spelling
シーンに追加できます。
このユーザー インテントを Spelling
シーンに追加する手順は次のとおりです。
- ナビゲーションの [スペルチェック] シーンをクリックします。
Spelling
シーンの [User intent handle] の横にある [+(プラス記号)] をクリックします。- インテントのプルダウンで [quit] を選択します。
- 右側の [Transition] セクションで、プルダウン メニューをクリックして [
End conversation
] を選択します。 - [保存] をクリックします。
phonetic_alphabet
タイプの作成
このセクションでは、phonetic_alphabet
という新しい型を作成します。これにより、ユーザーが単語のスペルを選択できる発音アルファベットのオプションを指定します。ユーザーが同じようなことを言った場合に備えて、これらのオプションの類義語をいくつか定義することもできます。後のセクションで、phonetic_alphabet
タイプをスロットに追加して、ユーザーの回答を取得することを指定します。
phonetic_alphabet
タイプを作成する手順は次のとおりです。
- ナビゲーションで [Develop] をクリックします。
- [タイプ] で [+](プラス記号)をクリックします。
- 「
phonetic_alphabet
」と入力してEnter
キーを押します。 phonetic_alphabet
をクリックしてオプションを開きます。- [What kind of values are this Type support?] セクションで、[Words and 類義語] オプションを選択します。
- [エントリを追加] セクションに、次のエントリと対応する値を入力します。
a | alpha、apple、amsterdam |
b | ブラボー、バター、ボルチモア |
c | チャーリー、猫、カサブランカ |
d | デルタ、犬、デンマーク |
e | echo、edward、edison |
f | キツネ、キツネ、フロリダ |
g | ゴルフ、ジョージ、ガリポリ |
h | ホテル、ハリー、ハバナ |
i | インド、インク、イタリア |
J | juliette、johnny、jerusalem |
千 | キロ、キング、キログラム |
l | リマ、ラブ、ロンドン |
m | マイク、マネー、マダガスカル |
n | 11 月、ニューヨーク、ナンシー |
o | オスカー、オレンジ、オスロ |
p | パパ、パリ、ピーター |
q | ケベック、クイーン |
r | ロミオ、ローマ、ロバート |
s | シエラ、砂糖、サンティアゴ |
t | タンゴ、トミー、トリポリ |
u | 制服、傘、おじさん |
v | 勝利者、酢、バレンシア |
w | ウイスキー、ウィリアム、ワシントン |
× | X 線 |
y | ヤンキー、黄、ヨーカー |
z | ズールー、シマウマ、チューリッヒ |
Key-Value テーブルは次のようになります。
- [保存] をクリックします。
スロット充填を構成する
次に、スペルチェック シーンでスロット充填を構成する必要があります。スロット充填ロジックを構成する手順は次のとおりです。
- ナビゲーションの [スペルチェック] シーンをクリックします。
- [スロット充填] の
Spelling
シーンで [+](プラス記号)をクリックします。 - [スロット名を入力] フィールドに、スロット名として「
userresponse
」を追加します。 - [タイプを選択] プルダウンで、スロットタイプとして [phonetic_alphabet] を選択します。
- [このスロットは値のリストを受け入れる] チェックボックスをオンにします。
- [このスロットは必須です] をオンにします。
- [Customizeslot value writeback] オプションを選択し、セッション パラメータのテキスト ボックスに userresponse を入力します。
- [保存] をクリックします。
Spelling
画面に条件を追加
Spelling
シーンに Condition を追加する手順は次のとおりです。
- ナビゲーションの [スペルチェック] シーンをクリックします。
- [Condition] の横にある
Spelling
シーンで [+](プラス記号)をクリックします。 - 条件として「
scene.slots.status == "FINAL"
」と入力します - [Call your webhook] チェックボックスをオンにして、イベント ハンドラのテキスト ボックスに「verify スペルチェック Word」と入力して、ユーザーのレスポンスを確認します。
- [プロンプトを送信する] をオンにします。
speech
フィールド(Enter the response that users will see or hear...
)の文を {} に置き換えます。実際のプロンプトは、Webhook によって入力されます。
Webhook レスポンスに候補チップを追加する
Start
シーンで、コードエディタの下にある [suggestions] をクリックします。この操作により、3 つの候補ワードが追加されます。- [
title
] フィールドで、Suggested Response
を'Next'
に置き換えます。 - 同じ形式を使用して、「
'Quit'
」という名前の候補ワードを手動で追加します。コードは次のスニペットのようになります。
suggestions: - title: 'Next' - title: 'Quit'
- [保存] をクリックします。
12. シミュレータでスペルの練習をテストする
シミュレータでアクションをテストする手順は次のとおりです。
- ナビゲーション バーで [Test] をクリックすると、シミュレータが表示されます。
- シミュレータでアクションをテストするには、入力フィールドに「
Talk to Spelling Practice
」と入力します。 - Enter キーを押すと、アクションは、
Main invocation
プロンプトと、追加されたStart
シーンのプロンプトで「Welcome to スペルチェックの演習にようこそ。発音アルファベットを使用して単語のつづりをします。たとえば、a に alpha、b に bravo、c に charlie といった具合です。続行しますか?」 - 続行するには「はい」と言ってください
- 単語の音を鳴らしてスペルミスをします
- 発音アルファベットを使用して単語をつづることができます。たとえば、適切な場合は、「bravo echo tango tango echo romeo」と言うか入力します。
- 正しい回答または誤った回答が返されます。
- 次の単語に進むには「次へ」と言い、ゲームループを終了するには「終了」と言います。
13. 完了
これで、ゲーム「スペルチェック」の作成が完了しました。
これで、Cloud Firestore、Cloud Functions、Google アシスタント Action Builder を使用してゲームを構築するために必要な主な手順を学習できました。
学習した内容
- Cloud Firestore の操作方法
- スロットを使用してユーザーからデータを収集する方法
- ユーザーの入力を処理してレスポンスを返す方法
- 条件を使用してシーンにロジックを追加する方法
- ゲームループを追加する方法
その他の学習リソース
Google アシスタントのアクションの作成については、以下のリソースをご覧ください。
- Google アシスタント用のアクションの開発に関するドキュメント
- サンプルコードとライブラリについては、Actions on Google の GitHub ページをご覧ください。
- Google アシスタントを使用するデベロッパー向けの Reddit 公式コミュニティ
- 会話設計ガイドライン: 会話型アクションに関するベスト プラクティスとガイドライン
- Cloud Firestore の概要
プロジェクトをクリーンアップする [推奨]
料金が発生しないようにするため、使用しないプロジェクトを削除することをおすすめします。この Codelab で作成したプロジェクトを削除する手順は次のとおりです。
- Firebase プロジェクトとリソースを削除するには、プロジェクトのシャットダウン(削除)セクションに記載されている手順を完了します。
注意: Google Cloud コンソールの [設定] ページで、削除するプロジェクトを正しく選択していることを確認してください。
- 省略可: Actions Console からプロジェクトをすぐに削除するには、プロジェクトの削除セクションに記載されている手順を完了します。この手順を行わないと、プロジェクトは約 30 日後に自動的に削除されます。
Twitter で @ActionsOnGoogle と @Firebase をフォローして最新情報をチェックしてください。また、作成したアクションについて #GoogleIO でツイートしてください。