我正在使用this template from Amazon for a trivia game构建一个Alexa按钮技能。在游戏中,Alexa会询问问题,用户会回答插槽类型“答案”中的答案,其中包含以下来自模板的值:
fox,
wolf,
cat,
etc.
我希望用户能够使用数字而不是单词回答琐事问题。
我复制了交互模型并将Lambda函数连接到我的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认为意图是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;
发生这种情况是因为你的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>
这个想法很简单,只对该特定类型的所有输入使用一个意图。对于数字输入,只需使用一个映射数字的意图。