我正在使用this template from Amazon for a trivia game构建一个Alexa按钮技能 . 在游戏中,Alexa会询问问题,用户会回答来自插槽类型"answers"的答案,该答案类型具有以下值:
fox,
wolf,
cat,
etc.
我希望用户能够使用数字而不是单词回答琐事问题 .
我复制了交互模型并将Lambda函数连接到我的Alexa技能(根据自述文件) . 当我测试它而不更改任何代码时,它工作正常 . 对话框如下:
-
Alexa:欢迎来到开始 . 这个游戏最多支持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:欢迎来到开始 . 这个游戏最多支持4名玩家 . 有多少名球员?
-
用户:两个
-
Alexa:对不起,我没理解 . 请再说一遍!
(注意:如果用户回复任何其他内容,Alexa将重新推销“欢迎使用按钮琐事更好 . 此游戏最多支持4名玩家 . 有多少玩家?”)
查看设备日志中的调试信息,我可以看到Alexa认为意图是AnswerOnlyIntent,而不是PlayerCount:
"request": {
"type": "IntentRequest",
"intent": {
"name": "AnswerOnlyIntent",
"confirmationStatus": "NONE",
"slots": {
"answers": {
"name": "answers",
"value": "2",
"confirmationStatus": "NONE"
}
}
}
}
为什么Alexa认为用户想要AnswerOnlyIntent?
根据CloudWatch日志,它不是AnswerHandler正在处理响应,而是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返回canHandle:
return requestEnvelope.request.type === 'IntentRequest' &&
(requestEnvelope.request.intent.name === 'PlayerCount' ||
requestEnvelope.request.intent.name === 'PlayerCountOnly') &&
attributesManager.getSessionAttributes().STATE === settings.STATE.START_GAME_STATE;
1 回答
发生这种情况是因为
AnswerOnlyIntent
,AnswerQuestionIntent
和PlayerCount
都有数字插槽 . 当用户说出一个数字时,它们会被映射,这是预期的 . 一个好主意是拥有 just one intent,它接受来自用户的数字输入 . 例如:NumberInputIntent
. 每当用户说出一个数字时,Alexa就会映射它 . 这样,当涉及到数字时,您始终可以期望映射此意图 .使用
sessionAttributes
跟踪用户之外的内容STATE = "playerCount"
或STATE = "answer"
.您可以使用具有这些canHandle()条件的两个不同处理程序 .
并为球员计数
这个想法很简单, use only one intent for all inputs of that particular kind . 对于数字输入,只需使用一个映射数字的意图 .