AnswerHandler和PlayerCountHandler混在一起

问题描述 投票:0回答:1

我正在使用this template from Amazon for a trivia game构建一个Alexa按钮技能。在游戏中,Alexa会询问问题,用户会回答插槽类型“答案”中的答案,其中包含以下来自模板的值:

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;
node.js alexa alexa-skills-kit alexa-skill alexa-slot
1个回答
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>

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

© www.soinside.com 2019 - 2024. All rights reserved.