欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

叮咚叮咚,京东叮咚音箱Skill开发之路

程序员文章站 2022-06-06 15:23:06
...

一、学习背景

    最近参加了京东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控制台

叮咚叮咚,京东叮咚音箱Skill开发之路

 

(2)接下来我们点击【创建技能】创建一个技能

叮咚叮咚,京东叮咚音箱Skill开发之路

(3)打开技能创建页面,填写相关的技能信息

下面【技能唤醒名】即你对音箱说什么把他唤醒,【技能名称】展示用,随意填写

叮咚叮咚,京东叮咚音箱Skill开发之路

(3)创建交互模型

1、确定槽位信息类型

    交互模型分为意图和术话两部分组成,这里我们先来分析一下,既然要实现说动物展示详情,那么肯定要让音箱知道你所说的动物的名称,这就用到了上面提到的【槽位】,既然要匹配动物名,那么动物名就是一个槽位类型,接下来我就添加一个名称为Name的槽位类型,在Name里面添加了一只名为 小狗 的动物

叮咚叮咚,京东叮咚音箱Skill开发之路

2、创建技能意图

槽值类型确定后,我们就开始创建意图,意图即表示你想干嘛,依照下图,创建了一个名为 ShowAnimalInfo的意图,用于展示动物的信息,然后我们开始配置槽位,点击【槽位类型】下拉框,选择我们刚刚创建的Name类型的动物名,然后既然是动物名,我就命名这个槽值的名为animal,槽值配置完成后,我们开始配置【术话】,术话上面我们说过,就是你跟音箱所说的关键字中包含术话中配置的槽值,即音箱进行相应,也就是说下面我写了一个{animal}即代表:我和音箱沟通时,只要我的话中包含槽位Name中的任意动物名音箱即进行响应

叮咚叮咚,京东叮咚音箱Skill开发之路

(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工作人员即可

这是数据库小狗的信息

叮咚叮咚,京东叮咚音箱Skill开发之路

然后测试结果如下:

叮咚叮咚,京东叮咚音箱Skill开发之路

测试成功!快来试试吧

(6)技能的审核提交

测试完成后填写相关信息发布提交,通过审核后即可在叮咚App的应用中心搜索到自己的技能,快来试试吧!