亚历克斯不承认意图

时间:2018-07-28 23:46:13

标签: node.js alexa alexa-skills-kit alexa-skill alexa-sdk-nodejs

我正在尝试将自己的回复添加到自定义意图中。 LaunchRequest文本有效,但是除了AMAZON.HelpIntent和其他默认意图之外,我自己的意图未被识别。

意图:

AWS.S3()

index.js(来自nodejs教程的自适应示例,位于此处:https://github.com/alexa/skill-sample-nodejs-fact/blob/en-US/lambda/custom/index.js 我添加了CurrentBPM函数并将其添加到底部的addRequestHandlers中。它看起来要匹配的意图名称是上面列表中的currentbpm意图。

{
    "interactionModel": {
        "languageModel": {
            "invocationName": "my personal heartbeat",
            "intents": [
                {
                    "name": "AMAZON.FallbackIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.CancelIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.HelpIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.StopIntent",
                    "samples": []
                },
                {
                    "name": "start",
                    "slots": [],
                    "samples": [
                        "Talk to my personal heartbeat"
                    ]
                },

                {
                    "name": "currentbpm",
                    "slots": [],
                    "samples": [
                        "what's my current BPM",
                        "how fast is my heart beating right now",
                        "How many beats per minute is my heart making at the moment"
                    ]
                }

            ],
            "types": []
        }
    }
}

当我调用该技能时: “ Alexa开始我的心跳。” 它确实会说出脚本中的欢迎词。但是当我问“现在我的心跳多快”时,它只会回答“对不起,不确定”,而不是说出硬编码的回答。

3 个答案:

答案 0 :(得分:4)

解决方案是在LaunchRequest中的响应中添加一行:

.withShouldEndSession(false)

如果不添加,则默认设置为true,因此该技能将在给出第一个响应(欢迎意图)后立即结束。 请参阅文档:https://ask-sdk-for-nodejs.readthedocs.io/en/latest/Response-Building.html

感谢Suneet Patil我相应地更新了脚本(请参见下文) 起初只有这个有效:

  • 用户:“ Alexa,请问我个人的心跳现在我的心跳多快。”
  • Alexa:“ 75 bpm”

但是我达不到目的:

  • 用户:“ Alexa谈到我的个人心跳”
  • Alexa:'欢迎使用您的个人心脏健康监测仪。您想知道什么?'(默认退出技能
  • 用户:“我的心脏现在跳动有多快?”
  • Alexa:“对不起,我不确定。”

使用以下新脚本:

/* eslint-disable  func-names */
/* eslint-disable  no-console */

const Alexa = require('ask-sdk');

const GetNewFactHandler = {
  canHandle(handlerInput) {
    const request = handlerInput.requestEnvelope.request;
    return request.type === 'LaunchRequest'
      || (request.type === 'IntentRequest'
        && request.intent.name === 'start');
  },
  handle(handlerInput) {
    const speechOutput = "Welcome to your personal heart health monitor. What would you like to know?";

    return handlerInput.responseBuilder
      .speak(speechOutput)
      .withSimpleCard(speechOutput)
      .withShouldEndSession(false)
      .getResponse();

  },
};

const CurrentBPMHandler = {
  canHandle(handlerInput) {
    const request = handlerInput.requestEnvelope.request;
    return request.type === 'IntentRequest'
      && request.intent.name === 'currentbpm';
  },
  handle(handlerInput) {
    return handlerInput.responseBuilder
      .speak('seventy five bpm')
      .reprompt('seventy five bpm')
      .getResponse();
  },
};


const HelpHandler = {
  canHandle(handlerInput) {
    const request = handlerInput.requestEnvelope.request;
    return request.type === 'IntentRequest'
      && request.intent.name === 'AMAZON.HelpIntent';
  },
  handle(handlerInput) {
    return handlerInput.responseBuilder
      .speak(HELP_MESSAGE)
      .reprompt(HELP_REPROMPT)
      .getResponse();
  },
};

const ExitHandler = {
  canHandle(handlerInput) {
    const request = handlerInput.requestEnvelope.request;
    return request.type === 'IntentRequest'
      && (request.intent.name === 'AMAZON.CancelIntent'
        || request.intent.name === 'AMAZON.StopIntent');
  },
  handle(handlerInput) {
    return handlerInput.responseBuilder
      .speak(STOP_MESSAGE)
      .getResponse();
  },
};

const SessionEndedRequestHandler = {
  canHandle(handlerInput) {
    const request = handlerInput.requestEnvelope.request;
    return request.type === 'SessionEndedRequest';
  },
  handle(handlerInput) {
    console.log(`Session ended with reason: ${handlerInput.requestEnvelope.request.reason}`);

    return handlerInput.responseBuilder.getResponse();
  },
};

const ErrorHandler = {
  canHandle() {
    return true;
  },
  handle(handlerInput, error) {
    console.log(`Error handled: ${error.message}`);

    return handlerInput.responseBuilder
      .speak('Sorry, an error occurred.')
      .reprompt('Sorry, an error occurred.')
      .getResponse();
  },
};

const HELP_MESSAGE = 'You can say tell me a space fact, or, you can say exit... What can I help you with?';
const HELP_REPROMPT = 'What can I help you with?';
const STOP_MESSAGE = 'Goodbye!';


const skillBuilder = Alexa.SkillBuilders.standard();

exports.handler = skillBuilder
  .addRequestHandlers(
    GetNewFactHandler,
    CurrentBPMHandler,
    HelpHandler,
    ExitHandler,
    SessionEndedRequestHandler
  )
  .addErrorHandlers(ErrorHandler)
  .lambda();

现在可以使用:

  • 用户:“ Alexa与我的心跳对话”
  • Alexa:“欢迎您 个人心脏健康监测仪。你想知道什么?'
  • 用户:“我的心脏现在跳动有多快?
  • Alexa:“晚上七十五点。”(技能保持开放状态,问另一个问题)

答案 1 :(得分:2)

对于任何请求,如果未提供,则shouldEndSession默认为true。在您的情况下,对LaunchRequest的响应将没有此shouldEndSession参数,并且会话关闭。

尽管您始终可以使用 ask-nodejs-sdk的 shouldEndSession(false)使会话保持活动状态,但是不必每次都将其专门设置为false。相反,一种更好的方法是在reprompt中使用LaunchRequest。而且,如果您添加了reprompt(),则SDK会在响应中自动添加"shouldEndSession": false

使用现在的代码,您的LaunchRequest将等待8秒钟,如果没有用户响应,则会话将关闭。但是,对于CurrentBPMHandlerHelpHandler,您已经包含了一个重新提示,它将在reprompt之后再等待8秒钟。当您期望用户做出回应时,最好包括一个提示。

您的交互模型已定义了AMAZON.FallbackIntent意图,但是您尚未在代码中处理它。 AMAZON.FallbackIntent可以帮助您处理意料之外的话语,或者当用户说出的内容与您的技能意图不符时。如果没有处理程序,那么它将被您的错误处理程序捕获。毫无疑问,可以将其作为错误进行处理,但是更好的方法是为此专门添加一个处理程序,并给出类似的响应“抱歉,我不明白,您能改一下您的问题吗?” 或类似的东西。

答案 2 :(得分:1)

请进行以下更改以使其生效。 1.在交互模型中,对于意图启动,只需说出与“开始”相同的发音即可,而不是当前。 例:Alexa,请让我开始心跳。

  1. 在您的lambda代码中,在getnewfact方法的lambda代码中,您忘了将意图的名称从getnewfactintent更改为开始。

  2. 要调用currentbpm意图,请使用“ Alexa,询问我的个人心跳,现在我的心脏跳动有多快。

希望这会有所帮助。