0

我在Alexa中创建了一项技能,可以执行以下操作。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空指针异常。我输入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中做到这一点。

谢谢

回答

0

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

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

由于您将有单独的意图,并且用户可以想象地将它们按顺序说出来,您可能需要检查是否输入了所有需要的字符串,否则会提示用户输入任何缺少的字符串。

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