我正在创建一个Alexa的技能,可以做到以下几点。
以下是我的意图
{
"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。
由于
答案 0 :(得分:0)
我建议为用户说的每件事创建一个单独的意图。例如,HelloIntent,NameIntent和AgeIntent。
然后确保将这些信息传递到会话中的所有后续意图。因此,每个intent可以在开头使用一个公共函数来从会话中读取每个字符串(如果存在),将新的插槽数据添加到它,然后在完成之前将所有字符串写回响应会话。
由于您将有单独的意图,并且用户可以想象它们不按顺序说出来,您可能需要检查是否已输入所有需要的字符串,否则提示用户输入任何缺失的字符串。
在会话中保存数据的问题是,下次用户启动技能时数据将会消失。要解决此问题,您可以使用数据库来保存用户数据,并将其保存为userId。有很多关于如何做到这一点的例子。请注意,某些数据库基本上是免费的,但其他数据库会根据每月使用的次数向您收取费用。