如何让插槽输出不同的响应

how to make slots output different responses

进行一些智能家居技能开发时,我的 Intent 语句是“我的电池 {state} 需要多长时间”状态为空或满。我知道我可以用不同的意图来做到这一点,但我不想有两个很多的意图,因为我已经有很多了。我基本上希望用户在 {state} 的位置说出 full 或 empty。然后从那里,根据他们的回答,给出不同的完整或空的答案。网上查的不多,希望大家多多指教。我也是代码新手。

您应该为电池状态创建一个插槽:

{
  "name": "BatteryState",
  "values": [
      {
          "id": "empty",
          "name": {
              "value": "empty"
          }
      },
      {
          "id": "full",
          "name": {
              "value": "full"
          }
      }
  ]
}

您可以在 UI 中自行创建,也可以在 JSON 编辑器中粘贴到 types 集合中。

然后在您的意图中使用创建的插槽

{
  "name": "BatteryStateIntent",
  "slots": [
      {
          "name": "batteryState",
          "type": "BatteryState"
      }
  ],
  "samples": [
      "how long until my battery is {batteryState}"
  ]
}

您可以在 UI 中自行创建或在 JSON 编辑器中粘贴到 intents 集合中。

然后在代码中:

const BatteryStateIntentHandler = {
  canHandle(handlerInput) {
    return (
      Alexa.getRequestType(handlerInput.requestEnvelope) === "IntentRequest" &&
      Alexa.getIntentName(handlerInput.requestEnvelope) === "BatteryStateIntent"
    );
  },
  handle(handlerInput) {
    const batteryStatus =
      handlerInput.requestEnvelope.request.intent.slots.batteryState.value;
    let speakOutput = "";
    if (batteryStatus === "full") {
      const timeToFull = 10; // or some sophisticated calculations ;)
      speakOutput += `Your battery will be full in ${timeToFull} minutes!`;
    } else if (batteryStatus === "empty") {
      const timeToEmpty = 5; // or some sophisticated calculations ;)
      speakOutput += `Your battery will be full in ${timeToEmpty} minutes!`;
    } else {
      speakOutput += "I don't know this status";
    }

    return handlerInput.responseBuilder
      .speak(speakOutput)
      .reprompt(speakOutput)
      .getResponse();
  },
};

确保您使用与构建器中相同的意图名称。最后,将创建的意图处理程序添加到请求处理程序:

exports.handler = Alexa.SkillBuilders.custom()
  .addRequestHandlers(
    BatteryStateIntentHandler,
    // ...
  )
  .lambda();