叮咚叮咚,京东叮咚音箱Skill开发之路
一、学习背景
最近参加了京东alpha人工智能平台与CSDN联合举办的2018 JD Alpha开发者大赛,该比赛意在通过广大开发者设计的skill为alpha智能平台提供更加智能各加便捷的服务,其中参赛作品不计其数,主要可以划分为四大领域教育类、生活类、服务类、休闲类
二、jd Alpha的Skill术语
- 技能(Skill):在手机上的软件称为应用程序(APP),在jd平台的智能音箱上Skill就类似与一个APK
- 意图(Intent):代表使用技能过程中用户可以进行的操作,一个意图就类似与Android中的一个Activity,他是与用户操作的一个模块
- 术话:指定用户可以说的话来命中对应的意图。术话说白了就是一个指定的关键字,当用户与音箱对话时,只有用户的话中包含(Contains)该意图中配置的术话,该意图才会进行相应操作
- 槽位:槽位信息个人理解,就像java中的对象一样,代表一个object
三、开发流程
这里我们创建一个简单的你问我答的小程序,主要实现你说动物名音箱给你播报这个动物相关的信息
(1)首先我们去https://alphadev.jd.com开发者网站申请注册开发者账号,注册登录完成后点击右上角【控制中心】选择Skill控制台
(2)接下来我们点击【创建技能】创建一个技能
(3)打开技能创建页面,填写相关的技能信息
下面【技能唤醒名】即你对音箱说什么把他唤醒,【技能名称】展示用,随意填写
(3)创建交互模型
1、确定槽位信息类型
交互模型分为意图和术话两部分组成,这里我们先来分析一下,既然要实现说动物展示详情,那么肯定要让音箱知道你所说的动物的名称,这就用到了上面提到的【槽位】,既然要匹配动物名,那么动物名就是一个槽位类型,接下来我就添加一个名称为Name的槽位类型,在Name里面添加了一只名为 小狗 的动物
2、创建技能意图
槽值类型确定后,我们就开始创建意图,意图即表示你想干嘛,依照下图,创建了一个名为 ShowAnimalInfo的意图,用于展示动物的信息,然后我们开始配置槽位,点击【槽位类型】下拉框,选择我们刚刚创建的Name类型的动物名,然后既然是动物名,我就命名这个槽值的名为animal,槽值配置完成后,我们开始配置【术话】,术话上面我们说过,就是你跟音箱所说的关键字中包含术话中配置的槽值,即音箱进行相应,也就是说下面我写了一个{animal}即代表:我和音箱沟通时,只要我的话中包含槽位Name中的任意动物名音箱即进行响应
(4)服务端点的开发
1、理解请求响应规则
jd alpha要求开发者必须自己提供服务端点,开发后台接口,而且必须为https链接,接下来我们先学习下京东的请求及响应文档的数据格式要求:https://alphadev.jd.com/Docs/skillCreate#shujuxieyi
这个请自行学习,我就不多讲解有文档的内容了。我们主要做的就是服务端开发
2、服务端接口开发
这里我采用java为后台,这个随意啥php都想,只要遵循数据格式,下面的getAnimalInfo方法即服务端点,将jd返回的json数据进行解析,获取动物名,然后操作数据库查询,将查询结果按照数据规范封装为json返回给jd
public void getAnimalInfo(){
String data = getContent();
String deviceId = "";
String resp = "";
String appNum = "";
String animalName = "";
JDAnimals jdAnimal = null;
ResponseSounds responseSounds = null;
try{
//☆ 首先根据返回的Json进行区分是哪个槽位的数据
if(data.contains("LaunchRequest")){
//应用第一次启动
responseSounds =
new ResponseSounds("PlainText",
"欢迎观看小动物,您可以对我说,小狗的信息,即可了解更多!",
"AudioPlayer.Play",
"1",
"",
"",
"",
0);
}else if(data.contains("animal")){
RequestAnimal animal = gson.fromJson(data, RequestAnimal.class);
//设备id
deviceId = animal.getSession().getDevice().getDeviceId();
//获取请求信息
RequestAnimal.RequestBean request = animal.getRequest();
//获取请求意图
RequestAnimal.RequestBean.IntentBean intent = request.getIntent();
//获取槽位信息
RequestAnimal.RequestBean.IntentBean.SlotsBean slots = intent.getSlots();
animalName = slots.getAnimal().getValue(); //获取动物名
//根据槽位值进行检索,并返回数据
jdAnimal = userDao.getAnimal(animalName);
if(jdAnimal!=null){
responseSounds =
new ResponseSounds("PlainText",
jdAnimal.getDesc(),
"AudioPlayer.Play",
"1",
jdAnimal.getAudio(),
jdAnimal.getAname(),
jdAnimal.getId()+"",
0);
}else{
responseSounds =
new ResponseSounds("PlainText",
"暂时没有这只小动物哦,您可以试试其他动物!",
"AudioPlayer.Play",
"1",
"",
"",
"999",
0);
}
//检查是否绑定
appNum = userDao.getAPPNum(deviceId);
System.out.println("当前账号绑定状态:appNum====="+appNum);
if (appNum==null||appNum.equals("")) {
System.out.println("error:当前设备未绑定APP客户端,请检查!!!!!");
responseSounds =
new ResponseSounds("PlainText",
"当前音箱未绑定客户端,请对我说绑定编号",
"AudioPlayer.Play",
"1",
"错误信息",
"",
"1",
0);
}
if(appNum!=null && appNum!=""){
System.out.println("给客户端发送信息:message====="+jdAnimal!=null?jdAnimal.getName():"");
server.sendMsg(appNum,jdAnimal!=null?jdAnimal.getName():""); //发生消息给APP
}
}else if(data.contains("num")){
RequestNum number = gson.fromJson(data, RequestNum.class);
//设备id
deviceId = number.getSession().getDevice().getDeviceId();
//获取请求信息
RequestNum.RequestBean request = number.getRequest();
//获取请求意图
RequestNum.RequestBean.IntentBean intent = request.getIntent();
//获取槽位信息
RequestNum.RequestBean.IntentBean.SlotsBean slots = intent.getSlots();
String appId = slots.getNum().getValue(); //获取编号
//☆ First 首先通过deviceId绑定移动设备
//数据库操作,更新user记录,更新deviceId字段
userDao.delDevice(deviceId);
JDUser user = new JDUser();
user.setAppNum(appId);
user.setDeviceId(deviceId);
user.setId(Integer.parseInt(appId));
userDao.updateJDUser(user);
System.out.println("OK:当前设备已经绑定成功!!!");
//appNum = userDao.getAPPNum(deviceId);
//server.sendMsg(appNum, "当前设备已经绑定成功!!!");
responseSounds =
new ResponseSounds("PlainText",
"当前设备已经绑定成功!!!",
"AudioPlayer.Play",
"1",
"",
"",
"1",
0);
}
}catch(Exception e){
responseSounds =
new ResponseSounds("PlainText",
"暂时没有这只小动物哦,您可以试试其他动物!",
"AudioPlayer.Play",
"1",
"",
"",
"999",
0);
}
resp = gson.toJson(responseSounds);
System.out.println(resp);
renderJson(resp);
}
(5)技能的测试
万事具备了,接下来我们测试下刚刚配置的意图,这里jd只提供了文字界面的测试,想在音箱测试,联系jd工作人员即可
这是数据库小狗的信息
然后测试结果如下:
测试成功!快来试试吧
(6)技能的审核提交
测试完成后填写相关信息发布提交,通过审核后即可在叮咚App的应用中心搜索到自己的技能,快来试试吧!