Alexa 技能工具包 (ASK) 和话语

Posted

技术标签:

【中文标题】Alexa 技能工具包 (ASK) 和话语【英文标题】:Alexa Skills Kit (ASK) and Utterances 【发布时间】:2017-03-28 14:51:54 【问题描述】:

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

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

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

谢谢, 约翰

【问题讨论】:

我无法回答这个问题,但我在使用测试 UI 和实际设备时遇到了类似的差异。 +1 提问。我打算带你去 Alexa Skills Kit Dev 论坛,但看起来你也已经在那里发布了这个问题。 :-) 我认为这是测试接口的工件。您是否尝试在您的设备上对此进行测试? @John 你找到解决方案了吗? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

这怎么没用?【参考方案3】:

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

在 Node.js 中,如果 Alexa 语音服务返回的意图在给定的 MODE 内不可用,则在 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 语音服务必须解释您的话语并将其映射到可用意图之一。如果您的话语是垃圾并且未映射到任何特定意图,则它当前正在映射到第一个意图。

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

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

场景 3:我什么都想要。使用自定义插槽类型 如上所述的语法通常可以满足这种愿望并实现 您可以通过 NLP 训练提高准确性。如果你还只是想要 一切,您可以创建一个自定义插槽,称为 “CatchAll”以及相应的意图和话语:CatchAllIntent 全部捕获。如果您使用与您将使用的相同的训练数据 对于 LITERAL,您将得到相同的结果。人们通常会发现 添加更多特定场景的训练数据可以提高 准确性。

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

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

【讨论】:

以上是关于Alexa 技能工具包 (ASK) 和话语的主要内容,如果未能解决你的问题,请参考以下文章

Alexa 无法识别某些依赖于样本话语的槽值

Alexa 技能工具包 -Lambda 函数 - 无法验证 SpeechletRequest (java)

Alexa Skill Development 使用 flask-ask 和 ngrok 错误

ios 应用程序中的 Amazon Alexa 自定义技能问题

使用烧瓶询问的 Alexa 技能:HTTP 500:内部服务器错误

亚马逊推Alexa技能开发工具:使用者无需编程能力