亚马逊官网Alexa技能初级入门-04

轮流收集插槽
欢迎来到我们的入门教程第4单元,该模块介绍了如何构建有吸引力的Alexa技能。在本模块中,我们将学习如何通过自动委派来逐步收集广告位以使该技能具有会话性。

您将学到的内容:
如何依次连接slots
如何使用语音,intents,slots和auto-delegation
如何创建一个新的IntentHandler来捕获插槽并将其重复给用户

介绍
在第3单元中,您建立了Alexa技能,说: “Hello! Welcome to Cake Time. That was a piece of cake! Bye!” 在此模块中,您可以通过询问用户的生日来使这项技能变得更加有用。当用户做出响应时,技能将理解并重复用户的生日。为此,您将需要使用语音,意图和广告位。
您还将学习如何使用对话框管理来使您的技能自动询问后续问题,以收集所需的信息。例如,如果用户说"I was born July 12th,",对话框管理将自动询问用户他们出生的年份。

在本模块的最后,您的Cake Time技能将能够向用户提问,倾听答案并响应用户。

对于此模块。登录到控制台并打开Cake Time技能。

步骤1:询问使用者的生日
此刻,该技能只是向用户打招呼并退出。欢迎消息有助于设置交互的上下文-用户知道他们正在与Cake Time交互。现在,您需要捕获用户的生日,以最终计算直到用户的下一个生日的天数。为此,请使用编程逻辑来更新技能,该逻辑指示Alexa询问用户的生日。

一个。 在开发人员控制台中,单击“ 代码” 选项卡。

在这里插入图片描述
找到 LaunchRequestHandler。在处理程序内, speakOutput 变量将传递到 .speak() function。在下一步中,更新字符串以询问用户生日。

b。 在 LaunchRequestHandler的 handle() function中,找到以const sayOutput开头的行 。用以下内容替换该行:

const speakOutput = ‘Hello! Welcome to Caketime. What is your birthday?’;

Your code should now look like:

const LaunchRequestHandler = {

    canHandle(handlerInput) {

        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';

    },

    handle(handlerInput) {

        const speakOutput = 'Hello! Welcome to Caketime. What is your birthday?';

现在,请记住,Alexa做出响应后,该技能就会退出。您需要告诉Alexa听取用户的回应。为此,您将使用 之前注释掉的 .reprompt() function。

C。 在 LaunchRequestHandler的 handlet() function中,删除.repromptt() function之前的双斜杠(//) 。

该.repromptt() function 做两件事情:

告诉技巧,等待用户回复,而不是简单地退出
如果用户不响应,则允许您指定一种方式再次向用户提问
最佳做法是使您的重新提示文字与您的初始语音文字有所不同。
用户可能由于多种原因没有做出回应。该技能应再次提出最初的问题,但要自然而然地做到。重新提示应提供更多上下文,以帮助用户提供答案。通过创建一个名为repromptText的新变量来指定提示文字 。

d。 在 LaunchRequestHandler中,在 handle() function中,找到以const talkOutput开头的行 。 通过单击一行的末尾并按Enter,在其 下方创建一个新行 。

e。 将以下代码复制并粘贴到新行上: const repromptText = ‘I was born November sixth, two thousand fourteen. When were you born?’;

   handle(handlerInput) {

        const speakOutput = 'Hello! Welcome to Caketime. What is your birthday?';

        const repromptText = 'I was born Nov. 6th, 2014. When were you born?';    

 

        return handlerInput.responseBuilder

请注意,重新提示给出了一个示例,该示例说明了Alexa希望用户说的话,即让Alexa以她想要的格式提供自己的生日。提供此类示例是最佳做法。

请注意,数字是在提示文本中阐明的。您可以使用语音合成标记语言(SSML)让Alexa阅读“ 2014”。

现在,您希望代码将repromptText变量传递给 .reprompt() function。

F。 在LaunchRequestHandler,的 handle() function,,用 .reprompt(repromptText)取代 .reprompt(speakOutput) ,用 .ask(reprompt_text)更换 .ask(speak_output)

现在 ,LaunchRequestHandler中的 handle()函数 应如下所示:

handle(handlerInput){

        const sayOutput ='你好!欢迎来到Caketime。你生日是几岁?

        const repromptText ='我出生于2014年11月6日。您何时出生?    

        返回handlerInput.responseBuilder

            .speak(speakOutput)

            .reprompt(repromptText)

            .getResponse();

向用户询问其生日有潜在的复杂性。他们可能以许多不同的方式回应。例如,用户可能只给出月份和日期,或者他们可能会说类似“下周二”。

在本课程中,您将不会处理用户可能采取的所有不同方式,但是当您完成课程时,我们会要求您考虑这些因素。让我们关注一种确保Alexa能够从用户那里收集月,日和年的方法。

在继续之前,请保存并部署更新的代码。

G。 点击 保存。
在这里插入图片描述

H。 点击 部署。

在这里插入图片描述
养成定期保存和部署更改的习惯,以确保您不会丢失任何内容。随身携带!

Cake Time技能现在可以问和听,但还无法响应。您需要在测试之前更新我们的技能的前端。具体来说,您需要创建一个意图来解释用户对技能问题的回答。

步骤2:使用意图和插槽捕获信息
现在,对技能的前端进行一些调整。具体来说,您需要创建一个意图,以解释用户如何回应Alexa的问题。

当您命名意图时,请考虑该意图将要做什么。在这种情况下,该意图将捕获用户的生日,因此将其命名为 CaptureBirthdayIntent。请注意,单词之间没有空格,每个新单词都以大写字母开头。

一个。 单击 生成 选项卡。

b。 在“ 意图 ”右侧 ,单击“ add”。将打开“添加意图”窗口。

在这里插入图片描述
C。 选择“ 创建自定义意图”, 然后输入以下文本作为意图名称: CaptureBirthdayIntent

在这里插入图片描述
d。 点击 创建自定义意图。目的已创建。

请记住,意图是一种满足用户请求的动作。话语是调用意图的原因。在回答生日问题时,用户可能会说: “I was born on November seventh, nineteen eighty three.”。您可以通过完全按照用户说的方式键入它,将其添加到CaptureBirthdayIntent中。

e。 在“ 示例发言” 字段中,键入以下内容,然后按 Enter 或单击+图标: 我出生于11月7日183日

请注意,该文本不包含标点符号。

完成后,“蛋糕时间”技能将能够捕获任何生日。

通过这种话语,可以收集三个关键信息:月,日和年。这些称为插槽。您需要让Alexa知道哪些单词是插槽,以及它们是哪种插槽。

从月份槽开始。在话语中,您将表示月份(11月)的单词替换为 大括号({})中的月份单词 。这将创建一个名为month的插槽。话语将如下所示: I was born on {month} seventh nineteen eighty three

有两种创建插槽的方法。第一种方法是在示例话语中选择插槽应移到的单词,然后在大括号中键入插槽的名称(例如 {month})。

第二种方法是在示例话语中选择单词,并 在出现时使用“ 选择现有插槽”对话框。在对话框中,单击“ 创建新插槽”下的字段 ,键入不带大括号的插槽名称(例如 month),然后单击“ 添加”。

在这里插入图片描述
F。 在话语中,使用创建插槽的任何一种方法 在单词 November上创建一个名为month的插槽 。

G。 对其他可变信息(day and year).重复此过程。

您的讲话现在应该像这样: I was born on {month} {day} {year}

如果用户忽略了我出生的单词 怎么办?通过仅在插槽中添加第二个发音来解决此问题。

H。 在“Sample Utterances 字段中,键入以下内容,然后按 Enter 或单击+图标: {month} {day} {year}

在这里插入图片描述
输入样本话语时,您可能需要按两次ENTER键以添加话语。您也可以单击+图标。

现在,您应该考虑其他一些潜在的插槽组合。

一世。 输入下面的每个示例作为样本语音。完成后,您应该有六种话语。

{month} {day}
{month} {day} {year}
{month} {year}
I was born on {month} {day}
I was born on {month} {day} {year}
I was born in {month} {year}

您已让Alexa知道需要收集哪些插槽(并涵盖了用户可能会提供该信息的某些不同模式)。现在,您需要通过为每个插槽分配插槽类型来确切定义这些插槽是什么。

向下滚动页面到 Intent Slots。该区域显示您创建的插槽。

在这里插入图片描述
插槽是从 每个插槽右侧的“ 插槽类型”下拉菜单分配的。

插槽类型有两种:自定义和内置。尽可能使用内置插槽。Alexa管理内置插槽的定义。这些插槽以AMAZON开头, 后跟它们的定义(例如 AMAZON.Month)。

如果不存在适用的内置插槽,请创建一个自定义插槽并定义其代表的值。对于本课程,您将仅使用内置插槽。

在这里插入图片描述
j。 在month 插槽的右侧, 从“ 插槽类型” 下拉菜单中选择“ AMAZON.Month ” 。

k。 对于 day 时段,请选择 AMAZON.Ordinal 作为时段类型。

l。 对于 year 插槽,选择 AMAZON.FOUR_DIGIT_NUMBER 作为插槽类型。

在这里插入图片描述
您已经创建了一个收集用户生日的意图。

但是,对于所有三个广告位值都不响应的用户呢?例如,响应为“七月”的用户。让我们看一下解决该问题的方法。

在页面顶部,点击 Save Model.

步骤3:使用对话管理
插槽可以是必需的或可选的。也就是说,如果您需要用户提供给定的值,则可以使用对话框管理根据需要指定插槽。根据需要标记插槽会触发Alexa积极进行填充。首先制作每个所需的插槽。

a。 在 Intent Slots 部分,在 month 插槽右侧,单击 Edit Dialog。

b。 在“ Slot Filling”下,切换为所需的插槽。

插槽填充屏幕截图
在 Alexa speech prompts 出现。在这里,您将输入用于Alexa的文本,以说明用户是否无法提供month 插槽的值 。

C。 在字段中,键入 What month were you born in? 然后按 Enter 或单击+图标。

插槽填充屏幕截图
d。 对day 和 year 重复此过程 。

注意:通过单击 左侧面板中的CaptureBirthdayIntent,返回输入样本话语的 屏幕。

在这里插入图片描述

现在需要使用该时段,如果用户回答"July nineteen eighty two" ,Alexa可以识别出月份和年份时段已满,而白天时段则没有。

Alexa将提示用户输入每个未填充的插槽。在此示例中,Alexa会问: “What day were you born?”

对话框管理的一大优点是,如果用户遗漏了一条信息或未按预期顺序提供信息,则该技能不会中断或感到困惑。相反,Alexa负责收集按要求指定的信息,以确保提供有用的体验。

您已经建立了一个意图,可以监听用户对生日问题的回答。用户做出响应时,Alexa会收集用户的生日月份,日期和年份。此信息将通过JSON请求发送到技能的后端代码。

在继续之前,请注意 左侧面板中的 HelloWorld意图。这是您不需要的入门模板的剩余内容。

e。 通过单击其右侧的垃圾箱图标 删除 HelloWorldIntent意图。出现提示时,点击 Delete Intent.。

注意删除 HelloWorldIntent 而 不是 CaptureBirthdayIntent。

在这里插入图片描述
您可能会注意到其他意图(例如AMAZON.HelpIntent)已自动添加到您的技能中。这些是每项技能所必需的,并为用户提供了取消,停止和获得帮助的方法。不要删除这些。

F。 在页面顶部,点击 保存模型。

G。 单击 构建模型。

当您单击 Build Model时,您的技能将开始构建训练数据,这将帮助Alexa知道如何将用户所说的内容映射到您的技能意图。建立模型可能需要一分钟。
此时,您的技能可以询问和倾听。现在,使其响应。

步骤4:定义新的处理程序

还记得修改 LaunchRequestHandler吗?这次,您将构建一个新的处理程序。该处理程序将确认用户提供了他们的生日,并将生日重复给用户。

如果看一下代码,您会注意到 HelloWorldIntentHandler。但是您删除了 HelloWorldIntent,对吗?不是完全。该intent 已从前端消失,但后端处理程序仍然存在。您需要一个新的处理程序,因此使事情变得简单,并将此处理程序重用于一个名为CaptureBirthdayIntentHandler的新处理程序 。

b。 找到以const HelloWorldIntentHandler开头的行 。在那一行,将HelloWorldIntentHandler重命名 为 CaptureBirthdayIntentHandler

C。 在 CaptureBirthdayIntentHandler中,在&& handlerInput开头的行上 ,将“ HelloWorldIntent ” 更改为“ CaptureBirthdayIntent ”

此更改可确保 在CaptureBirthdayIntent 请求通过时调用canHandle() function 。处理程序代码现在应如下所示:

const CaptureBirthdayIntentHandler = {

    canHandle(handlerInput){

        返回Alexa.getRequestType(handlerInput.requestEnvelope)==='IntentRequest'

            && Alexa.getIntentName(handlerInput.requestEnvelope)==='CaptureBirthdayIntent';

现在,您需要更新处理程序中的逻辑,以便Alexa会向用户确认她已经听了他们的生日。在这种情况下,您将让Alexa像这样将生日读回给用户: “Thanks, I’ll remember that you were born on {month} {day} {year}.”
首先在处理程序中创建三个变量以保存技能正在收集的插槽。

d。 在 CaptureBirthdayIntentHandler内,找到以handle(handlerInput){开头的行 。在它下面 创建一个新行 。

e。 将以下代码复制并粘贴到新行中:

const year = handlerInput.requestEnvelope.request.intent.slots.year.value;
const month = handlerInput.requestEnvelope.request.intent.slots.month.value;
const day = handlerInput.requestEnvelope.request.intent.slots.day.value;

处理程序代码现在应如下所示:

const CaptureBirthdayIntentHandler = {

    canHandle(handlerInput) {

        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'

            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'CaptureBirthdayIntent';

    },

    handle(handlerInput) {

        const year = handlerInput.requestEnvelope.request.intent.slots.year.value;

        const month = handlerInput.requestEnvelope.request.intent.slots.month.value;

        const day = handlerInput.requestEnvelope.request.intent.slots.day.value;

            

        const speakOutput = `Thanks, I'll remember that you were born ${month} ${day} ${year}.`;

        return handlerInput.responseBuilder

            .speak(speakOutput)

            //.reprompt('add a reprompt if you want to keep the session open for the user to respond')

            .getResponse();

    }

};

接下来,更新 peakOutput。为此,请使用字符串插值。这使您可以将新变量拖放到文本字符串中。这是字符串插值的示例:

Looks like you were born in ${month}

这看起来类似于插槽声明,但是有两个区别。首先,请注意大括号({})之前的美元符号($)。其次,该语句被封装在反引号(`)中,而不是单引号或双引号。

F。 在 CaptureBirthdayIntentHandler 内的 handle() function中,找到以const sayOutput 开头的行 。用以下代码替换该行:

const speakOutput = Thanks, I'll remember that your birthday is ${month} ${day} ${year}.;

您快完成了。还记得将HelloWorldIntentHandler更改 为 CaptureBirthdayIntentHandler吗?在使用SDK的每项技能中,都有一个地方可以将可用的处理程序通知给SDK。这称为注册。更新代码以注册新的处理程序。

G。 向下滚动代码,直到找到开始export.handler的行 。

在此行下,注意 .addRequestHandlers() function。在该功能中,请注意技能中的处理程序列表。 HelloWorldIntentHandler 已列出,您需要将其更改为 CaptureBirthdayIntentHandler。否则,该技能将出错。

H。 在 .addRequestHandlers() function中, 用 CaptureBirthdayIntentHandler替换 HelloWorldIntentHandler

进行替换时,请确保在CaptureBirthdayIntentHandler之后保留逗号(,) 。

处理程序代码现在应如下所示:

exports.handler = Alexa.SkillBuilders.custom()

    .addRequestHandlers(

        LaunchRequestHandler,

        CaptureBirthdayIntentHandler,

        HelpIntentHandler,

        CancelAndStopIntentHandler,

        SessionEndedRequestHandler,

保存和部署
在这里插入图片描述

步骤5:测试您的技能

现在该测试了!Cake Time技能现在应该能够执行以下操作:

Ask 用户询问生日
Listen用户的回答,如果缺少任何必需的时段 (month, day, year),则自动跟进问题
通过重复他们的生日来Respond 用户
让我们测试一下技能。

a。 单击 test 选项卡。

请记住,您可以通过在左上角的框中键入用户的发言来进行测试,或者可以通过单击并按住麦克风图标并讲话来与技能对话。

b。 通过打开“Cake Time”并在Alexa要求您生日时做出回应来测试您的技能。

在这里插入图片描述
如果您通过键入用户会说的内容进行测试,请拼出数字 (for example, November seventh nineteen eighty three).。否则,数字将无法理解。您可能已经注意到,在整个课程中,数字是有目的地拼写出来的。这只是键入时的要求。如果您讲技巧,数字将自动转换。

Alexa应该回应:“Thanks, I’ll remember that your birthday is {month} {day} {year}.”

继续并测试如果仅提供年,年,日或其他组合,会发生什么情况。Alexa应该提示您省略任何插槽值。

Wrap-up

此时,您的技能变得更加细微了。它可以向用户询问生日,并将其重复发送给用户。恭喜你!

但是,尽管您的技能可以要求用户生日,但是您的技能在下次打开时就不会记住它。如果Cake Time记住用户的生日,那将是更好的用户体验。在下一节中,您将学习如何使自己的技能记住事情。

Code
如果您的技能不起作用或遇到某种语法错误,请从下面的链接下载Node.js或Python中的代码示例。然后,转到Alexa开发人员控制台中的“code”选项卡,然后将代码复制并粘贴到index.js文件中。在测试之前,请确保保存并部署代码。

Node.js Github Code Sample, Module 2: Collecting Slots Turn by Turn

Python Github Code Sample, Module 2: Collecting Slots Turn by Turn

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页