【问题标题】:AnswerHandler and PlayerCountHandler mixed upAnswerHandler 和 PlayerCountHandler 混淆了
【发布时间】:2018-08-31 22:10:19
【问题描述】:

我正在使用 this template from Amazon for a trivia game 构建 Alexa 按钮技能。在游戏中,Alexa 提出问题,用户以来自插槽类型“answers”的答案进行响应,该类型具有模板中的以下值:

fox,
wolf,
cat,
etc.

我希望用户能够用数字而不是单词来回答琐事问题。

我复制了交互模型并将 Lambda 函数连接到我的 Alexa 技能(根据自述文件)。当我在不更改任何代码的情况下对其进行测试时,它工作正常。对话框是这样的:

  • Alexa:欢迎使用Beginning Addition。该游戏最多支持 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:欢迎使用Beginning Addition。该游戏最多支持 4 名玩家。有多少玩家?
  • 用户:两个
  • Alexa:抱歉,我没听懂。请再说一遍!

(注意:如果用户回复任何其他内容,Alexa 将重新提示“欢迎来到 Better with Buttons 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;

【问题讨论】:

  • 嗨 Olivia,Cicil 的回答很到位。您需要做的是稍微修改技能:为仅数字答案提供更通用的处理程序。然后,根据状态 - 如果要查找玩家数量,请以这种方式使用答案;如果要寻找问题的答案,请以这种方式使用答案

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


【解决方案1】:

发生这种情况是因为您的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>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多