## 前言
- 在第一天的教程《天猫精灵语音开发-第一天》 里我们已经尝试开发出了一个hello world
- 在第二天的课程《天猫精灵语音开发-第二天》里我们已经尝试开发出一个查询天气的语音技能。
- 在今天我们尝试开发一个多意图关于的天气质量查询语音技能
流程
前台配置流程
- 创建空气质量意图 - 配置单轮对话语料并配置前置意图
后台开发流程
- 解析请求意图并返回预期值 - 提交代码并部署上线
- 语音测试
- 项目下线
前台配置流程
创建空气质量意图
配置单轮对话语料并配置前置意图
前置意图配置参数传递规则:前置意图标识.前置意图中的参数名称,以天气查询意图是空气质量查询意图的前置意图,则配置参数为 {weather.city}
后台开发流程
登录阿里云云开发平台(网址:workbench.aliyun.com)基于昨天的代码开发新的功能,使用详情请看第一天教程
解析请求意图并返回预期值
原始代码
package com.alibaba.ailabs;
import com.alibaba.ailabs.common.AbstractEntry;
import com.alibaba.da.coin.ide.spi.meta.AskedInfoMsg;
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.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.fc.runtime.Context;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description 天猫精灵技能函数入口,FC
* handler:com.alibaba.ailabs.GenieEntry::handleRequest
* @Version 1.0
**/
public class GenieEntry extends AbstractEntry {
@Override
public ResultModel<TaskResult> execute(TaskQuery taskQuery, Context context) {
context.getLogger().info("taskQuery: " + JSON.toJSONString(taskQuery));
TaskResult taskResult = new TaskResult();
// 从请求中获取意图参数以及参数值
Map<String, String> paramMap = taskQuery.getSlotEntities().stream().collect(Collectors.toMap(slotItem -> slotItem.getIntentParameterName(), slotItem -> slotItem.getStandardValue()));
String intentName = taskQuery.getIntentName();
String city = paramMap.get("city");
String date = jsonParse(paramMap.get("sys.date(公共实体)"));
if("gclm-hi".equals(intentName)){
taskResult.setReply("主人我在,我可以帮你查询天气");
} else if("wether".equals(intentName)){
//意图中 date 参数勾选了必选,请求数据中一定会携带 date 参数,因此只需要判断 city 参数有没有
if(StringUtils.isBlank(city)) {
taskResult.setReply("主人,你要查询那个城市的天气啊!!!");
}
// 这是使用假数据
taskResult.setReply("主人,"+city + date + "天气 晴");
} else if("air-quality".equals(intentName)){
//意图中 date 参数勾选了必选,请求数据中一定会携带 date 参数,因此只需要判断 city 参数有没有
if(StringUtils.isBlank(city)) {
taskResult.setReply("主人,你要查询那个城市的空气质量啊!!!");
}
// 这是使用假数据
taskResult.setReply("主人,"+city + date + "空气质量 优");
} else {
taskResult.setReply("主人,我无法识别你的意图,等我重新学习后再来更好的服务主人");
}
return reply(taskResult);
}
/**
* 结束对话的回复,回复后音箱闭麦
*/
private ResultModel<TaskResult> reply(TaskResult taskResult) {
ResultModel<TaskResult> res = new ResultModel<>();
taskResult.setExecuteCode(ExecuteCode.SUCCESS);
taskResult.setResultType(ResultType.RESULT);
res.setReturnCode("0");
res.setReturnValue(taskResult);
return res;
}
private String jsonParse(String data) {
try{
JSONObject object = JSONObject.parseObject(data);
return object.getString("description");
}catch(Exception e) {
return data;
}
}
}
提交代码并部署上线
- 使用Git提交代码
- 选择预发环境部署上线,详情请看第一天教程
语音测试
进入在线测试进行测试
项目下线
在线测试完成后,要在云开发平台中我的应用及时将部署的应用下线,因为免费额度有限,不及时下线将会产生不必要的费用
昨天就忘记下线了。多跑了一定的流量