【征稿计划第二期】智能语音对话服务攻略
荒墨丶迷失 发布于2019-05-30 19:40 浏览:7111 回复:42
4
收藏
最后编辑于2019-07-31

本期投稿【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

 

收藏
点赞
4
个赞
共42条回复 最后由wangwei8638回复于2019-07-31 19:20
#43wangwei8638回复于2019-07-31 19:20:38
#41 荒墨丶迷失回复
天天都整一些啥呀 哈哈

让小度帮助做小学数学题吧,5+7等于几?

0
#42荒墨丶迷失回复于2019-07-31 10:01:20
#36 跨越过时代_24h回复
很开心 今天找到你的博文。拿你代码研究一下 前后端 语音···传输

不知道研究的怎么样啦

0
#41荒墨丶迷失回复于2019-07-31 10:00:23
#39 知道认证团回复
小度同学识别能力还是很牛的,我家俩娃整天问它

天天都整一些啥呀 哈哈

0
#40worddict回复于2019-07-17 14:58:07
#38 小雨青青润无声回复
把多种要素结合起来的想法很好,可以是个性化的,由班主任和本班学生建立这种无线沟通,让答疑、讲解变得更便捷和个性化。
展开

说的不错

0
#39知道认证团回复于2019-07-17 09:05:48

小度同学识别能力还是很牛的,我家俩娃整天问它

0
#38小雨青青润无声回复于2019-07-15 13:51:17

把多种要素结合起来的想法很好,可以是个性化的,由班主任和本班学生建立这种无线沟通,让答疑、讲解变得更便捷和个性化。

0
#37wangwei8638回复于2019-06-28 22:39:10
#35 风搅火回复
很多都是代码,不太懂,不过这个大佬能力很厉害的

那是相当厉害

0
#36跨越过时代_24h回复于2019-06-28 14:03:14

很开心 今天找到你的博文。拿你代码研究一下 前后端 语音···传输

0
#35风搅火回复于2019-06-15 14:32:09
#33 rose20135188回复
写得这么好怎么每人来看呢

很多都是代码,不太懂,不过这个大佬能力很厉害的

0
#34wangwei8638回复于2019-06-14 14:01:54
#28 rose20135188回复
楼主真的牛。

专业的

0
#33rose20135188回复于2019-06-09 22:45:02

写得这么好怎么每人来看呢

0
#32风搅火回复于2019-06-08 16:18:30
#14 才能我浪费99回复
这么说太谦虚了

你们都是大佬级水平

0
#31风搅火回复于2019-06-08 16:16:41

总结的很到位,赞

0
#30wangwei8638回复于2019-06-07 17:39:21

建议做成移动应用,用户会更多

0
#28rose20135188回复于2019-06-05 15:44:18

楼主真的牛。

0
#27荒墨丶迷失回复于2019-06-05 11:42:24
#26 worddict回复
说说UNIT的应用吧

你先来说道一下哈 

0
#26worddict回复于2019-06-05 10:45:04
#24 荒墨丶迷失回复
想了解哪些方面的技术应用呢  可以互相探讨一下

说说UNIT的应用吧

0
#25worddict回复于2019-06-05 10:44:32
#24 荒墨丶迷失回复
想了解哪些方面的技术应用呢  可以互相探讨一下

荒漠很努力啊

0
#24荒墨丶迷失回复于2019-06-05 08:34:29
#21 rose20135188回复
等着楼主不断更新。

想了解哪些方面的技术应用呢  可以互相探讨一下

1
#23荒墨丶迷失回复于2019-06-05 08:33:26
#17 177******01回复
我认识你大佬,我不说话,默默膜拜

大佬 点个赞再走吧 hhh

1
TOP
切换版块