沙龙干货 | 58同城智能语音机器人后端架构解析
Editor's Note
基于语音语义技术实现的智能语音机器人可以代替或者辅助人工来完成一些例程化工作,被广泛应用于58同城各业务场景以提高人效和增加收益。本次沙龙58同城AI Lab后端资深工程师李鸿勋重点剖析了58同城自研的智能语音机器人工程架构设计。
The following article is from 58技术 Author 58技术
主办方:58同城、ITpub
出品人:詹坤林,58同城 AI Lab 负责人,58技术委员会AI分会主席
2020年8月4日,由58技术委员会AI分会和ITpub技术社区联合举办的《58同城智能语音机器人后端架构解析》直播圆满完成,直播吸引了约500+人观看,后续我们会持续推出更多主题的直播沙龙活动,敬请持续关注。
基于语音语义技术实现的智能语音机器人可以代替或者辅助人工来完成一些例程化工作,被广泛应用于企业各场景以提高人效和增加收益。本次议题将重点剖析58同城自研的智能语音机器人工程架构设计,介绍在电话沟通场景下如何基于JAIN-SIP开源库和流式语音识别API实现人机多轮语音交互,并分享海量外呼场景下语音机器人后端系统在并发控制、调度策略和性能优化方面的技术细节。
https://v.qq.com/txp/iframe/player.html?width=500&height=375&auto=0&vid=t3129gh3p15
一、介绍
二、整体架构
三、如何实现人机语音交互
1.协议介绍
机器人借助SIP线路实现人机语音通话的场景,主要涉及以下三种协议:1)SIP(Session Initiation Protocol):多媒体通信协议,用于建立、修改和终止多媒体会话的应用层控制协议,包括网络多媒体会议,网络电话等,机器人通过SIP信令的状态码来控制呼叫流程,状态码100表示三大运营商正在寻呼用户手机/座机,状态码180/183表示用户手机/座机正在响铃,此时可以接收语音包用于后续的通话状态分析,状态码200表示用户已接听,响铃后接收到此状态码通信双方便可以开始语音交互。
2)SDP(Session Description Protocol):媒体协商协议,用于两个会话实体之间的媒体参数协商,SDP协议中a代表会话属性,如图所示rtpmap: 0 PCMU/8000代表此通电话支持PCMU编码,语音的采样率为8K,携带此信息的RTP包包头 payload type为0,c代表连接属性用于约定通信的ip,m代表媒体信息用于约定本次通信的媒体为音频。
3)RTP(Real-time Transport Protocol):实时传输协议,为端到端都是实时传输提供时间信息和流同步,RTP包包头介绍几个比较重要的字段,PT全称payload type,用于标识当前RTP包包体中携带的数据类型,Sequence Number用于标识当前RTP包在整个语音流中的位置,Timestamp用于标识相邻两个RTP包之间的时间差,SSRC用于标识当前RTP包是否来自同一个源。
2.建立连接
机器人与用户语音交互之前需要先建立连接,机器人借助SIP线路实现了电话语音呼入和呼出,借助TEG音视频实现了网络语音呼入,以SIP呼出为例,机器人主动呼叫用户,向SIP线路发送SIP信令并携带SDP协议约定媒体信息,SIP线路接收到SIP信令后转发呼叫请求至三大运营商,SIP线路接收到运营商响应后,向机器人发送SIP信令并约定媒体信息,通信双方拿到需要的媒体信息后便建立连接并发送和接收语音包。
3.语音交互
为实现机器人和用户的多轮语音交互,需要对用户语音转文本用于识别用户意图并返回相应的机器人动作,在接收用户语音包时设置一个固定长度的滑动窗口,如图所示VAD(断句算法)判断窗口的前13帧语音包都为人声则认为用户开始说话,如果不都为人声则判断用户说话结束,在断句的同时将语音包实时传入流式语音识别接口,在用户说话结束后获得用户文本并调用意图识别服务得到用户意图,而机器人则会预先抽象出各类策略用于不同的用户意图返回相应的机器人动作,例如按键策略用于识别用户按键信号,并根据事先配置好的话术选择流转的节点并生成语音发送给用户。
4.按键识别
目前所有的电话和传真机按键都采用DTMF信号进行编码和传输,DTMF信号是利用模拟信号对数字符号进行编码,该编码方案共使用8个模拟频率对16个符号进行编码,分为高音群和低音群,所以称为双音多频(Dual-Tone Multiple-Frequency)编码,每个符号由一个高音频率和一个低音频率唯一确定(0~9*#ABCD),其中智能语音机器人采用RFC2833规范实现的按键信号识别成本最低。
5.常见问题
1)噪音:这种情况一般为RTP包包头Sequence Number错乱导致的,保证一通电话的RTP包Sequence Number是自增即可。
2)爆音:出现爆音一般出现在语音拼接的场景,在实践中为了节省成本,一段不变文本对应的语音为了避免重复语音合成,一般都提前合成存入缓存,需要用到时拼接发送,因为每次语音合成的语音流的前44位为修饰语音流信息的数据,如上图所示,这是导致拼接后在拼接处有明显爆音的原因,去除前44位后即可解决。
四、算法子服务
1.架构服务化
项目早期为了快速验证方案的可行性,所有逻辑都耦合在一个服务中,随着接入的业务方越来越多,代码越来越臃肿,导致开发同学迭代成本高,线上服务容易出bug,为此我们做了一系列架构服务化的工作,实现了业务隔离、代码复用、各算法模块的独立迭代。
为了快速验证算法效果,需要对不同的算法做线上AB实验,在服务化的架构中,通过主体服务控制所有子服务调用和逻辑流转,在日晷平台上建多个实验,这些实验及实验内部各层之间相互正交,主体服务请求日晷服务得到各个算法分流信息再分发至各个子服务。
在项目的迭代中,各个角色的同学的关注重点不同,基于此智能语音机器人将线上语音交互产生的各类数据存储在不同的存储介质中,经过转化处理同步给项目的各个同学,方便产品/业务方同学关注线上运营数据,用于提升用户体验;方便算法同学及时获取训练样本和线上算法效果,用于离线训练和提升各类算法指标;方便后台同学监控线上服务质量和策略迭代,以支持项目快速稳定的滚动迭代。