1

我正在编写一项 Alexa 技能,该技能可以从一个意图中捕捉年龄,并从不同的意图中捕捉体重。基本上,这两个都是数字类型。

当我尝试输入重量数字时,它被捕获在第一个 Intent 的插槽中。这是我的意图模式。

{
  "intents": [
    {
      "slots": [
        {
          "name": "AGE",
          "type": "AMAZON.NUMBER"
        }
      ],
      "intent": "AgeIntent"
    },
    {
      "slots": [
        {
          "name": "WEIGHT",
          "type": "AMAZON.NUMBER"
        }
      ],
      "intent": "WeightIntent"
    }
  ]
}

我的示例话语是

年龄意图

My age is {AGE}
{AGE}

权重意图

My weight is {WEIGHT}
{WEIGHT}

对话

User : open my test skill
Alexa: what is your age
User: 28
Alexa: what is your weight
User: 68

在这里,当用户输入他的权重 68 时,不是匹配WeightIntent,而是匹配AgeIntent。我的request.intent.name.

我知道它适用于我 68 岁的体重;而且我可以让它与 Alexa-SDK-V1 的 StateHandler 功能一起使用,但我使用的是 Alexa-SDK-V2

所以这里的问题是:技能总是从交互模型发送第一个匹配意图(即AgeIntent)的intentName,我希望为我的第二个问题获得第二个匹配的IntentName(即WeightIntent)。

4

1 回答 1

1

解决方案很简单,要么您只创建 1 个意图并使用对话管理来获取您需要的所有插槽值,要么如果您需要将它们设为单独的意图,则在技能会话中使用状态变量并确保您设置和更新状态在这两个意图。你可以这样做:

const AgeIntentHandler = {
  canHandle(handlerInput) {
    let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
    
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'AgeIntent'
        && sessionAttributes.state !== 'WEIGHT';
  },
  handle(handlerInput) {
  
    let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
    sessionAttributes.state = 'WEIGHT';
    handlerInput.attributesManager.setSessionAttributes(sessionAttributes);
    
    const speechText = 'Age intent is called!';

    return handlerInput.responseBuilder
      .speak(speechText)
      .withSimpleCard('Hello World', speechText)
      .getResponse();
  },
};

const WeightIntentHandler = {
  canHandle(handlerInput) {
    let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
    
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'WeightIntent'
        && sessionAttributes.state === 'WEIGHT';
  },
  handle(handlerInput) {
  
    let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
    sessionAttributes.state = '';
    handlerInput.attributesManager.setSessionAttributes(sessionAttributes);
    
    const speechText = 'Weight intent is called!';

    return handlerInput.responseBuilder
      .speak(speechText)
      .withSimpleCard('Hello World', speechText)
      .getResponse();
  },
};

尽管最好使用 Dialogs 来避免混淆状态,并且您可以在以后轻松添加更多插槽。

于 2018-12-06T13:45:41.460 回答