Я создаю навык кнопки Alexa, используя этот шаблон от Amazon для викторины . В игре Алекса задает вопросы, а пользователи отвечают с ответом из слота типа «ответы», который имеет следующие значения из шаблона:
fox,
wolf,
cat,
etc.
Я хочу, чтобы пользователи могли отвечать на вопросы по пустякам числом, а не словом.
Я скопировал модель взаимодействия и соединил лямбда-функцию с моим навыком Alexa (согласно readme). Когда я тестирую его без изменения какого-либо кода, он работает нормально. Диалог выглядит так:
- Алекса: Добро пожаловать в начало добавления. Эта игра поддерживает до 4 игроков. Сколько там игроков?
- Пользователь: два
- Алекса: Хорошо. Игроки, нажмите ваши кнопки сейчас, чтобы я знал, какие кнопки вы будете использовать.
Отладочная информация из журнала устройства показывает, что 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 ответит на вопрос «Добро пожаловать лучше с кнопками викторины. Эта игра поддерживает до 4 игроков. Сколько игроков?»)
Глядя на информацию об отладке из журнала устройств, я вижу, что Алекса считает, что целью является 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;