我正在使用this template from Amazon for a trivia game建立Alexa按钮技能。在游戏中,Alexa提出问题,并且用户使用广告位类型“ answers”(答案)获得答案,该模板类型具有以下值:
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会再次提示“欢迎使用Button Trivia改善游戏。此游戏最多支持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;
答案 0 :(得分:2)
之所以发生这种情况,是因为您的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>
这个想法很简单,对于该特定种类的所有输入仅使用一种意图。对于数字输入,只需使用一个映射数字的意图。