7

我正在为 Alexa 开发一个简单的自定义技能。我已经启动并运行它,并将处理程序托管在 AWS Lambda 上。它工作正常,除了...

在测试 UI 中,如果我输入有效的话语,例如帮助、取消、游泳、跑步(两个自定义话语),一切正常;但是,如果我输入一个无意义的话语,例如 dsfhfdsjhf,Alexa 服务总是将无意义的内容映射到意图模式中的第一个有效意图。

在我的 lambda 代码中,我有一个处理未知意图的处理程序;但是,意图永远是未知的。这是测试接口的神器吗?还有什么事情发生吗?

谢谢,约翰

4

3 回答 3

2

基于在您的方法中包含未处理的意图,听起来您正在使用适用于 Node.js 的 Alexa Skills Kit SDK。您的问题不是测试接口的工件。是的,正在发生其他事情。

虽然亚马逊尚未承认,但这是许多人在 SDK 中公认的问题。请参阅这个未解决的问题。从个人经验到上面的建议,不管你是用真话还是胡言乱语,未处理的意图永远不会被调用。在解决此问题之前,我的建议是构建一个处理程序,它是对您的技能的高级提示,并为用户重申他们拥有的有效选项。将其定位为包罗万象。希望我们会看到这个 SDK 得到更好的维护。

于 2017-01-22T06:15:56.577 回答
0

不要输入 dsfhfdsjhf (在 Alexa 知道的任何语言中都不能发音),如果你的话语是 boogie 或shake 会发生什么?

在现实世界的场景中,我认为 Alexa 永远不会通过 dsfhfdsjhf,因此可能很难准确计划行为会是什么。

于 2017-01-18T14:26:27.190 回答
0

因此,您希望将所有垃圾输入通过管道传输到单个意图。你很幸运。在继续之前,您应该了解以下几点。

在 Node.js 中,MODE如果 Alexa 语音服务返回的意图在给定的MODE.
一个例子MODE是确认模式。在许多可用的意图中,是和否是唯一被接受的意图。

var ConfirmationHandlers = Alexa.CreateStateHandler(states.CONFIRMATIONMODE, {
    'YesIntent': function () {
      this.handler.state = states.CLOSINGCOSTSMODE;
      message = ` So you will be buying this house. Great! `; 
      reprompt = `Please carry on with the other intents found in the house buyer skill.  `;
      this.emit(':ask', message, reprompt);
    },
    'NoIntent': function () {
      this.handler.state = states.GENERALSEARCHMODE;
      message = ` So you won't be buying this house. That's Ok, Continue searching for your dream house in the House buyer skill. !`; 
      reprompt = `Continue searching for your dream house in the House buyer skill.`;
      this.emit(':ask', message, reprompt);
    },
    'Unhandled': function() {
        console.log("UNHANDLED");
        var reprompt = ` All other intents are disabled at this moment.  Would you like to buy this house Yes or No? `;
        this.emit(':ask', reprompt, reprompt);
    }
});

但是,在到达 lambda 函数之前,Alexa 语音服务必须解释您的话语并将其映射到可用的意图之一。如果您的话语是垃圾并且未映射到任何特定意图,则它当前正在映射到第一个意图。

解决方案:如果你想添加一个垃圾意图,这应该由意图模式而不是未处理的意图来处理。要添加垃圾意图,您可以按照这篇亚马​​逊文章中的说明进行操作。

https://developer.amazon.com/blogs/post/Tx3IHSFQSUF3RQP/Why-a-Custom-Slot-is-the-Literal-Solution

场景3:我什么都想要。如上所述为语法使用自定义槽类型通常可以满足这一需求,并使您能够通过 NLP 训练提高准确性。如果您仍然只想要所有内容,您可以创建一个名为“CatchAll”之类的自定义插槽以及相应的意图和话语:CatchAllIntent {CatchAll}。如果您使用与 LITERAL 相同的训练数据,您将获得相同的结果。人们通常会发现添加更多特定场景的训练数据可以提高准确性。

如果您仍然没有得到结果,请尝试将 CatchAll 值设置为大约 20 个 2 到 8 个单词的随机短语(来自随机单词生成器 - 非常随机)。当用户说出与您的其他话语相匹配的内容时,仍会发送这些意图。当它与其中任何一个都不匹配时,它将落入 CatchAll 插槽。如果你走这条路,你会失去准确性,因为你没有充分利用 Alexa 的 NLP,所以你需要大量测试。

任何未映射到您的更具体意图之一的输入,例如YESor NO,很可能会映射到此CatchAll意图。

于 2017-08-06T07:17:31.930 回答