首页 文章

AnswerHandler和PlayerCountHandler混在一起

提问于
浏览
0

我正在使用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将重新推销“欢迎使用按钮琐事更好 . 此游戏最多支持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 回答

  • 2

    发生这种情况是因为 AnswerOnlyIntentAnswerQuestionIntentPlayerCount 都有数字插槽 . 当用户说出一个数字时,它们会被映射,这是预期的 . 一个好主意是拥有 just one intent,它接受来自用户的数字输入 . 例如: 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>
    

    这个想法很简单, use only one intent for all inputs of that particular kind . 对于数字输入,只需使用一个映射数字的意图 .

相关问题