【发布时间】:2018-06-11 08:11:28
【问题描述】:
我想完成以下场景: Alexa 和用户之间的小对话,包含以下 2 个 Intent:
-
NameIntent: "我叫{name}"
其中{name} 是AMAZON.US_FIRST_NAME,并且需要指定插槽并定义提示。
-
ActivityIntent: "我喜欢{activity}"
而这里变得更加困难。我制作了{activity} 一个自定义插槽,并为它定义了一些值,例如“钓鱼、运动”等,但显然还有更多的答案。如果我现在用我没有定义的东西(例如“飞镖”)做出回应,Alexa 总是会回到最初的意图,因为它似乎是一个名字。
例子:
LaunchRequest:“欢迎。你叫什么名字?” -> 我叫彼得
NameIntent:“欢迎彼得。你喜欢做什么?” -> 飞镖 -> “欢迎飞镖。你喜欢做什么?”
我只想让 Alexa 接受用户在那里说的任何值,在 Dialogflow 中,这只需使用 {any} 实体即可完成。 我关注了来自 alexa 博客的this blog article,在那里他们似乎能够捕捉到你给它的任何昵称,甚至是那些没有定义的昵称,这就是我想要在这里完成的。
问题:如何使用 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();
},
};
【问题讨论】:
标签: alexa alexa-skills-kit alexa-slot