AnswerHandler 和 PlayerCountHandler 混淆了
AnswerHandler and PlayerCountHandler mixed up
我正在使用 this template from Amazon for a trivia game 构建 Alexa 按钮技能。在游戏中,Alexa 提出问题,用户根据插槽类型 "answers" 回答问题,该插槽类型具有以下模板值:
fox,
wolf,
cat,
etc.
我希望用户能够用数字而不是单词来回答琐事问题。
我复制了交互模型并将 Lambda 函数连接到我的 Alexa 技能(根据自述文件)。当我在不更改任何代码的情况下对其进行测试时,它工作正常。对话框是这样的:
- Alexa:欢迎使用 Beginning Addition。该游戏最多支持 4 名玩家。有多少玩家?
- 用户:两个
- Alexa:好的。玩家们,现在按下你的按钮,这样我就知道你将使用哪个按钮。
设备日志中的调试信息显示 Alexa 认为用户正在响应 PlayerCount 意图,这是正确的:
"request": {
"type": "IntentRequest",
"intent": {
"name": "PlayerCount",
"confirmationStatus": "NONE",
"slots": {
"players": {
"name": "players",
"value": "2",
"confirmationStatus": "NONE"
}
}
}
}
当我将 AnswerQuestionIntent 和 AnswerOnlyIntent 的插槽类型更改为 "AMAZON.NUMBER"(而不是插槽类型 "answers")时,对话框如下所示:
- Alexa:欢迎使用 Beginning Addition。该游戏最多支持 4 名玩家。有多少玩家?
- 用户:两个
- Alexa:抱歉,我没听懂。请再说一遍!
(注意:如果用户响应任何其他内容,Alexa 将重新提示 "Welcome to Better with Buttons Trivia. This game supports up to 4 players. How many players are there?")
查看设备日志中的调试信息,我可以看到 Alexa 认为意图是 AnswerOnlyIntent,而不是 PlayerCount:
"request": {
"type": "IntentRequest",
"intent": {
"name": "AnswerOnlyIntent",
"confirmationStatus": "NONE",
"slots": {
"answers": {
"name": "answers",
"value": "2",
"confirmationStatus": "NONE"
}
}
}
}
为什么 Alexa 认为用户需要 AnswerOnlyIntent?
根据 CloudWatch 日志,设置为重新提示用户的不是 AnswerHandler which is handling the response, but the Global DefaultHandler。 AnswerHandler 应该只在以下条件下 运行:
return requestEnvelope.request.type === 'IntentRequest' &&
(requestEnvelope.request.intent.name === 'AnswerQuestionIntent' ||
requestEnvelope.request.intent.name === 'AnswerOnlyIntent') &&
validPlayerCount &&
(sessionAttributes.STATE === settings.STATE.BUTTON_GAME_STATE ||
sessionAttributes.STATE === settings.STATE.BUTTONLESS_GAME_STATE);
PlayerCountHandler returns 如果满足以下条件,则可以处理:
return requestEnvelope.request.type === 'IntentRequest' &&
(requestEnvelope.request.intent.name === 'PlayerCount' ||
requestEnvelope.request.intent.name === 'PlayerCountOnly') &&
attributesManager.getSessionAttributes().STATE === settings.STATE.START_GAME_STATE;
发生这种情况是因为您的 AnswerOnlyIntent
、AnswerQuestionIntent
和 PlayerCount
都有号码位。当用户说出一个数字时,它们就会被映射,这是预期的。一个好主意是 只有一个 意图,它从用户那里获取数字输入。例如:NumberInputIntent
。每当用户说出数字时,Alexa 就会映射它。这样,当涉及到数字时,您总是可以期望映射此意图。
使用 sessionAttributes
跟踪用户喜欢的内容
STATE = "playerCount"
或 STATE = "answer"
.
您可以对这些 canHandle() 条件使用两个不同的处理程序。
return requestEnvelope.request.type === 'IntentRequest'
&& requestEnvelope.request.intent.name === 'NumberInputIntent'
&& validPlayerCount
&& sessionAttributes.STATE === 'answer'
&& <add your extra conditions>
以及玩家数量
return requestEnvelope.request.type === 'IntentRequest'
&& requestEnvelope.request.intent.name === 'NumberInputIntent'
&& validPlayerCount
&& sessionAttributes.STATE === 'playerCount'
&& <add your extra conditions>
这个想法很简单,对特定类型的所有输入只使用一个意图。对于数字输入,只需使用一个映射数字的意图。
我正在使用 this template from Amazon for a trivia game 构建 Alexa 按钮技能。在游戏中,Alexa 提出问题,用户根据插槽类型 "answers" 回答问题,该插槽类型具有以下模板值:
fox,
wolf,
cat,
etc.
我希望用户能够用数字而不是单词来回答琐事问题。
我复制了交互模型并将 Lambda 函数连接到我的 Alexa 技能(根据自述文件)。当我在不更改任何代码的情况下对其进行测试时,它工作正常。对话框是这样的:
- Alexa:欢迎使用 Beginning Addition。该游戏最多支持 4 名玩家。有多少玩家?
- 用户:两个
- Alexa:好的。玩家们,现在按下你的按钮,这样我就知道你将使用哪个按钮。
设备日志中的调试信息显示 Alexa 认为用户正在响应 PlayerCount 意图,这是正确的:
"request": {
"type": "IntentRequest",
"intent": {
"name": "PlayerCount",
"confirmationStatus": "NONE",
"slots": {
"players": {
"name": "players",
"value": "2",
"confirmationStatus": "NONE"
}
}
}
}
当我将 AnswerQuestionIntent 和 AnswerOnlyIntent 的插槽类型更改为 "AMAZON.NUMBER"(而不是插槽类型 "answers")时,对话框如下所示:
- Alexa:欢迎使用 Beginning Addition。该游戏最多支持 4 名玩家。有多少玩家?
- 用户:两个
- Alexa:抱歉,我没听懂。请再说一遍!
(注意:如果用户响应任何其他内容,Alexa 将重新提示 "Welcome to Better with Buttons Trivia. This game supports up to 4 players. How many players are there?")
查看设备日志中的调试信息,我可以看到 Alexa 认为意图是 AnswerOnlyIntent,而不是 PlayerCount:
"request": {
"type": "IntentRequest",
"intent": {
"name": "AnswerOnlyIntent",
"confirmationStatus": "NONE",
"slots": {
"answers": {
"name": "answers",
"value": "2",
"confirmationStatus": "NONE"
}
}
}
}
为什么 Alexa 认为用户需要 AnswerOnlyIntent?
根据 CloudWatch 日志,设置为重新提示用户的不是 AnswerHandler which is handling the response, but the Global DefaultHandler。 AnswerHandler 应该只在以下条件下 运行:
return requestEnvelope.request.type === 'IntentRequest' &&
(requestEnvelope.request.intent.name === 'AnswerQuestionIntent' ||
requestEnvelope.request.intent.name === 'AnswerOnlyIntent') &&
validPlayerCount &&
(sessionAttributes.STATE === settings.STATE.BUTTON_GAME_STATE ||
sessionAttributes.STATE === settings.STATE.BUTTONLESS_GAME_STATE);
PlayerCountHandler returns 如果满足以下条件,则可以处理:
return requestEnvelope.request.type === 'IntentRequest' &&
(requestEnvelope.request.intent.name === 'PlayerCount' ||
requestEnvelope.request.intent.name === 'PlayerCountOnly') &&
attributesManager.getSessionAttributes().STATE === settings.STATE.START_GAME_STATE;
发生这种情况是因为您的 AnswerOnlyIntent
、AnswerQuestionIntent
和 PlayerCount
都有号码位。当用户说出一个数字时,它们就会被映射,这是预期的。一个好主意是 只有一个 意图,它从用户那里获取数字输入。例如:NumberInputIntent
。每当用户说出数字时,Alexa 就会映射它。这样,当涉及到数字时,您总是可以期望映射此意图。
使用 sessionAttributes
跟踪用户喜欢的内容
STATE = "playerCount"
或 STATE = "answer"
.
您可以对这些 canHandle() 条件使用两个不同的处理程序。
return requestEnvelope.request.type === 'IntentRequest'
&& requestEnvelope.request.intent.name === 'NumberInputIntent'
&& validPlayerCount
&& sessionAttributes.STATE === 'answer'
&& <add your extra conditions>
以及玩家数量
return requestEnvelope.request.type === 'IntentRequest'
&& requestEnvelope.request.intent.name === 'NumberInputIntent'
&& validPlayerCount
&& sessionAttributes.STATE === 'playerCount'
&& <add your extra conditions>
这个想法很简单,对特定类型的所有输入只使用一个意图。对于数字输入,只需使用一个映射数字的意图。