应邀一位网友的想法,想实现调用UNIT接口,实现文字对话功能,特整理一下内容分享给大家。
此功能对于大神来说非常简单,但是对于新手理解代码处理逻辑,并且如何解析UNIT返回参数的处理,还是有一定的帮助的。
嘿嘿~文章最下方有源码下载地址哟~
如果您还不了解UNIT的使用,请移步到UNIT文档,请认真阅读~
http://ai.baidu.com/docs#/UNIT-sample/top
并且能够训练出该场景的机器人,本文例子就是利用这个天气机器来做对接的。
接下来看下对话交互的页面效果,请看下方图片
以上是整体的交互效果,那么现在简单的来说说怎么搭建这个项目的步骤:
1.训练出UNIT场景模型(此处为天气查询场景)
2.导入此例子的源码项目(java开发)
3.修改token配置
4.启动项目即可
按照以上步骤一步一步进行,先看看该项目的包结构
注意:获取token类之后,把token复制到UNIT核心类中,并且还需要记得修改场景ID,以下是核心类的作用:解析UNIT返回的JSON数据,获取我们需要的数据
此处能力有限,只能一步一步利用JSON解析,hhhh~
//获得返回的json数据
String str = HttpUtil.post(talkUrl, accessToken, "application/json", params);
System.out.println(str);
//获得result
JSONObject jsonobject = JSONObject.fromObject(str);
String result = jsonobject.getString("result");
System.out.println(result);
//获得会话session_id
JSONObject jsonobject2 = JSONObject.fromObject(result);
session_id = jsonobject2.getString("session_id");
map.put("session_id", session_id);
//获得动作列表
String action_list =jsonobject2.getString("action_list");
JSONArray json = JSONArray.fromObject(action_list); // 首先把字符串转成 JSONArray 对象
if(json.size()>0){
for(int i=0;i
然后在分享控制层的作用:
1.首先用一个Map接收解析的数据,传到控制层,然后
2.判断是否命中意图,
3.如果命中意图,该意图是否完成还是未完成,
4.既然是命中意图,那么命中的是那个意图,需要做什么样的逻辑处理.
//调用unit分析语音
Map map = UnitService.utterance(session_id, msg);
//判断是否命中意图
if(!"fail_action".equals(map.get("action_id"))){
//判断是否意图结束
if("satisfy".equals(map.get("act_type"))){
session_id="";//意图结束,清空session_id
/**
* 以下是意图处理逻辑,根据命中的意图,判断进入当前意图的对话处理 current_qu_intent字段为意图
*/
switch (map.get("current_qu_intent")) {
case "RAIN": //查询是否下雨
//解析是否刮风的词槽列表
String companyParams = getCompany(map.get("bot_merged_slots"));
if(!companyParams.equals("")){
modelMap.put("companyParams", companyParams);
}else{
modelMap.put("companyParams", map.get("raw_query"));
}
modelMap.put("queryType", "COMPANY");
break;
case "WIND": //查询是否刮风
//解析是否刮风的词槽列表
String companyParams2 = getCompany(map.get("bot_merged_slots"));
if(!companyParams2.equals("")){
modelMap.put("companyParams", companyParams2);
}else{
modelMap.put("companyParams", map.get("raw_query"));
}
modelMap.put("queryType", "COMPANY");
break;
default:
break;
}
}else{
//意图未完成 需要传入session_id 用户下一次对话
session_id = map.get("session_id");
}
//返回机器人说的bot 不管意图有没有命中
modelMap.put("msg", map.get("say"));
}else{
modelMap.put("msg", "我好像不太明白");
}
接下来咋们看前台的一个处理,这是页面上的发送消息的一个函数,作用:
1.获取文本消息,加载到聊天页面样式中
2.ajax调用后台控制层,然后判断是否正常返回数据
3.加载机器回复消息样式
//发送消息
function sendMessage(event, from_name){
//获得发送的消息
var msg = $("#message").val();
// alert(msg);
//自己回复的样式加载
var htmlData = ''
+ ' '
+ ' '
+ ' ' + msg + ''
+ ' ' + from_name + ' · 30秒前'
+ ' '
+ '';
$("#message_box").append(htmlData);
$('#message_box').scrollTop($("#message_box")[0].scrollHeight + 20);
$("#message").val('');
var session_id = $("#session_id").val();
$.ajax({
type:"POST",
url:"${pageContext.request.contextPath}/unit/common.do",
// datatype: "json",
data:{
"session_id":session_id,
"msg":msg
},
success:function(data){
var mes = eval(data);
if (mes.success) {
var msg = data.msg;
var session_id = data.session_id;
$("#session_id").val(session_id);
//机器人回复样式加载
var htmlData = ''
+ ' '
+ ' '
+ ' ' + msg + ''
+ ' ' + '机器人 ' + '· 30秒前'
+ ' '
+ '';
$("#message_box").append(htmlData);
$('#message_box').scrollTop($("#message_box")[0].scrollHeight + 20);
$("#message").val('');
} else {
alert("返回数据失败");
}
},
error: function(){
//请求出错处理
alert("出情况了");
}
});
}
经过前台和后台的一些讲解,不知道大家清楚不,如果有任何问题,可以在下方回复我
感谢支持~
附加源码下载:https://gitee.com/liyingming/unitTest
领导,启动地址是什么?
ajax老是用不好,老是报错,真是够了。
多谢大神
这个时间还有点久了 懵了 哈哈 稍等我想想看~
1.判断是否是刮风词槽列表的目的是什么呢?后面并没有用到“companyParams”呀?
2.获取的词槽列表中为什么中有一个词槽呢?
3.“queryType”代表什么呢?
目前UNIT还在不断升级中 等待下一次的升级吧~
听说是下一步的计划.会有接口来做你说的这些
百度有没有开放API来修改词槽、意图、样本,?
不想通过百度后台去管理,想直接通过API来管理
你好 请问您的具体需求是什么呢 可以通过正则表达 以及对话样本来扩大交互场景的。
想问一下如果对话很多内容一个一个词槽匹配是不是太复杂了?
肯定没两位大佬有钱 哈哈 要么看运气公众号抽一个。哈哈哈
真xx有钱+1
............真XX有钱..
就是撒 不如买个reven H吧 也算是高级 板子2.0
没板子集成android的也行撒.
是哇 不过我的板子就是 2.0 哈哈哈
你看我说什么来着hhh,真的2.0了
恭喜你成功的发现了~
好东西!
貌似今天要发2.0的DuerOS了.