Alexa技能中的多轮对话错误

时间:2019-05-06 12:45:29

标签: alexa alexa-skills-kit alexa-skill alexa-voice-service avspeechutterance

我创建了一个名为“ BuyDog” 的技能,其调用名称为 “ dog app”

这意味着,只有在听到调用名称之后,我才能使用内部定义的意图。 (对吗?)

然后我将带有插槽的意图定义为:

"what is {dog} price."

"Tell me the price of {dog}."

插槽{dog}的插槽类型为“ DogType”。。我已将该插槽标记为满足该要求

然后,我已将端点添加到AWS lambda函数中,在该函数中,我使用了node.js中的factskills项目的蓝图代码,并做了一些小的改动以查看其工作原理。

const GET_DOG_PRICE_MESSAGE = "Here's your pricing: ";

const data = [
    'You need to pay $2000.',
    'You need to pay Rs2000.',
    'You need to pay $5000.',
    'You need to pay INR 3000.',

];
const handlers = {
//some handlers.......................
'DogIntent': function () {
        const factArr = data;
        const factIndex = Math.floor(Math.random() * factArr.length);
        const randomFact = factArr[factIndex];
        const speechOutput = GET_DOG_PRICE_MESSAGE + randomFact;
}
//some handlers.......................
};

根据我期望的about代码

  

我说:“ Alexa开放狗应用程序”

应该准备好听意图“ {dog}的价格是什么。” 和另一个意图。相反,它表示来自node.js代码的data[]数组的随机字符串。在讲完Intent之后,我期望得到这种响应,因为完成Intent需要插槽。 Require

以及何时

  

我说:“打开狗应用程序,然后告诉我XXXX的价格。”

它询问“哪个品种” (这是我定义的问题),但是它可以很好地显示价格

  

Alexa说:“这是您的价格:您需要支付5000美元。”

(或数据数组中的其他值)用于任何XXXX(即狗或非狗类型)。 为什么Alexa不确认单词是否在插槽集中? slot conf

以及何时

  

我说:“打开狗皮”。

我希望alexa不理解这个问题,但是它给了我关于吠叫的事实为什么?这是怎么发生的?
Alexa是否具有默认的一组技能?例如搜索google / amazon等...

我很困惑。请帮助我了解发生了什么事?

2 个答案:

答案 0 :(得分:1)

如果没有完整的代码来确切地了解正在发生的事情并提供代码答案,我希望仅对您的问题/问题的解释将为您指明正确的方向。


1。发射技能

  

我说:“ Alexa开放狗应用程序”
  它应该已经准备好倾听意图了……

您期望Alexa会听,但实际上,Alexa会打开您的技能,并希望您在这一点上得到一个普遍的欢迎。 Alexa将向您的Lambda发送 Launch Request 。这与IntentRequest不同,因此您可以通过检查request.type来确定。通常发现:

this.event.request.type === 'LaunchRequest'

我建议您向Lambda添加一些日志记录,并使用 CloudWatch 查看来自Alexa的传入请求:

console.log("ALEXA REQUEST= " + event)

2。广告位值识别

  

我说:“打开狗应用程序,然后告诉我XXXX的价格。”
  为什么Alexa不确认单词是否在插槽集中?

Alexa不会将slot限制为slotType中设置的插槽值。您提供的slotType值用作指导,但其他值也可以接受。

在Lambda函数中,由您决定是否验证这些插槽值,以确保将其设置为您接受的值。有很多方法可以做到这一点,因此只需从检测插槽中已装满即可开始。通常发现:

this.event.request.intent.slots.{slotName}.value;

如果您选择在slotType中设置同义词,那么Alexa还将提供她建议的广告位值分辨率。例如,您可以将“ Rotty”作为“ Rottweiler”的同义词,Alexa会将“ Rotty”填充到广告位中,但也建议您将其解析为“ Rottweiler”。

var resolutionsArray = this.event.request.intent.slots.{slotName}.resolutions.resolutionsPerAuthority;

再次使用console.log和CloudWatch查看Alexa接受并填充的插槽值。


3。故意未能发射技能

  

我说:“打开狗皮”。
  我以为alexa不会理解这个问题,但这给了我一个关于吠叫的事实。

您必须在技能之外进行此操作,Alexa将在其中进行任何输入并尝试识别已启用的技能,或者以她对默认功能的最佳猜测进行处理。

Alexa确实具有默认的内置功能(不是真正的技能)来回答一般性问题,并且变得有趣而友善。您可以在这里查看她自己可以做的事情: Alexa - Things To Try

所以我的猜测是,Alexa认为您正在询问有关狗吠的问题,因此提供了答案。您可以尝试问她“什么是狗叫”,看看她的回答是否与“打开狗叫”完全相同,只是为了证实这些怀疑。


要真正了解开发Alexa技能,您应该花时间使非常熟悉此文档: Alexa Request and Response JSON Formats

答案 1 :(得分:0)

您没有发布很多代码,因此很难准确说明您的意思,但是通常在处理不完整事件时,您可能会遇到这样的不完整偶数处理程序:

<ExpandGroup singleOpen={true}>
    <ExpandPanel id={'bloc-01'}/>
    <ExpandPanel id={'bloc-02'}/>
    <ExpandPanel id={'bloc-03'}/>
    <ExpandPanel id={'bloc-04'}/>
    <ExpandPanel id={'bloc-05'}/>
</ExpandGroup>

通常在lambda的index.js文件中,将此处理程序添加到实际处理程序的上方 这可能无法解决您的所有问题,但是当用户没有提及狗时,它将帮助您处理事件。