本期投稿【UNIT+语音】智能语音对话服务攻略
百度AI开发者大会升级UNIT3.0后,修订了最新版本的对话UNIT技能
本期投稿最强的语音+UNIT的对话式使用攻略,希望大家多多支持~
一、关于智能问答的解析
1、什么是智能问答?
智能音箱产品的核心是会话系统,例如:小度小度、小爱同学、天猫精灵等,然后跟人进行会话。
智能问答机器人又称会话代理或智能代理(Intelligent Agent),是模仿人类对话的计算机程序,检索用户输入,基于关键技术进行内置算法计算,再匹配数据库并返回运算结果。
2、智能问答实现的流程
智能问答机器人产品的关键技术包括自然语言处理、解析技术、语音识别、语义识别、SQL和相关数据库、机器学习与深度学习等。
一般而言,智能问答产品的框架包含如下7个主要功能模块,如下图所示:
上图可见智能音箱/智能问答类产品的主要功能和处理流程:
1、用户输入模块支持文本或语音模式(例如:您对某某音箱喊话说播放某某歌曲)。
2、识别技术模块接收用户输入,采用语音及语义识别技术将其转换为表达式。
3、自然语言处理模块理解表达式,将其转化并输入至对话管理模块。
4、对话管理模块采取特定的算法进行回复。
5、处理模块进行自然语言生成。
6、生成的回复文本经语音合成。
7、完成文字至语音的输出。
3、智能问答/音箱产品在行业的状态
不同模块结合不同技术,多种算法的应用使智能问答产品具备强大交互性。生动有趣的用户界面为人机交互增添了趣味性。此外,智能问答机器人还能够在历史交互中学习,随着时间推移改进响应的精准性。
同时,能让用户通过对话式服务高效准确地执行任务。正是智能问答产品具备社会性、交互性、趣味性、智能性及有效性,目前该类产品广泛用于电子商务(例如:阿里旺旺、百度小度等)、医疗服务(情感关怀机器人)、休闲娱乐(度假酒店的智能语音窗帘、各种音乐类智能音箱)等领域,且产品功能愈渐创新,但智能问答类产品在学习领域的研究刚刚处于起步阶段。
4、小结
所以在智能音箱/问答类产品中,智能问答的原理就是:模拟人类对话的计算机程序,做哪个领域的产品需要预先构建那个领域的知识库,机器接收问题后经过计算,返回最贴切的匹配。同时结合AI的神经网络算法、机器学习、深度学习、自然语言理解逐步提升之前没有预设的知识库也能与人进行交互。
听起来是不是很复杂,想要实现这样的一个产品是不是很难?
是的,非常的难,但是,但是,但是....(重点说三遍)
我接下来教你分分钟就能实现一个智能问答机器人。
二、带你走进UNIT之旅
1、搭载UNIT最新的对话机器人
【第一步】
进入UNIT官方首页:https://ai.baidu.com/unit/home
这个版本的首页太酷了~ 哈哈哈
这里还有视频教程,技术文档等等,还能培训认证呢,超多干货等你来撩噢~
我觉得UNIT搭载了非常棒的需求理解、对话控制及底层的自然语言处理、知识挖掘等核心技术,让我们的产品能快速拥有对话交互能力
【第二步】
新建一个机器人,命名为“百事通小明”,然后需要给这个机器人添加一些技能
那什么是技能呢?这边给大家扩展一下:
1、某一个对话场景的对话能力,分为我们自定义技能和UNIT平台预置技能。
2、自定义技能又分为「对话技能」和「问答技能」,完全由我们来配置的技能。
3、预置技能为UNIT平台预置的通用能力,部分预置技能目前支持添加词槽词典值来干预对话理解效果。
我们的自定义技能后续再给大家详细的分享,现在要给大家分享下UNIT非常牛批的一个东西——预置技能
2、给自己的机器人添加预置技能
【第一步】
进入我的技能,选择预置技能—获取技能(不是自定义技能哈~千万别搞错了)
这里的预置技能非常的多也非常的棒,what?你还不知道什么是预置技能?
那么解释下,这些技能就像游戏里面的装备,只要获取了该装备,你就增加了很多属性,
同样,你获取这些预置的技能,你也就相当于给自己的机器人多添加了一项能力了,比如我添加的“智能问答”
然后就可以直接点击对话测试效果了,没错,都不需要训练了,哈哈....
并且你还可以根据自己的需求,增加更多的技能,让自己的机器人更加强大。
既添既用,是不是很快,几分钟就完成了知识百科的智能机器人了。哈哈哈~
【预置技能的优势】
预置技能为UNIT平台预置的通用能力,随着AI技术和理念的兴起,很多产品都希望采用对话式的人机交互方式。然而对话系统(对话技能、对话机器人)的研发对于大多数开发者而言却是一个很困难的工作,对技术和数据的要求都很高。
在过去的时间里,我们通常在想训练一个智能对话机器人,首先第一个要考虑的就是自然语言的处理,其次就是考虑如何能够训练大量的对话样本,同时还要建立自己的知识图谱等一系列的东西,非常的繁琐和复杂。
我曾经在17年的时候就自己通过分词技术等手段做过,相当的苦难和效果不佳,后来UNIT1.0横空出世,搭载了业内领先的需求理解、对话控制及底层的自然语言处理、知识挖掘等核心技术,让我们基于少量开发即可获得理想的对话模型,但是当时想要配置一个简单的智能问答系统还是比较繁琐困难。
而现在UNIT已经支持预置技能的搭配了,这些预置的技能涵盖生活娱乐、设备控制等领域的可干预对话能力及50+场景的词典,能够非常快速的让我们建立一个对话的机器人,就比如我今天介绍的智能问答机器人,只需一个智能问答技能,就搞定了,非常的牛~
而且以这种技能包的方式,极大的简化了我们重建的复杂难度,技能包随意搭配使用,耦合度大大的降低了,棒~
我相信后续将会有更多的好玩,更秀的一些技能,为我们开发者造一波福利~
预置还有个很重要的优势,那就是“专业”。
就举一个预置技能例子“智能问答”,如果让大家来做这个东西,你肯定很难做到,为什么呢?因为这是百度搜索看家本领之一呀!
这是一个基于知识图谱的智能问答技能,能够解析通用型知识问题,满足用户多样性的知识问答和释义需求。
智能问答技能主要包含影视、人物、音乐、教育、日期历法、生活信息等40+领域上百种问答类型
三、代码实现智能问答机器人
UNIT的机器人实现后,接下来,我就用给大家用系统程序来一波~
1、实现UNIT机器人调用
实现UNIT的调用是非常简单的,大家可以直接复制这段代码,放上自己的token,就可以测试对话了。
public static String utterance(String text) {
// 请求URL
String talkUrl = "https://aip.baidubce.com/rpc/2.0/unit/bot/chat";
String say = "我还没听明白~";
try {
// 请求参数
String params = "{\"bot_session\":\"\","
+ "\"log_id\":\"7758521\","
+ "\"request\":{\"bernard_level\":1,"
+ "\"client_session\":\"{\\\"client_results\\\":\\\"\\\", "
+ "\\\"candidate_options\\\":[]}\","
+ "\"query\":\""+ text+ "\","
+ "\"query_info\":{\"asr_candidates\":[],"
+ "\"source\":\"KEYBOARD\",\"type\":\"TEXT\"},"
+ "\"updates\":\"\",\"user_id\":\"88888\"},"
+ "\"bot_id\":\"56554\","
+ "\"version\":\"2.0\"}";
String accessToken = "24.df831e26911ddfed0313ad1709961e80.2592000.1561273226.282335-16027515";
String result1 = HttpUtil.post(talkUrl, accessToken, "application/json", params);
JSON jsonData = JSON.parseObject(result1);
// json转java对象
UtteranceBean utteranceBean = JSONObject.toJavaObject(jsonData, UtteranceBean.class);
if(utteranceBean.getError_code() == 0){
Result result = utteranceBean.getResult();
if(result.getResponse().getStatus() == 0){
// return result.getResponse();
List list= result.getResponse().getAction_list();
for (Action_list action_list : list) {
say = action_list.getSay();
}
System.out.println("机器人回答:"+say);
return say;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return say;
}
重点还是在于方法的理解,这里我把返回的json数据转化为java实体更简单获取到机器人返回的bot
2、实现一个前端的对话页面
亲自上手搞了一个web版的前端对话页面,是不是很给力,最终实现的还是能和智能音箱,智能电话客服这些相同的效果
只是搭载的不一样,但是实现的原理还是一样的(所以你也看透了智能音箱/机器人的本质原理了....恭喜恭喜)
咳咳,直接上图
大家可以看到这个前端的实现也非常的简单,我把核心的消息发送和对话文本加载放在下面。
//添加发送的文本信息 function sendMessage(msg){ var htmlData = '
' + ' ' + ' ' + ' ' + msg + '' + ' ' + '
' + '' ; $("#message_box").append(htmlData); $('#message_box').scrollTop($("#message_box")[0].scrollHeight + 20); $("#message").val(''); var contentHeight = $(".dialog_wrap").height(); $(".dialogBox").scrollTop(contentHeight); //请求后端UNIT文本对话 $.ajax({ type:"POST", url:"${pageContext.request.contextPath}/unit/getBot.do", data:{ "msg":msg }, success:function(data){ var mes = eval(data); if (mes.success) { var say = data.say; var base64Data = data.base64Data; var audio2 = document.getElementById('aud');//用于播放合成语音 audio2.src = window.URL.createObjectURL(getBlob(base64Data));//生成blob 路径 audio2.autoplay = true;//播放 //机器人回复样式加载 var htmlData = '' + ' ' + ' ' + '
' + ' ' + ' ' + say + '' + '' + '' ; $("#message_box").append(htmlData); $('#message_box').scrollTop($("#message_box")[0].scrollHeight + 20); $("#message").val(''); var contentHeight = $(".dialog_wrap").height(); $(".dialogBox").scrollTop(contentHeight); } else { alert("返回数据失败"); } }, error: function(){ //请求出错处理 alert("出情况了"); } }); }
3、实现智能语音对话
根据上面的第一步和第二步,已经是实现了简单的对话效果,有没有感觉像网页的客服问答机器人(哈哈哈....)
那么我们再进阶一下,实现语音对话式问答机器人。
第一步,实现前端录音的功能,在之前的帖子上有专门讲解这一块的内容,如有需要可以再看看,我把核心实现分享给大家。
//保存录音
function uploadRecord(){
//上传录音地址
recorder.upload("${pageContext.request.contextPath}/unit/saveVocie.do", function (state, e) {
switch (state) {
case 'uploading':
break;
case 'ok':
var map = JSON.parse(e.target.response);
if (map["success"]) {
var Rtext = map["Rtext"];
sendMessage(Rtext);//调用意图识别
} else {
alert("保存失败");
}
break;
case 'error':
alert("上传失败");
break;
case 'cancel':
alert("上传被取消");
break;
}
});
}
//根据base64音频数据 转化为 blob对象
function getBlob(base64Data){
var dataURI = "data:audio/wav;base64,"+base64Data; //base64 字符串
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // mime类型
var byteString = atob(dataURI.split(',')[1]); //base64 解码
var arrayBuffer = new ArrayBuffer(byteString.length); //创建缓冲数组
var intArray = new Uint8Array(arrayBuffer); //创建视图
for (i = 0; i < byteString.length; i += 1) {
intArray[i] = byteString.charCodeAt(i);
}
return new Blob([intArray], { type: "audio/wav" }); //转成blob
}
其中还有一个录音的JS也是非常核心的,经过我自己的改良版本,就暂时不放在帖子上,有需要可以联系我。
然后再来一个语音对话样式,就非常完美了
四、总结
作为产品+开发者的我做一次本次案例的总结:
智能音箱、智能问答机器人、电商平台/视频平台的智能客服、AI电话机器人我们都不陌生,在众多智能音箱、儿童教育等问答类产品中,尽管在
娱乐、智能家居、促进学习等方面已经显现便捷作用,但个人认为产品还有具有巨大潜能,比如说就教育问答音箱或者机器人类产品来说学习是一个
复杂的过程,需充分考虑各种用户例如教师、学习者、学习资源等要素的整合。
产品的重点突破还是在运算力、数据量和算法模型三要素的制约下,有人说时下处在Pre-AI阶段也不无道理;但毋庸置疑的是:智能问答智能音箱类产
品在智能家居、智适应教育领域的应用将愈渐广泛和深入,更加注重以用户为中心的产品理念,促进产品的自我提升和持续学习。
百度AI开发者大会升级UNIT3.0后,修订了最新版本的对话UNIT技能
本期投稿最强的语音+UNIT的对话式使用攻略,希望大家多多支持~
我相信你肯定是想体验一波了,快来试试语音对话机器人吧
欢迎体验:https://47.98.216.73:8083/web/unit/index.do
源码地址:https://gitee.com/liyingming/unitService
很棒
让小度帮助做小学数学题吧,5+7等于几?
不知道研究的怎么样啦
天天都整一些啥呀 哈哈
说的不错
小度同学识别能力还是很牛的,我家俩娃整天问它
把多种要素结合起来的想法很好,可以是个性化的,由班主任和本班学生建立这种无线沟通,让答疑、讲解变得更便捷和个性化。
那是相当厉害
很开心 今天找到你的博文。拿你代码研究一下 前后端 语音···传输
很多都是代码,不太懂,不过这个大佬能力很厉害的
专业的
写得这么好怎么每人来看呢
你们都是大佬级水平
总结的很到位,赞
建议做成移动应用,用户会更多
楼主真的牛。
你先来说道一下哈
说说UNIT的应用吧
荒漠很努力啊
想了解哪些方面的技术应用呢 可以互相探讨一下