'任何'类似于Alexa自定义插槽中的行为

时间:2018-05-04 14:20:27

标签: alexa alexa-skills-kit alexa-slot

我想完成以下场景: Alexa与用户之间的小对话,具有以下2个意图:

  • NameIntent:"我的名字是{name}"

其中{name}AMAZON.US_FIRST_NAME且需要插槽并定义提示。

  • ActivityIntent:"我喜欢{activity}"

这里变得更加困难。我为{activity}制作了一个自定义广告位,并为其定义了一些值,例如"钓鱼,体育"等等,但显然有更多的答案。如果我现在回答我没有定义的东西(例如"飞镖"),Alexa总会回到第一个意图,因为它似乎是一个名字。

示例:

LaunchRequest:"欢迎。你叫什么名字?" - >我的名字是彼得

NameIntent:"欢迎彼得。你喜欢做什么?" - >飞镖 - > "欢迎飞镖。你喜欢做什么?"

我只想让Alexa接受用户在那里说的任何价值,在Dialogflow中,只需使用 {any} 实体即可。 我跟踪了来自alexa博客的this blog article,在那里他们似乎能够捕获你扔给它的任何昵称,甚至是那些没有被定义的昵称,这就是我想在这里完成的。

问题:如何使用Alexa捕获任何类型的输入,除了我在技能构建器中定义的任何内容之外的短语?如何确保此短语指向正确的意图?

我对此感到有点沮丧,特别是如果你使用ElicitSlotDirectives专门向用户询问一个插槽,然后它跳转到一个完全不同的意图。

2个intent处理程序的代码:

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();
    },
};

2 个答案:

答案 0 :(得分:0)

似乎Alexa无法将活动话语与您的[Vue warn]: Property or method "fruits" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties. found in ---> <FruitList> at src/components/FruitList.vue <App> at src/App.vue <Root> 相关联,而是再次调用ActivityIntent。依靠亚马逊来确定基于插槽类型的使用意图对我来说并不是很好。如果你发布了非常有帮助的意图代码。

查看来自亚马逊hereAmazon's Voice Design Guide的JavaScript示例可能会有所帮助。

答案 1 :(得分:0)

您可以考虑使用AMAZON.LITERAL内置自定义插槽类型。此插槽类型传递所说的单词而不进行任何转换。虽然官方文件建议不要使用它。它也被停止了一次。来自官方文档。

  

注意:虽然您可以使用AMAZON.LITERAL提交新的和更新的英语(美国)技能,但在大多数情况下,自定义插槽类型比AMAZON.LITERAL提供更高的准确性。因此,我们建议您尽可能考虑迁移到自定义插槽类型。请注意,除英语(美国)以外的任何语言均不支持AMAZON.LITERAL。

在此处详细了解AMAZON.LITERALhttps://developer.amazon.com/docs/custom-skills/literal-slot-type-reference.html