springboot项目接入天猫精灵
最近工作需要使用到天猫精灵的语音功能,大体是通过呼叫对应的“调用词”实现携带参数,然后调用我项目中的接口,以实现对应的业务。所以在此简单的记录下使用过程
实际上:天猫精灵的官方文档记录的也很详细重点参见自定义接入
1、创建语音技能
-
去创建
-
创建一个意图
先简单填入一个单轮对话(配置语料指向),此时我设置了默认意图。所以我对天猫精灵说天猫精灵 热水用完了 (调用词)
或
天猫精灵 热水用完了 吃了没 (调用词+单轮对话)都调用的是这个意图
-
创建实体,对于实体的创建,只有你在如下情况需要用到
天猫精灵 热水用完了 {今天}的天气 (调用词)+ 单轮对话<包含数据>
天猫精灵 热水用完了 放一首{周杰伦}的歌曲
天猫精灵 热水用完了 我要去{19R}楼像如上这些情况,考虑到{}中的数据是要作为参数传递给后端服务来进行操作的。所以需要创建对应实体。实体的作用就是为了在{}插槽的位置将你口述语音识别的内容转化为符合实体中设定的值的内容。
当然你也可以引用公共的实体(长度,任意数等),这里的@floor写的时候不需要加@,这个标识可以作为后面单论对话的插值,如我要去@{floor}楼
-
这里也创建一个带参的意图,创建单论对话的时候要选择“模板”
同时,你也可以使用例句的标注模式,选中即可标注。
-
部署后端服务,可以为意图单独绑定服务,这里测试方便就绑定同一服务。这里的服务部署地址就是你为这个意图写的controller的路径,当然得是公网上的。我们先下载认证文件,将认证文件放到我们的springboot项目下,表示这个技能可与这个web service配对 文档指向3
这里除了放在路径下,也可以直接写一个controller,如下。如果后面认证失败,可以试试@PostMapping("/aligenie/6523cc265ed8证书.txt") public String authentication(){return "**sdgg********************************sdkfh";//证书内容 }
2、一个SpringBoot项目
-
导入官方提供的依赖 文档指向1
<dependency><groupId>com.alibaba.da.coin</groupId><artifactId>semantic-execute-meta</artifactId><version>1.1.18-REALEASE</version> </dependency>
-
便于操作,我就直接再控制层中写代码 , 大家可以直接去 文档指向2 查看官方提供的简单示例和呼叫天猫精灵时产生的请求头和请求正文。参照请求正文的格式,我们可以从传递过来的taskQuery取得正文中的任何数据
@RestController @RequestMapping("/genie") @Slf4j public class GenieController {@PostMapping("/getGenieMsg")public ResultModel<TaskResult> bindingBuilding(@RequestBody String taskQuery) {log.info("天猫精灵测试 : leading:" + taskQuery);TaskQuery query = MetaFormat.parseToQuery(taskQuery);Map<String, String> requestData = query.getRequestData();log.info("requestData:" + requestData.toString());List<SlotEntity> slotEntities = query.getSlotEntities();if (slotEntities.size() > 0) {log.info("slotEntities:" + slotEntities.get(0).getStandardValue());}//返回数据ResultModel<TaskResult> resultModel = new ResultModel<TaskResult>();TaskResult result = new TaskResult();resultModel.setReturnCode("0");result.setReply("测试成功");result.setExecuteCode(ExecuteCode.SUCCESS);result.setResultType(ResultType.RESULT);resultModel.setReturnValue(result);return resultModel;} }
然后将服务跑起来,采用花生壳的内网穿透将服务部署到公网上,这么用来测试很方便。不会可以参见这篇文章
3、后端部署
继续回到天猫精灵的控制台,将公网服务器地址加上Controller路径填上去,点击保存的时候他会判断你的web service有没有认证文件,如果点击报错报错,可以检查一下 检查指向1
关于服务器SSL证书可参见 文档指向4
4、测试
后端返回数据
2021-12-04 21:13:06.796 INFO 5388 --- [nio-8091-exec-2] c.a.s.demo.controller.GenieController :
天猫精灵测试 : leading:{"sessionId":"79c799a7-d4ee-495e-b472-0effa1c23fa3","utterance":"热水用完了","requestData"{}, //非真机,没有数据"botId":114376,"domainId":63502,"skillId":84340,"skillName":"TIAMTEst","intentId":123759,"intentName":"天猫精灵测试","slotEntities":[], //没有传参"requestId":"20211204211305435-225488739","device":{},"skillSession":{"skillSessionId":"ae3fa617-ecf7-4c90-a2ac-8ba05038a24e","newSession":true},"context":{"system":{"apiAccessToken":""}}}
2021-12-04 21:13:06.796 INFO 5388 --- [nio-8091-exec-2] c.a.s.demo.controller.GenieController :
requestData:{}
2021-12-04 21:29:51.463 INFO 5388 --- [nio-8091-exec-7] c.a.s.demo.controller.GenieController :
天猫精灵测试 : leading:{"sessionId":"206b0ee1-c4bf-4834-9caa-571960f2a9fc","utterance":"热水用完了上K2楼","requestData":{},"botId":114376,"domainId":63502,"skillId":84340,"skillName":"TIAMTEst","intentId":123760,"intentName":"传参测试","slotEntities":[{"intentParameterId":95268,"intentParameterName":"floor1","originalValue":"K2","standardValue":"k2","liveTime":0,"createTimeStamp":1638624590055,"slotName":"floor1:floor","slotValue":"k2"}],"requestId":"20211204212949987-504243894",device":{},"skillSession":{"skillSessionId":"1e66de8b-3c89-43c4-8af2-0536edda3f83","newSession":false},"context":{"system":{"apiAccessToken":""}}}
2021-12-04 21:29:51.464 INFO 5388 --- [nio-8091-exec-7] c.a.s.demo.controller.GenieController :
requestData:{}
2021-12-04 21:29:51.464 INFO 5388 --- [nio-8091-exec-7] c.a.s.demo.controller.GenieController :
slotEntities:k2
然后就可以通过传递过来的设备号,参数等信息进行业务逻辑代码的编写