说明
有几个关键词需要先属性下
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层;在增加一个回调接口;
package com.xd.web.controller;/**
* @author yexd
*/
import com.alibaba.da.coin.ide.spi.meta.ExecuteCode;
import com.alibaba.da.coin.ide.spi.meta.ResultType;
import com.alibaba.da.coin.ide.spi.standard.ResultModel;
import com.alibaba.da.coin.ide.spi.standard.TaskQuery;
import com.alibaba.da.coin.ide.spi.standard.TaskResult;
import com.alibaba.da.coin.ide.spi.trans.MetaFormat;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
* @title: IndexController
* @Author yexd
* @Date: 2022/8/25 17:20
* @Version 1.0
*/
@RestController
@Slf4j
public class IndexController {
/**
* 认证
* @return
*/
@RequestMapping("/aligenie/bedd11e146331a22740abb49e0901c1c.txt")
public String auth(){
log.info("进入认证接口");
return "Jfc4Z4Ur15JwUBuvUQD5wg7Nu8+l+HscqYlfofbyJdaj8EEgfzCKsmpCaJjrZiRZ";
}
/**
* 回调地址
* @return
*/
@RequestMapping("/rollback")
public ResultModel<TaskResult> rollback(@RequestBody String query){
log.info("收到回调请求,参数:{}",query);
TaskQuery taskQuery = MetaFormat.parseToQuery(query);
log.info("解析参数为 TaskQuery 对象,内容:{}",taskQuery);
// 从请求中获取意图参数以及参数值
Map<String, String> collect = taskQuery.getSlotEntities().stream().collect(
Collectors.toMap(slotItem -> slotItem.getIntentParameterName(), slotItem -> slotItem.getOriginalValue())
);
log.info("获取后的 map对象结构:{}",collect);
TaskResult taskResult = new TaskResult();
taskResult.setReply("收到...");
taskResult.setExecuteCode(ExecuteCode.SUCCESS);
taskResult.setResultType(ResultType.RESULT);
ResultModel<TaskResult> taskResultResultModel = new ResultModel<>();
taskResultResultModel.setReturnCode("0");
taskResultResultModel.setReturnValue(taskResult);
return taskResultResultModel;
}
}
添加阿里云的maven依赖
<dependency>
<groupId>com.alibaba.da.coin</groupId>
<artifactId>semantic-execute-meta</artifactId>
<version>1.1.18-REALEASE</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
另外,还需要在application.yml配置文件中将端口改为: 12345
server:
port: 12345
最后,将项目打成jar包,部署到有公网ip的云服务器上,
在云服务器启动后如下图
接下来我们在 部署页面点击保存按钮
保存后,就可以看到云服务器打印了“进入认证接口”的日志
16、测试
进入测试页面,选择在线测试
首先要输入唤醒词,啊?你不知道唤醒词是什么?真拿你没办法,点击概览页面,基本信息有一项叫做技能调用词,就是所谓的唤醒词
输入唤醒词,然后发送,就可以看到结果旁边显示一个绿色的 ✔,标识已经唤醒了天猫精灵
服务器这边也收到了回调请求
还记得我们刚刚配置的单论对话表达嘛?就是下图这2个
依次输入 打开房间灯
、帮我开房间灯好嘛
,得到的结果如下
控制台也会打印相应的内容
回函接口收到的json信息展示如下
{
"sessionId": "ce1baecc-3c6a-4b89-8e0c-e36d7dd3a4d2",
"utterance": "帮我开房间灯好嘛",
"requestData": {},
"botId": 127776,
"domainId": 70823,
"skillId": 92159,
"skillName": "新东",
"intentId": 150721,
"intentName": "open_light",
"slotEntities": [],
"requestId": "20220825211742849-419659748",
"device": {},
"skillSession": {
"skillSessionId": "23789ff3-9406-47e6-8f79-3301ccd62dd9",
"newSession": false
},
"context": {
"system": {
"apiAccessToken": ""
}
}
}
属性说明
参数名 | 类型 | 是否固有 | 描述 |
---|---|---|---|
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部分的辅助信息 |