0

我正在 Alexa 中创建一项执行以下操作的技能。

  1. 用户:你好
  2. Alexa,你好,请告诉我你的名字
  3. 用户:约翰
  4. Alexa:嗨,约翰,很高兴认识你。你今年多大
  5. 用户:25

以下是我的意图

{
  "intents": [
    {
      "intent": "StartTheFlow",
      "slots": [
        {
          "name": "custName",
          "type": "list_of_userNames"
        },
        {
          "name": "age",
          "type": "AMAZON.NUMBER"
        }
      ]
    },
    {
      "intent": "AMAZON.HelpIntent"
    },{
      "intent": "Welcome"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"
    }
  ]
}

以下是我的话语

StartTheFlow Hi
StartTheFlow {custName}
StartTheFlow {age}

下面是我的 onIntent()

@Override
    public SpeechletResponse onIntent(final IntentRequest request, final Session session) throws SpeechletException {
        log.info("onIntent requestId={}, sessionId={}", request.getRequestId(), session.getSessionId());

        Intent intent = request.getIntent();
        String intentName = (intent != null) ? intent.getName() : null;

        if ("StartTheFlow".equals(intentName)) {
            return getTheFlow(intent, session);
        } else if ("AMAZON.HelpIntent".equals(intentName)) {
            return getHelpResponse();
        } else if ("WelcomeChubb".equals(intentName)) {
            return getWelcomeResponse();
        } else {
            throw new SpeechletException("Invalid Intent");
        }
    }

我正在尝试如下处理

private SpeechletResponse getTheFlow(Intent intent, Session session) {

        boolean isAskResponse = true;
        String responseText = "";
        String nameFromSession = (String) session.getAttribute("name");
        if (StringUtils.isNullOrEmpty(nameFromSession)) {
            responseText = "please give me your name";
            getTheNameText(intent, session);
        } else {
            System.out.println(session.getAttribute("nameFromSession"));
            responseText = "please give me your date of birth";
        }

        return getSpeechletResponse(responseText, "", isAskResponse);

    }

    private String getTheNameText(Intent intent, Session session) {
        String userNameFrmIntent = getNameFromSlot(intent).toString();
        session.setAttribute("nameFromSession", userNameFrmIntent);
        return getNameFromSlot(intent).toString();

    }

    private String getNameFromSlot(Intent intent) {
        Slot userName = intent.getSlot(Slot_Name);
        return userName.getValue();
    }

另外,我在顶部定义了一个插槽,如下所示。

private static final String Slot_Name = "custName";

但是在这里,当我键入时Hi,它没有问我我的名字,而是在日志中给了我一个错误,它显示了 Java NullPointer Exception。我输入时得到的响应Hi如下。

{
  "session": {
    "sessionId": "SessionId.a2740ca4-73ff-4a15-856d-6461b3c7b2e1",
    "application": {
      "applicationId": "amzn1.ask.skill.e3dfb30e-0089-423c-a325-30ad28dd2e2b"
    },
    "attributes": {},
    "user": {
      "userId": "amzn1.ask.account.AEQYTT5HFHEGGDSUCT3NW45HKR7O3FBL5YCBSZIS7P5LNP5BXFEMUR7AUYOZVKC2FT5V6RKJC7RNA5VMZVREBAXAQP3NFNTQSFSSKSEXIYT4FQYMS5JCI2CCAOPUF4FN4C6DHEU6ONNY3D6GN5AWK75KOQNJH2IWROIIXTPNXSNI6FLQYRBBMP7TRSOWVNCY73WJUT2VLHDACWA"
    },
    "new": true
  },
  "request": {
    "type": "IntentRequest",
    "requestId": "EdwRequestId.cf686fc0-cbfd-4496-bb09-c41714563507",
    "locale": "en-US",
    "timestamp": "2017-02-15T20:12:44Z",
    "intent": {
      "name": "StartTheFlow",
      "slots": {
        "custName": {
          "name": "custName",
          "value": "hi"
        }
      }
    }
  },
  "version": "1.0"
}

有人可以让我知道我哪里出错了,我该如何解决这个问题,我有很多问题需要联系,比如 25,有人可以告诉我是否有更好的方法在 java 中做到这一点.

谢谢

4

1 回答 1

0

我建议为用户所说的每件事创建一个单独的意图。例如,HelloIntent、NameIntent 和 AgeIntent。

然后确保将这些信息转发给会话中的所有后续意图。因此,每个意图可以在开始时使用一个通用函数从会话中读取每个字符串(如果存在),将新的插槽数据添加到其中,然后在完成之前将所有字符串写回响应会话。

由于您将有单独的意图,并且用户可能会乱说它们,因此您可能需要检查是否输入了所有需要的字符串,或者提示用户输入任何缺少的字符串。

在会话中保存数据的问题是,下次用户启动技能时数据将消失。要解决此问题,您可以使用数据库来保存用户数据,并将其保存为 userId。有很多关于如何做到这一点的例子。请注意,某些数据库基本上是免费的,但其他数据库会根据每月使用的次数向您收费。

于 2017-02-17T12:25:15.870 回答