1. 概览
Google 助理是一款虚拟智能个人助理,借助 Google 助理开发者平台,您可以打造软件,从而为超过 10 亿台设备(包括智能音箱、手机、汽车、电视、头戴式耳机等)扩展 Google 助理的功能。用户在对话中与 Google 助理互动以处理各种事务,例如购买日用品或约车。作为开发者,您可以使用 Google 助理开发者平台在用户和您自己的第三方执行方式服务之间轻松打造和管理令人愉悦且高效的对话体验。
此 Codelab 介绍了使用 Google 助理、Cloud Functions 和 Cloud Firestore 进行开发的中级概念。在此 Codelab 中,您将构建一款名为“拼写检查练习”的游戏使用 Google 助理要求用户拼写字词。
构建内容
在此 Codelab 中,您将构建一个具有以下功能的复杂游戏:
- 接收用户的拼写回复,并根据收集到的值修改对话提示
- 提供与拼写单词相关的提示,例如单词的定义或重复单词
- 创建游戏循环,以便用户在拼出单词后可以再次与 Google 助理互动
在开始构建之前,您可以在内置 Google 助理的设备上与实时 Action 互动,只需说“Hey Google,跟着拼写练习”说一下即可。对于回访用户,通过此 Action 的默认路径如下所示:
完成此 Codelab 后,您完成的 Action 将具有以下对话流:
学习内容
- 如何与 Cloud Firestore 交互
- 如何使用槽向用户收集数据
- 如何处理用户的输入并返回响应
- 如何使用条件向场景添加逻辑
- 如何添加游戏循环
所需条件
学习本 Codelab 前,您需要做好以下准备:
2. 获取函数代码
从命令行克隆 GitHub 代码库:
$ git clone https://github.com/FirebaseExtended/codelab-actions-firestore
3. 创建 Firebase 项目并设置您的应用
创建 Firebase 项目
- 登录 Firebase。
- 在 Firebase 控制台中,点击 Add Project(或 Create a project),然后将您的 Firebase 项目命名为
Spelling-Practice
。
- 点击各个项目创建选项。如果系统提示,请接受 Firebase 条款。跳过设置 Google Analytics,因为您不会为此应用使用 Google Analytics。
如需详细了解 Firebase 项目,请参阅了解 Firebase 项目。
升级到 Blaze 定价方案
为了使用 Cloud Functions for Firebase,您需要将 Firebase 项目升级为 Blaze 定价方案,这意味着您需要为项目关联一个 Google Cloud Billing 账号。这要求您提供信用卡或其他付款方式。
所有 Firebase 项目(包括采用 Blaze 方案的项目)仍然可以使用 Cloud Functions 的免费用量配额。此 Codelab 中列出的步骤不会超出免费用量限制。但是,您会看到用于托管 Cloud Functions 构建映像的 Cloud Storage 收取少量费用(约 $0.03)。
4. 安装 Firebase CLI
通过 Firebase CLI(命令行界面),您可以部署 Cloud Functions 函数。
您可以通过多种方式安装 Firebase CLI,具体取决于您的操作系统和用例。如果您还使用 Cloud Functions,请按照以下步骤操作,以便使用最常见的选项。
$ npm -g install firebase-tools
- 通过运行以下命令来验证 CLI 是否已正确安装:
$ firebase --version
确保 Firebase CLI 版本为 9.0.0 或更高版本,以使其具备 Cloud Functions 所需的所有最新功能。如果没有,请运行 npm install -g firebase-tools 进行升级,如上所示。
- 通过运行以下命令授权 Firebase CLI:
$ firebase login
- 在 spelling-functions-start 目录中,设置 Firebase CLI 以使用您的 Firebase 项目。运行以下命令,选择您的项目 ID,然后按照说明操作。出现提示时,您可以选择任何别名,例如
codelab
。
$ firebase use --add
5. functions 目录
现在,您将使用 Firebase SDK for Cloud Functions 添加功能,以构建游戏 Spelling Practice 的后端。
借助 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。
package.json
文件中已列出两个必需的依赖项:Firebase SDK for Cloud Functions 和 Firebase Admin SDK。如需在本地安装它们,请从 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。继续执行 Codelab 的下一步,以导入模块。
6. 导入所需的模块
此 Codelab 需要三个模块。
- 借助
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.
现在,我们使用函数添加业务逻辑来支持 Google 助理 Action。
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 Functions 函数,每当 Cloud Firestore 中创建新文档时,该函数就会触发。它将调用 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 Functions 函数,从 Cloud Firestore 为 Google 助理检索拼写练习字词列表。为此,我们使用 应用程序处理程序。
在 index.js
文件中,将 getSpellingWordList
的 TODO 替换为以下内容。
将此函数添加到特殊的 app.handle
是一种通过 Google 助理访问该函数的方法。
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; }); }); })
获取 Google 助理会话中的某个字词
您可以编写一个 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 端点网址,以备后用。如需获取端点,请打开 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,以便为 Google 助理(以及游戏)生成单词列表。
Cloud Firestore 数据采用集合、文档、字段和子集合的形式。游戏的每个单词都将作为自己的文档存储在名为 wordlist
的顶级集合中。对于 Firestore 集合中的每个新文档,都将触发 createpelingPracticeWord 函数,才会触发 Dictionary API 服务获取字词详细信息。
创建 Cloud Firestore 集合
- 在 Firebase 控制台中,前往 Cloud Firestore 部分。
- 点击 + 开始收集。
- 在集合 ID 文本框中,输入
wordlist
,然后点击下一步。
接下来,我们将为字词“agreement”创建一个文档:
- 在文档 ID 文本框中,输入
agreement
。 - 在字段文本框中,输入
word
;在值文本框中,输入agreement
。 - 点击保存。
将此文档添加到 Cloud Firestore 后,系统会触发 createSpellingPracticeWord 函数来提取相应单词的定义详情。为每个字词创建一个新文档,以添加更多字词(例如:敬畏、汽车、真实、告知、更好、上下班等)。
10. 设置 Google 助理
以下部分介绍了如何设置 Google 助理开发环境,以及如何创建 Actions 项目。
检查 Google 权限设置
如需测试您在此 Codelab 中构建的 Action,您需要启用必要的权限,以便模拟器能够访问您的 Action。如需启用权限,请按以下步骤操作:
- 前往活动控件页面。
- 使用您的 Google 账号登录(如果您尚未登录)。
- 启用以下权限:
- 网络与应用活动记录
- 在网络与应用活动记录下,选中包括 Chrome 历史记录和使用 Google 服务的网站、应用和设备上的活动记录旁边的复选框。
创建一个 Actions 项目
Actions 项目是 Action 的容器。如需为此 Codelab 创建 Actions 项目,请按以下步骤操作:
- 打开 Actions 控制台。
- 点击新建项目。
- 接受服务条款
- 输入或选择您使用 Firebase 控制台创建的
spelling-practice-codelab
。(该名称供内部参考。稍后,您可以为项目设置外部名称)。
- 点击 Import project(导入项目)。
- 在 What kind of Action do you want to build? 屏幕中,选择 Custom 卡片。
- 点击下一步。
- 选择 Blank project 卡片。
- 点击 Start building。
- 输入拼写练习作为显示名称,然后点击“保存”。
用户通过调用与您的 Action 开始对话。例如,用户可以通过说出类似指令 “Hey Google, talk to Speaking Practice",,其中拼写练习是显示名<br class="ph-1-1。
如果您想将 Action 部署到生产环境,则该 Action 必须具有显示名称;不过,要测试您的 Action,您无需定义显示名称。您可以改为在模拟器中使用指令“Talk to my test app”来调用您的 Action。
配置 fulfillment
您需要将您之前在此 Codelab 中编写和部署的 Cloud Functions 函数的事件处理脚本连接到 Google 助理。
如需配置执行方式,请按以下步骤操作:
- 点击侧边导航栏中的网络钩子。
- 选择 Https 端点作为执行方式选项:
- 在 HTTPs 端点文本框中输入函数端点的网址,然后点击保存。
在下一部分中,您将在 Actions 控制台中为主调用自定义提示。
设置主调用
您必须修改主调用,以定义用户调用您的 Action 后要执行的操作。
默认情况下,Actions Builder 会在您的调用触发后提供通用提示(“Start building your Action by defining main invocation.”)。
如需修改 Action 在被用户调用后向用户发回的提示,请按以下步骤操作:
- 点击导航栏中的 Main invocation。
- 选中
Call your webhook
,然后在文本框中添加事件处理脚本名称getSpellingWordList
。 - 在代码编辑器中,将
speech
字段中的文本替换为以下欢迎消息:Welcome to Spelling Practice
- 点击保存。
在模拟器中测试主调用
Actions 控制台提供了一个用于测试 Action 的 Web 工具,称为模拟器。界面会模拟硬件设备及其设置,让您可以与 Action 进行对话,就像该 Action 在智能显示屏、手机、音箱或 KaiOS 上运行时一样。
如需在模拟器中测试 Action 的主调用,请按以下步骤操作:
- 在顶部导航栏中,点击 Test 以转到模拟器。
- 如需在模拟器中调用您的 Action,请在左上角的输入字段中输入
Talk to Spelling Practice
,然后按键盘上的 Enter 键。
当您触发 Action 的主调用时,Google 助理会使用您的自定义欢迎消息进行响应。此时,对话会在 Google 助理使用问候语进行回应后结束。
查看事件日志
进入 Test 标签页后,右侧面板会显示事件日志,此类日志会以事件日志形式显示对话记录。每个事件日志都会显示相应对话期间发生的事件。要查看事件日志,请点击事件前的灰色图标。
您的 Action 目前有一个事件日志,它显示了用户的输入(“Talk to Spelling Practice”)和 Action 的回应。以下屏幕截图显示了您的 Action 的事件日志:
11. 构建拼写练习对话
您已经定义了用户调用您的 Action 后会发生什么,可以构建 Action 会话的其余内容了。拼写练习有四个场景,您必须先激活各个场景,Action 才能运行。激活场景的最常用方法是配置 Action,使得在用户说出的话语与场景中的用户 intent 匹配时,相应 intent 会触发向另一个场景的过渡并激活该场景。
从主调用转换到起始场景
在本部分中,您将创建一个名为 Start
的新场景,它会向用户发送提示,以询问用户是否要开始玩拼写练习。您还可以添加从主调用到新的 Start
场景的转场。
如需创建此场景并添加向该场景的过渡,请按以下步骤操作:
- 点击顶部导航栏中的 Develop。然后,点击左侧导航栏中的 Main invocation。
- 在右侧的 Transition 部分中,点击下拉菜单,然后在文本字段中输入
Start
。
- 点击 Add(添加)。这样即可创建一个名为“
Start
”的场景,并告知 Action 在向用户发送欢迎提示后过渡到Start
场景。 - 点击左侧导航栏中的 Scenes 以显示场景列表。
- 在 Scenes 下,点击 Start 以查看
Start
场景。 - 点击
Start
场景的 On enter 部分中的 +。 - 选择 Send prompts。
- 将
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?
建议内容信息卡可为用户提供可点击的建议,您的 Action 会将这些建议作为用户输入进行处理。在本部分中,您将添加在刚才配置的提示 (Do you want to play
Spelling Practice
?
)来支持具有屏幕的设备上的用户。
如需在 Start
场景的提示中添加建议内容信息卡,请按以下步骤操作:
- 在
Start
场景中,点击代码编辑器下方的“建议”。该操作可以添加一个建议内容信息卡。 - 在
title
字段中,将Suggested Response
替换为'Yes'
。 - 按相同的格式手动添加标题为
'No'
和'Help with Phonetics'
的建议内容信息卡。您的代码应类似于以下代码段: - 点击保存。
在模拟器中测试您的 Action
此时,您的 Action 应该从主调用过渡到 Start 场景,并询问用户是否要继续。建议内容信息卡也应显示在模拟显示屏中。
如需在模拟器中测试您的 Action,请按以下步骤操作:
- 在导航栏中,点击 Test 以转到模拟器。
- 如需在模拟器中测试您的 Action,请在“输入”字段中输入
Talk to Spelling Practice
。 - 按 Enter 键。您的 Action 应该会以
Main invocation
提示和添加的Start
场景提示“欢迎参加拼写练习”。使用国际音标拼写相应字词。例如 alpha 表示 a、bravo b、charlie 表示 c 等。是否要继续?”。
以下屏幕截图显示了该互动情况:
- 点击
Yes
、No
或Help with Phonetics
建议内容信息卡,以回应提示。(你也可以说 Yes、No 或 Help with Phonetics,或者在 Input 字段中输入Yes
、No
或Help with Phonetics
。)
在您回应提示后,您的 Action 会以一条消息作为回应,指出其无法解读您的输入:“Sorry, I didn't catch that. 您能再试一次吗?”由于您尚未配置 Action 来使其理解和回应“Yes”或“No”输入,因此该 Action 会将您的输入匹配到 NO_MATCH
intent。
默认情况下,NO_MATCH
系统 intent 提供一般响应,但您可以自定义这些响应,向用户表明您不理解其输入。如果无法匹配用户输入的次数达到 3 次,Google 助理就会结束用户与 Action 的对话。
添加“no”intent 和“注音” intent
现在,用户可以回应您的 Action 提出的问题了,接下来您可以配置该 Action,使其能够理解用户的回应(“是”“否”或“发音帮助”)。在后面的部分中,您将创建在用户说出“Yes”或“No”或“Help with Phonetics”后系统所匹配的用户 intent,然后向 Start
场景添加相应 intent。我们将使用系统 intent yes
,并创建其他 intent。
创建 no
intent
现在,您需要创建 no
intent,以便在用户不想玩游戏时理解并做出响应。如需创建此 intent,请按以下步骤操作:
- 点击导航栏中的 Develop。
- 点击导航栏中的 Custom Intents 以打开 intent 列表。
- 点击 intent 列表底部的 +(加号)。将新 intent 命名为
no
,然后按 Enter 键。 - 点击 no 以打开
no
intent 页面。 - 在 Add trainingPhrase 部分,点击 Enter Phrase 文本框,然后输入以下短语:
No
N
I don't want
nope
- 点击保存。
向 Start
场景添加 no
intent
现在,如果用户表达“no”或类似于“no”的内容(例如“nope”),该 Action 便可以正确理解了。您需要将 no
用户 intent 添加到 Start
场景,因为用户响应的是 Start
提示(“欢迎使用拼写练习。使用国际音标拼写相应字词。例如,alpha 代表 a、bravo 代表 b、charlie 代表 c 等。您要继续吗?”)。
如需为 Start
场景添加此 intent,请按以下步骤操作:
- 点击导航栏中的 Start 场景。
- 在
Start
场景中,点击“User intent 处理”旁边的 +(加号)。 - 在 Intent 部分中,从下拉菜单中选择 no。
- 点击 Send prompts,然后将
speech
字段更新为以下文本:Good Bye
。
编辑器中的代码应类似于以下代码段:
candidates: - first_simple: variants: - speech: >- Goodbye.
- 在转换部分,从下拉菜单中选择结束对话。
- 点击保存。
在模拟器中测试 no
intent
此时,您的 Action 会了解用户何时不想玩游戏,并返回适当的响应。
如需在模拟器中测试此 intent,请按以下步骤操作:
- 在导航栏中,点击 Test。
- 在输入字段中输入
Talk to Spelling Practice
,然后按Enter
。 - 在 Input 字段中输入
No
,然后按 Enter 键。或者,点击“不显示建议”条状标签。
向 Start
场景添加系统 YES
intent
现在,我们将 SYSTEM intent "YES" 添加到 Start
场景中,因为用户在对 Start
提示的回答为“yes”时(“欢迎进行拼写练习。使用国际音标拼写相应字词。例如,alpha 对应 a、bravo 对应 b、charlie 对应 c 等。是否要继续?)。
如需向 Start
场景添加该用户 intent,请按以下步骤操作:
- 点击导航栏中的 Start 场景。
- 点击
Start
场景中的 User intent handling 旁边的 +(加号)。 - 在“所有系统 intent”下,从 intent 下拉菜单中选择 YES。
- 点击 Call your webhook,然后将
event handler
文本框更新为您之前创建的函数:getSpellingWordList
- 在 Transition 部分中,点击下拉菜单,然后选择 End session(结束对话)。
- 点击保存。
在模拟器中测试 YES
intent
此时,如果用户想玩游戏,您的 Action 便可以正确理解并返回适当回应了。
如需在模拟器中测试此 intent,请按以下步骤操作:
- 在导航栏中,点击 Test。
- 如需在模拟器中测试您的 Action,请在 Input 字段中输入
Talk to Spelling Practice
,然后按 Enter 键。 - 在 Input 字段中输入
Yes
,然后按 Enter 键。或者,点击Yes
建议内容信息卡。
您的 Action 会提取所有拼写练习字词的列表,并将其存储在会话中。然后,Action 会终止对话,因为您为 YES
intent 选择了 End conversation
过渡。
创建 Phonetics
intent
如需创建 Phonetics
intent,请按以下步骤操作:
- 点击导航栏中的 Develop。
- 点击导航栏中的 Custom Intents 以打开 intent 列表。
- 点击 intent 列表末尾的 +(加号)。将新 intent 命名为
phonetics
,然后按Enter
。 - 点击
phonetics
intent 以打开phonetics
intent 页面。 - 在“Add trainingPhrase”部分,点击 Enter Phrase 文本框,然后输入以下短语:
how do I spell words
phonetics
help me with phonetics
phonetic alphabet
- 点击保存。
向 Start
场景添加 phonetics
intent
现在,如果用户表达“phonetics”intent,该 Action 便可以作出正确理解。您可以将 phonetics
用户 intent 添加到 Start
场景,因为用户响应的是 Start
提示(“欢迎使用拼写练习。使用国际音标拼写相应字词。例如,alpha 代表 a、bravo 代表 b、charlie 代表 c 等。您要继续吗?”)。
如需向 Start
场景添加该用户 intent,请按以下步骤操作:
- 点击导航栏中的 Start 场景。
- 点击
Start
场景中“User intent 处理”旁边的 +(加号)。 - 在 intent 下拉菜单中选择拼音。
- 在 Transition 部分中,点击下拉菜单,然后选择 End session(结束对话)。
- 点击保存。
从开始场景过渡到拼写场景
在本部分中,您将创建一个名为 Spelling 的新场景,它会向用户发送提示,以便用户使用拼音字母拼写单词。
如需创建此场景并添加向该场景的过渡,请按以下步骤操作:
- 点击顶部导航栏中的 开发。然后,点击左侧导航栏中的 Start 场景。
- 在 User intent handling 部分中,点击
when actions.intent.YES is matched
;然后在右侧的 transition 部分中,点击下拉菜单,然后在文本字段中输入Spelling
。 - 点击 Add(添加)。这将创建一个名为
Spelling
的场景,并指示 Action 在与 YES intent 进行匹配后过渡到Spelling
场景。 - 展开左侧导航栏中的 Scenes 以显示场景列表。
- 在 Scenes 下,点击“Spelling”以查看
Spelling
场景。 - 点击
Spelling
场景的 On enter 部分中的 +。 - 点击调用您的 webhook,然后在事件处理脚本文本框中输入 getSpellingWord。
- 选择 Send prompts。
- 将
speech
字段 (Enter the response that users will see or hear...
) 中的句子替换为 {}。实际提示将由网页钩子填充。
建议内容信息卡可为用户提供可点击的建议,您的 Action 会将这些建议作为用户输入进行处理。
如需在 Spelling
场景的提示中添加建议内容信息卡,请按以下步骤操作:
- 在
Spelling
场景中,点击代码编辑器下方的“建议”。此操作会添加三个建议内容信息卡。 - 在
title
字段中,将Suggested Response
替换为'Repeat'
。 - 按相同的格式手动添加标题为
'Skip'
的建议内容信息卡。 - 使用相同的格式,手动添加标题为“
'Quit'
”的建议内容信息卡。您的代码应类似于以下代码段: - 点击保存。
suggestions: - title: 'Repeat' - title: 'Skip' - title: 'Quit'
创建 Repeat
intent
如需创建 repeat
intent,请按以下步骤操作:
- 点击导航栏中的 开发。
- 点击导航栏中的 Custom Intents 以打开 intent 列表。
- 点击 intent 列表末尾的 +(加号)。将新 intent 命名为
repeat
,然后按Enter
。 - 点击
repeat
intent 以打开definition
intent 页面。 - 在 Add training phrases 部分中,点击 Enter Phrase 文本框,然后输入以下短语:
one more time please
say the word again
repeat the word
tell me again
repeat
- 点击保存。
向 Spelling
场景添加 repeat
intent
现在,当用户表达“重复” intent 时,该 Action 可以理解。您可以将 repeat
用户 intent 添加到 Spelling
场景,因为用户响应的是 Spelling
提示(“使用拼音字母拼写单词”)。
如需向 Spelling
场景添加该用户 intent,请按以下步骤操作:
- 点击导航栏中的拼写场景。
- 点击
Spelling
场景中的 User intent handling 旁边的 +(加号)。 - 在 intent 下拉菜单中选择 repeat。
- 选中 Call your webhook,然后在事件处理脚本文本框中输入 repeatSPingWord 以获取单词定义。
- 勾选 Send prompts。
- 将
speech
字段 (Enter the response that users will see or hear...
) 中的句子替换为“'”。实际提示将由网页版聊天机器人填充。
将建议内容信息卡添加到“符合条件时”中
- 在“User Intent handling”下的“When Repeat is matched”(当匹配到“Repeat”时)中,点击代码编辑器下方的建议。此操作会添加三个建议内容信息卡。
- 在
title
字段中,将Suggested Response
替换为'Skip'
。 - 使用相同的格式,手动添加标题为
'Quit'
的建议内容信息卡。您的代码应如以下代码段所示:
suggestions: - title: 'Skip' - title: 'Quit'
- 点击保存。
创建 definition
intent
如需创建 definition
intent,请按以下步骤操作:
- 点击导航栏中的 Develop。
- 点击导航栏中的 Custom Intents 以打开 intent 列表。
- 点击 intent 列表末尾的 +(加号)。将新 intent 命名为
definition
,然后按Enter
。 - 点击
definition
intent 以打开definition
intent 页面。 - 在 Add trainingPhrase 部分,点击 Enter Phrase 文本框,然后输入以下短语:
I would like to know the definition
tell me the definition
what does it mean
meaning
definition
what is the definition?
- 点击保存。
向 Spelling
场景添加了 definition
intent
现在,当用户表达“definition” intent 时,该 Action 可以理解。您可以将 definition
用户 intent 添加到 Spelling
场景,因为用户响应的是 Spelling
提示(“使用拼音字母拼写单词”)。
如需将此用户 intent 添加到 Spelling
场景,请按以下步骤操作:
- 点击导航栏中的拼写场景。
- 点击
Spelling
场景中的 User intent handling 旁边的 +(加号)。 - 在 intent 下拉菜单中选择 definition。
- 选中 Call your webhook,然后在事件处理脚本文本框中输入 definitionOf 建立连接方对应的复选框,以获取相应字词的定义。
- 勾选 Send prompts。
- 将
speech
字段 (Enter the response that users will see or hear...
) 中的句子替换为“‘’”。实际提示将由 webhook 填充。
向网络钩子响应添加建议内容信息卡
- 在
Start
场景中,点击代码编辑器下方的建议。此操作会添加三个建议内容信息卡。 - 在
title
字段中,将Suggested Response
替换为'Skip'
。 - 按相同的格式手动添加标题为
'Quit'
的建议内容信息卡。您的代码应类似于以下代码段:
suggestions: - title: 'Skip' - title: 'Quit'
- 点击保存。
创建 skip
intent
如需创建 skip
intent,请按以下步骤操作:
- 点击导航栏中的 开发。
- 点击导航栏中的 Intents 以打开 intent 列表。
- 点击 intent 列表末尾的 +(加号)。将新 intent 命名为
skip
,然后按Enter
。 - 点击
skip
intent 以打开skip
intent 页面。 - 在 Add trainingPhrase 部分,点击 Enter Phrase 文本框,然后输入以下短语:
next word
go next
next
skip
skip word
- 点击保存。
向 Spelling
场景添加 Skip
intent
现在,如果用户表达“skip”intent,该 Action 便可以作出正确理解。您可以将 skip
用户 intent 添加到 Spelling
场景,因为用户响应的是 Spelling
提示(“使用拼音字母拼写单词”)。
如需将此用户 intent 添加到 Spelling
场景,请按以下步骤操作:
- 点击导航栏中的拼写场景。
- 在
Spelling
场景中,点击 User intent Handlin 旁边的 +(加号)。 - 在 intent 下拉菜单中选择 skip。
- 在右侧的 Transition(转换)部分中,点击下拉菜单,然后选择
Spelling
。
- 点击保存。
创建 quit
intent
如需创建 Quit
intent,请按以下步骤操作:
- 点击导航栏中的 开发。
- 点击导航栏中的 Intents 以打开 intent 列表。
- 点击 intent 列表底部的 +(加号)。将新 intent 命名为
Quit
,然后按Enter
。 - 点击
Quit
intent 以打开 definition intent 页面。 - 在 Add trainingPhrase 部分,点击 Enter Phrase 文本框,然后输入以下短语:
I quit
Goodbye
Cancel
Exit
Quit
- 点击保存。
向 Spelling
场景添加 Quit
intent
现在,如果用户表达“quit”intent,该 Action 便可以作出正确理解。您可以将 quit
用户 intent 添加到 Spelling
场景,因为用户响应的是 Spelling
提示(“使用拼音字母拼写单词”)。
如需向 Spelling
场景添加该用户 intent,请按以下步骤操作:
- 点击导航栏中的拼写场景。
- 在
Spelling
场景中,点击 User intentHandling(用户 intent 处理)旁边的 +(加号)。 - 在 intent 下拉菜单中选择 quit。
- 在右侧的 Transition(转换)部分中,点击下拉菜单,然后选择
End conversation
。 - 点击保存。
创建 phonetic_alphabet
类型
在本部分中,您将创建一个名为 phonetic_alphabet
的新类型,该类型可以指定用户可以选择的拼音字母选项来拼写单词。您还可以为这些选项定义几个同义词,以便在用户说出类似内容时也能识别。在后面的部分中,您需要将 phonetic_alphabet
类型添加到槽,以指定您想要获取用户的响应。
如需创建 phonetic_alphabet
类型,请按以下步骤操作:
- 点击导航栏中的 开发。
- 点击 Types 下的 +(加号)。
- 输入
phonetic_alphabet
,然后按Enter
。 - 点击
phonetic_alphabet
以打开相关选项。 - 在 What kind of values will this Type support?(此类型将支持哪些类型的值?)部分中,选择 Words and synonyms(字词和同义词)选项
- 在 Add entries 部分中输入以下条目和相应的值:
a | alpha、Apple、Amsterdam |
b | 好极了、黄油、巴尔的摩 |
c | charlie, cat, casablanca |
d | delta、狗、丹麦 |
e | echo、edward、edison |
f | foxtrot, fox, florida |
g | golf, george, gallipoli |
小时 | 酒店,哈里,哈瓦那 |
i | india, ink, italia |
j | Juliette, Johnny, Jerusalem |
k | kilo、king、kilogramme |
| lima, love, london |
分钟 | mike, 钱, 马达加斯加 |
n | 11 月、纽约、南希 |
o | oscar、orange、oslo |
p | papa、paris、peter |
q | 魁北克、王后 |
| romeo, roma, robert |
秒 | sierra, sugar, santiago |
t | 探戈、汤米、黎波里 |
u | uniform, umbrella, uncle |
v | victor, vinegar, Valencia |
周 | whiskey, william, washington |
x | X 射线 |
y | yankee, yellow, yorker |
z | 苏鲁,斑马,苏黎世 |
键值对表格应如下所示:
- 点击保存。
配置槽填充
接下来,您需要配置“拼写”场景中的槽填充。如需配置槽填充逻辑,请按以下步骤操作:
- 点击导航栏中的拼写场景。
- 在
Spelling
场景中,点击 Slot filling 对应的 +(加号)。 - 在 Enter slot name 字段中,添加
userresponse
作为槽名称。 - 在 Select type 下拉菜单中,选择 phonetic_alphabet 作为槽类型。
- 勾选 This slot 接受值列表
- 勾选 This slot is required。
- 选择自定义槽值回写选项,然后在会话参数文本框中输入 userresponse。
- 点击保存。
向 Spelling
屏幕添加了“条件”
如需向 Spelling
场景添加条件,请按以下步骤操作:
- 点击导航栏中的拼写场景。
- 点击
Spelling
场景中“Condition”旁边的 +(加号)。 - 输入
scene.slots.status == "FINAL"
作为条件 - 勾选 Call your webhook,并在事件处理脚本文本框中输入 verifypelingWord 以验证用户响应。
- 勾选 Send prompts。
- 将
speech
字段(Enter the response that users will see or hear...
)中的句子替换为 {}。实际提示将由网页钩子填充。
向网络钩子响应添加建议内容信息卡
- 在
Start
场景中,点击代码编辑器下方的 suggestions(建议)。此操作会添加三个建议内容信息卡。 - 在
title
字段中,将Suggested Response
替换为'Next'
。 - 使用相同的格式,手动添加标题为
'Quit'
的建议内容信息卡。您的代码应如以下代码段所示:
suggestions: - title: 'Next' - title: 'Quit'
- 点击保存。
12. 在模拟器中测试拼写练习
如需在模拟器中测试您的 Action,请按以下步骤操作:
- 在导航栏中,点击 Test 以转到模拟器。
- 如需在模拟器中测试您的 Action,请在“输入”字段中输入
Talk to Spelling Practice
。 - 按 Enter 键。您的 Action 应该会以
Main invocation
提示和添加的Start
场景提示“Welcome to Spelling Practice. 使用拼音字母拼写单词。例如,alpha 代表 a、bravo 代表 b、charlie 代表 c 等。您要继续吗?”。 - 说“是”以继续
- 模拟器会播放文字发音进行拼写
- 您可以使用拼音来拼写单词。例如,如需说出或输入更好,请说出或输入“bravo echo tango tango echo romeo”
- 模拟器会以正确或错误的回答进行响应。
- 说 next 可继续下一个单词,或说 quit 可退出游戏循环。
13. 恭喜
恭喜,您已成功构建游戏 Spelling Practice!
现在,您已经了解了使用 Cloud Firestore、Cloud Functions 和 Google 助理 Action 构建游戏所需的主要步骤。
您学习的内容
- 如何与 Cloud Firestore 交互
- 如何使用槽向用户收集数据
- 如何处理用户的输入并返回响应
- 如何使用条件向场景添加逻辑
- 如何添加游戏循环
其他学习资源
您可以探索以下资源,了解如何构建适用于 Google 助理的 Action:
- 参阅相关文档,了解如何开发适用于 Google 助理的 Action
- 访问 Actions on Google GitHub 页面,查看示例代码和库
- 面向与 Google 助理合作的开发者的官方 Reddit 社区
- 参阅对话设计指南,了解对话型 Action 的最佳实践和指南
- Cloud Firestore 简介
清理项目 [推荐]
为避免可能产生的费用,建议您移除不想使用的项目。如需删除您在本 Codelab 中创建的项目,请按以下步骤操作:
- 如需删除 Firebase 项目和资源,请完成关停(删除)项目部分中所列的步骤。
注意:请确保在 Google Cloud 控制台的设置页面中正确选择要删除的项目。
- 可选:如需立即从 Actions 控制台中移除项目,请完成删除项目部分中列出的步骤。如果您未完成该步骤,系统会在大约 30 天后自动移除您的项目。
欢迎关注我们的 Twitter 账号 @ActionsOnGoogle 和 @Firebase,及时了解我们的最新公告,还可以使用标签 #GoogleIO 发推文,分享您构建的成果!