我想完成以下场景: Alexa 和用户之间的小对话,具有以下 2 个意图:
NameIntent
:“我的名字是{name}
”
在哪里以及需要指定插槽并定义提示{name}
。AMAZON.US_FIRST_NAME
ActivityIntent
:“我喜欢{activity}
”
在这里它变得更加困难。我制作{activity}
了一个自定义插槽并为其定义了一些值,例如“钓鱼、运动”等,但显然还有更多的答案。如果我现在用我没有定义的东西(例如“飞镖”)做出回应,Alexa 总是会回到最初的意图,因为它似乎是一个名字。
例子:
LaunchRequest:“欢迎。你叫什么名字?” -> 我的名字是彼得
NameIntent:“欢迎彼得。你喜欢做什么?” -> 飞镖 -> “欢迎飞镖。你喜欢做什么?”
我只是想让 Alexa 接受用户在那里说的任何值,在 Dialogflow 中,这只需使用{any}实体即可完成。我关注了来自 alexa 博客的这篇博客文章,在那里他们似乎能够捕捉到你扔给它的任何昵称,甚至是那些没有定义的昵称,这正是我想要在这里完成的。
问题:我如何使用 Alexa 捕捉任何类型的输入,超出我在技能构建器中定义的短语?我如何确保这句话指向正确的意图?
我对此有点沮丧,特别是如果您ElicitSlotDirectives
过去专门向用户询问某个插槽,然后它会跳转到完全不同的意图。
2 个意图处理程序的代码:
const NameIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& handlerInput.requestEnvelope.request.intent.name === 'NameIntent';
},
handle(handlerInput) {
const { intent } = handlerInput.requestEnvelope.request;
const name = intent.slots.name.value;
const speechText = `Welcome ${name}. What is your favourite activity?`;
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.withShouldEndSession(false)
.getResponse();
},
};
const ActivityIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& handlerInput.requestEnvelope.request.intent.name === 'ActivityIntent';
},
handle(handlerInput) {
const { intent } = handlerInput.requestEnvelope.request;
const activity = intent.slots.activity.value;
const speechText = `You like ${activity}.`;
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.withShouldEndSession(false)
.getResponse();
},
};