node.js - alexa 无法识别 intent

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

我正在尝试将自己的响应添加到自定义 intent 。 LaunchRequest 文本有效,但除了 AMAZON.HelpIntent 和其他默认 intent 外,我自己的 intent 无法识别。

intent :

{
    "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": []
        }
    }
}

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

/* 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 === 'GetNewFactIntent');
  },
  handle(handlerInput) {
    const speechOutput = "Welcome to your personal heart health monitor. What would you like to know?";

    return handlerInput.responseBuilder
      .speak(speechOutput)
      .withSimpleCard(speechOutput)
      .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 开始我的个人心跳。” 它确实会说出脚本中的欢迎句。但是,当我问“我现在的心跳有多快”时,它只会回答“抱歉,不确定”,而不是说出硬编码的回答。

最佳答案

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

.withShouldEndSession(false)

如果不添加,默认设置为true,所以技能会在给出第一个响应(欢迎 intent )后立即结束。 请参阅文档: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:“75 bpm”。(技能保持开放状态以提出另一个问题)

关于node.js - alexa 无法识别 intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51576097/

相关文章:

aws-lambda - 使用 AWS Lambda 的 Alexa 技能是否仍仅限于弗吉尼亚北部和爱尔兰?

node.js - 我想使用 Alexa API 读取杂货 list (用于在网络应用程序中显示)。我必须写入 "skill"吗?

node.js - 通过 aws ses 在 node.js 中发送带有附件的邮件

javascript - Nodejs mysql 中的动态下拉列表

javascript - 如何在nodejs中输出 'i'

node.js - 如何将 Dialog.Delegate 指令返回给 Alexa Skill 模型?

node.js - Sequelize 查询以查找落在日期范围和时间范围之间的所有记录

amazon - 如何在亚马逊 Alexa 控制台上删除亚马逊技能?

node.js - 在本地开发 Alexa 技能时 Dynamo 错误 "ConfigError: Missing region in config"

node.js - Alexa Nodejs设备地址api