天猫精灵接入教程

发布时间:2022-08-25 21:28:58 作者:yexindonglai@163.com 阅读(1960)

说明

有几个关键词需要先属性下

1、意图

意图是用户使用语音技能的目的,语音技能至少要有一个意图(至少向用户提供一个功能,也可以是多个)只说调用词会进入默认意图所以有调用词的技能需要有默认意图。

2、实体

是自然语言处理领域中的重要概念,是一个规范的自然语言短语集合,通常定义为应用所在领域的关键词、术语。如常见的时间、地点、POI、人名、数量等,都可以作为实体来处理。

3、问答

意图和实体的关系

意图是用户的目的,例如查天气;

词槽是关键信息,也是筛选条件,例如查天气中的日期和城市

实体是词槽词典,比如城市词槽,对应的实体有北京、上海等

下表中举例了不同行为的意图和实体

举例 意图 实体
用户想要开灯 开灯 开房间灯/开客厅灯/开厨房灯
查天气预报 查天气 查北京天气/查上海天气/查深圳天气
去北京 去北京 坐高铁去北京/坐车去北京/坐飞机去北京
五彩灯光 开启彩色灯 红色/绿色/蓝色/五颜六色

开始

1、进入官网 https://iap.aligenie.com/ 并注册账号

2、选择技能应用平台

依次选择 应用内容接入 -> 技能应用平台 -> 控制台

3、创建新技能

4、填写基本信息

注意下面的调用词,比如我填写的是:新东, 以后就可以这样跟天猫精灵说:”新东 打开电视”;

5、创建成功
然后会进入下面的页面,然后点击语音交互模型

6、创建意图
可以创建意图,也可以使用公共意图

这边使用创建意图,自定义的才爽嘛
7、创建默认意图
每个技能都需要有一个默认的意图,这是给调用词条使用的, 我这边使用的调用词条为:“新东”,所以我只要说:“新东”2个字,就会默认使用这个意图,然后添加’提交’即可

创建后如下图

8、创建实体
同样的,也有自定义实体和公共实体可以选择

我们选择创建自定义实体

创建一个名为开启房间灯的实体,填写完信息点击保存即可

实体创建好了

9、创建意图-repeat
等等,刚刚不是已经创建了一个意图嘛?怎么又要创建?

刚刚创建的只是默认意图,现在要创建的就是我们真正要控制设备的意图了;
依次点击 -> 创建意图
意图名称:开灯
意图标识:open_light

10、添加单论对话表达
滚动条往下拉,有个单轮对话表达,这是什么意思呢?
你肯定跟人聊过天吧,聊天一般都是一来一回的,也就是你一句我一句地聊,咱俩轮着讲话,我问一句你回一句的这种模式;

接下来,添加2个例句:

  • 帮我开房间灯好嘛
  • 打开房间灯

11、添加参数
在往下拉可以看到有个参数,这个参数就是用来绑定实体的

添加参数有2种方式,下面依次介绍
12、添加参数的第一种方式
点击添加按钮

然后会显示下面的页面,输入参数名称,在关联实体就可以了,别忘了将全面的勾搭上

13、添加参数的第二种方式
在单论对话表达中,选中“开房间”3个字


松开后会弹出一个窗口,窗口里面显示的是我们刚刚添加的实体

点击这个实体,参数就生成好了

完成后点击右下角的提交按钮即可

14、编辑后端服务
依次选择后端服务 -> 编辑部署

进入编辑页面后输入 服务器部署地址,在下载认证文件

15、搭建服务器
这边使用springboot搭建java服务器
controller内容如下,认证文件直接写死在controller层;在增加一个回调接口;

  1. package com.xd.web.controller;/**
  2. * @author yexd
  3. */
  4. import com.alibaba.da.coin.ide.spi.meta.ExecuteCode;
  5. import com.alibaba.da.coin.ide.spi.meta.ResultType;
  6. import com.alibaba.da.coin.ide.spi.standard.ResultModel;
  7. import com.alibaba.da.coin.ide.spi.standard.TaskQuery;
  8. import com.alibaba.da.coin.ide.spi.standard.TaskResult;
  9. import com.alibaba.da.coin.ide.spi.trans.MetaFormat;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.web.bind.annotation.RequestBody;
  12. import org.springframework.web.bind.annotation.RequestMapping;
  13. import org.springframework.web.bind.annotation.RestController;
  14. import java.util.Map;
  15. import java.util.stream.Collectors;
  16. /**
  17. *
  18. * @title: IndexController
  19. * @Author yexd
  20. * @Date: 2022/8/25 17:20
  21. * @Version 1.0
  22. */
  23. @RestController
  24. @Slf4j
  25. public class IndexController {
  26. /**
  27. * 认证
  28. * @return
  29. */
  30. @RequestMapping("/aligenie/bedd11e146331a22740abb49e0901c1c.txt")
  31. public String auth(){
  32. log.info("进入认证接口");
  33. return "Jfc4Z4Ur15JwUBuvUQD5wg7Nu8+l+HscqYlfofbyJdaj8EEgfzCKsmpCaJjrZiRZ";
  34. }
  35. /**
  36. * 回调地址
  37. * @return
  38. */
  39. @RequestMapping("/rollback")
  40. public ResultModel<TaskResult> rollback(@RequestBody String query){
  41. log.info("收到回调请求,参数:{}",query);
  42. TaskQuery taskQuery = MetaFormat.parseToQuery(query);
  43. log.info("解析参数为 TaskQuery 对象,内容:{}",taskQuery);
  44. // 从请求中获取意图参数以及参数值
  45. Map<String, String> collect = taskQuery.getSlotEntities().stream().collect(
  46. Collectors.toMap(slotItem -> slotItem.getIntentParameterName(), slotItem -> slotItem.getOriginalValue())
  47. );
  48. log.info("获取后的 map对象结构:{}",collect);
  49. TaskResult taskResult = new TaskResult();
  50. taskResult.setReply("收到...");
  51. taskResult.setExecuteCode(ExecuteCode.SUCCESS);
  52. taskResult.setResultType(ResultType.RESULT);
  53. ResultModel<TaskResult> taskResultResultModel = new ResultModel<>();
  54. taskResultResultModel.setReturnCode("0");
  55. taskResultResultModel.setReturnValue(taskResult);
  56. return taskResultResultModel;
  57. }
  58. }

添加阿里云的maven依赖

  1. <dependency>
  2. <groupId>com.alibaba.da.coin</groupId>
  3. <artifactId>semantic-execute-meta</artifactId>
  4. <version>1.1.18-REALEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.slf4j</groupId>
  8. <artifactId>slf4j-api</artifactId>
  9. <version>1.7.25</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.projectlombok</groupId>
  13. <artifactId>lombok</artifactId>
  14. <version>1.18.20</version>
  15. <scope>provided</scope>
  16. </dependency>

另外,还需要在application.yml配置文件中将端口改为: 12345

  1. server:
  2. port: 12345

最后,将项目打成jar包,部署到有公网ip的云服务器上,

在云服务器启动后如下图

接下来我们在 部署页面点击保存按钮

保存后,就可以看到云服务器打印了“进入认证接口”的日志

16、测试
进入测试页面,选择在线测试

首先要输入唤醒词,啊?你不知道唤醒词是什么?真拿你没办法,点击概览页面,基本信息有一项叫做技能调用词,就是所谓的唤醒词

输入唤醒词,然后发送,就可以看到结果旁边显示一个绿色的 ✔,标识已经唤醒了天猫精灵

服务器这边也收到了回调请求

还记得我们刚刚配置的单论对话表达嘛?就是下图这2个

依次输入 打开房间灯帮我开房间灯好嘛,得到的结果如下

控制台也会打印相应的内容

回函接口收到的json信息展示如下

  1. {
  2. "sessionId": "ce1baecc-3c6a-4b89-8e0c-e36d7dd3a4d2",
  3. "utterance": "帮我开房间灯好嘛",
  4. "requestData": {},
  5. "botId": 127776,
  6. "domainId": 70823,
  7. "skillId": 92159,
  8. "skillName": "新东",
  9. "intentId": 150721,
  10. "intentName": "open_light",
  11. "slotEntities": [],
  12. "requestId": "20220825211742849-419659748",
  13. "device": {},
  14. "skillSession": {
  15. "skillSessionId": "23789ff3-9406-47e6-8f79-3301ccd62dd9",
  16. "newSession": false
  17. },
  18. "context": {
  19. "system": {
  20. "apiAccessToken": ""
  21. }
  22. }
  23. }

属性说明

参数名 类型 是否固有 描述
sessionId String 系统级别的会话ID,用户不重启设备则此会话ID不会改变
utterance String 进入意图时用户所说的语句
requestData[1] Map<String,String> 请求附带参数,使用天猫精灵音箱调用技能时额外携带的用户或设备信息。在线测试不涉及该参数。
token String 技能配置账号关联,并且用户登录授权账号后可以得到此 token,详细请查看【OAuth2.0配置文档】。在线测试不涉及该参数。
botId Long 挂载技能或应用的集合ID。
domainId Long 领域ID,领域是技能的语音交互模型和后端服务组合在一起形成的。一个技能至少拥有一个测试领域。技能上线后,还将拥有一个线上领域。因此,技能的测试更新与线上用户使用互不影响。
skillId Long 技能ID,可在技能控制台的浏览器地址中查看
skillName String 技能名称
intentId Long 意图ID,测试领域和线上领域中同一个意图的意图ID不同。如果所有意图绑定同一个后端服务地址,不应该根据意图ID区分是哪个意图。
intentName String 意图标识,测试领域和线上领域中同一个意图的意图标识相同
slotEntities[2] List<SlotEntity> 从用户语句中抽取出的 slot 参数信息
selectIndexList List<Integer> 上一轮对话响应状态标识 resultType: SELECT 时,用户所做选择的索引值
confirmStatus String 上一轮对话响应状态标识 resultType: CONFIRM 时,用户所进行的肯定(CONFIRMED)或否定(DENIED)回答。
device Device 用户的设备信息。在线测试没有设备,不会携带设备数据
requestId String 本次请求的ID
skillSession[3] SkillSession 技能粒度的session信息
conversationRecords List<ConversationRecord> 此session内的对话记录,按照时间倒序存放,最近的放在前面
skillNluInfo[4] SkillNluInfo skill nlu部分的辅助信息

关键字物联网