【问题标题】:Errors with multi turn dialog in alexa skillsAlexa技能中的多轮对话错误
【发布时间】:2019-05-06 12:45:28
【问题描述】:

我创建了一个名为 "BuyDog" 的技能,它的调用名称是 "dog app"

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

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

"what is {dog} price."

"Tell me the price of {dog}."

插槽{dog} 的插槽类型为“DogType”。我已根据需要标记此插槽

然后我将端点添加到 AWS lambda 函数中,我在 node.js 中使用了 factkills 项目的蓝图代码,并进行了一些小改动以查看其工作情况。

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.......................
};

根据我所期待的关于代码

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

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

当

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

它询问“哪个品种”(这是我定义的问题)但它工作正常并显示定价

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

任何 XXXX(即狗或非狗类型)的

(或数据数组中的其他值)。 为什么 alexa 不确认单词是否在 slot set 中?

当

我说:“打开狗吠声”。

我预计 alexa 不会理解这个问题,但它给了我一个关于吠叫的事实。 为什么?这是怎么发生的?
alexa 有一套默认的技能吗?比如搜索谷歌/亚马逊等...

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

【问题讨论】:

  • 你能发布你的完整代码吗?我想你一定用过默认的 Fact Skill 模板
  • 是的,我确实在 lambda 函数中使用了事实技能模板并进行了上述更改
  • @MaruthiAdithya 你做了多轮对话alexa技能吗?

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


【解决方案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 不确认这个词是否在 slot set 中?

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

【讨论】:

  • 这很有见地。我将在几个小时后在此处发布 .js 代码(我现在没有 AWS 帐户的密码)但这是一个精心起草的答案 [+1]
  • 很高兴它有帮助,但老实说,这个问题非常大。当我分解它时,你真的有 3 个不同的问题,可能是 3 个不同的问题。所以如果我是你,我不会继续编辑这个大问题。相反,返回个别问题,包括所有相关代码,并针对您遇到的每个问题提出新问题。您应该以这种方式收到更好的答案。祝你好运。
【解决方案2】:

您没有发布很多代码,因此很难准确说出您的意思,但通常要处理不完整的事件,您可以有一个不完整的偶数处理程序,如下所示:

const IncompleteDogsIntentHandler = {
// Occurs when the required slots are not filled
canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
        && handlerInput.requestEnvelope.request.intent.name === 'DogIntent'
        && handlerInput.requestEnvelope.request.dialogState !== 'COMPLETED'
},
async handle(handlerInput) {
    return handlerInput.responseBuilder
        .addDelegateDirective(handlerInput.requestEnvelope.request.intent)
        .getResponse();
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2016-10-19
    相关资源
    最近更新 更多