叮咚叮咚,京东叮咚音箱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的应用中心搜索到自己的技能,快来试试吧!

猜你喜欢

转载自blog.csdn.net/Allan_Bst/article/details/81241033
今日推荐