AnswerHandler和PlayerCountHandler混杂在一起

时间:2018-08-31 22:10:19

标签: node.js alexa alexa-skills-kit alexa-skill alexa-slot

我正在使用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会再次提示“欢迎使用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;

1 个答案:

答案 0 :(得分:2)

之所以发生这种情况,是因为您的AnswerOnlyIntentAnswerQuestionIntentPlayerCount都具有数字插槽。当用户说出预期的数字时,它们会被映射。一个好主意是让一个意图从用户那里输入数字。例如: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>

这个想法很简单,对于该特定种类的所有输入仅使用一种意图。对于数字输入,只需使用一个映射数字的意图。