背景
智能语音机器人是58集团TEG架构平台线AI Lab自主研发的具有自动电话拨打、多轮语音交互、智能意向判断等多种功能的智能对话机器人,可应用于自动电话销售、产品服务推广、信息审核、语音通知等多种业务场景。语音机器人总体架构如下图所示,包括接入层、编辑运营层、逻辑层、基础服务层和WEB接入平台等模块,本文主要介绍基础服务层的语音通话模块,其他模块会在后续文章中进行具体介绍。
语音通话是语音机器人的基础能力,总体架构如下图所示,支持机器自动拨打电话,自动判断通话状态,如正常接听、空号、通话忙、无人接听、快速挂断、停机、关机等。SIP对话建立层通过SIP协议直连SIP代理服务器完成SIP信令建立,包括SIP INVITE、监听器SipListener 和 麦克风数据接收线程。SIP语音交互层通过对话监听器监听发送队列和接收队列实现,同时实现语音发送控制、音频采样和编解码。
电话拨打流程
语音机器人首先通过SIP协议直连SIP供应商的代理服务器与被叫建立SIP信令并启动RTP会话,RTP会话启动后的语音交互流程如下图所示。语音机器人从话术库里选择开场白语音数据放入发送队列,发送程序从发送队列取出16KHz的开场白语音后先进行语音采样,转成代理服务器需要的采样率,再进行编码转成代理服务器需要的编码格式,然后将编码后的数据通过代理服务器发给被叫用户。被叫用户说话语音数据通过代理服务器传回语音机器人,首先会进行解码处理,然后再进行语音采样转成16KHz语音数据放入接收队列,接收程序拿到语音数据后会执行语音断句、语音识别、意图识别等操作并选择回复语音。整个通话过程中需要对语音数据进行采样、编码、解码等处理。
SIP信令建立
语音机器人通过SIP协议与SIP供应商的代理服务器进行通信,完成SIP信令的建立,具体流程如下图所示。语音机器人发送INVITE请求到代理服务器负责启动会话,代理服务器以100 Trying应答,同时获取被叫地址后转发INVITE请求。被叫响铃后产生的180响铃状态码回传给语音机器人。被叫接听电话后回传200 OK给语音机器人,语音机器人收到200 OK后以ACK进行应答,此时语音机器人和被叫建立RTP会话,进行语音数据传输,任何一方发送BYE请求可以结束会话状态。
语音机器人使用JAIN SIP开源库进行SIP 信令建立。INVITE请求发送使用SDP,SDP是SIP会话描述协议,用于描述参与者通过网络理解格式的多媒体会话。以下为语音机器人发送INVITE请求时的SDP示例,其中包括了通信的本地IP和端口、支持的编解码格式、语音采样率等信息。
语音发送
语音机器人向被叫用户发送语音数据时需要根据语音采样率进行分包,同时需要控制语音包的发送速度,这样才能保证用户听到的语音数据是正常的。语音分包需要先计算每帧PCM数据的大小。
PCM Buffer size = 采样率*采样时间*采样位深/8*通道数(Bytes)
采样时间可以设置的范围较大,可以使用20ms或者200ms,一般来说时间越短时延越小,语音机器人选取的采样时间为20ms,音频为16KHz、16bit的单通道PCM数据。这样语音机器人每帧数据大小为16*20*16/8=640 Bytes。发送数据时,语音机器人每次发送 640Bytes的PCM语音数据,每次发送完sleep 20ms。
语音编解码和采样
语音机器人对接了多家SIP供应商,如东信、承启通、腾讯、漫道等,不同SIP供应商采用的语音采样率和编解码方式不尽相同。语音机器人支持了Opus、G711、G729等编解码方式,以适应不同的SIP供应商,并通过语音上采样和下采样来兼容不同的采样率。
语音编解码
代理服务器返回给语音机器人的180Ringing数据包中指明了使用的编解码格式,语音机器人发送语音时需要将原始的PCM语音数据按约定格式进行编码。接收被叫用户说话语音时,需要将编码后语音按约定格式进行解码以进行下一步的语音处理。SIP电话RTP通信过程中对音频数据进行编码是为了减少网络传输包的大小同时保证音频的质量。音频编码过程是将模拟的、连续的声音波形数字化,把模拟的声音信号通过采样、量化和编码过程转变成数字信号,解码过程再将这些记录的数字信号还原为模拟信号,获得连续的声音。
语音机器人兼容了Opus、G711、G729等编解码格式,以JNI方式调用开源C/C++库实现。Opus是一个有损声音编码格式,能处理各种音频应用,可以从低比特率窄带语音扩展到非常高质量的立体声音乐。G711是国际电信联盟制定出来的一套语音压缩标准,主要用脉冲编码调制对音频采样,采样率为8k每秒。它利用一个 64Kbps 未压缩通道传输语音讯号。 起压缩率为1:2, 即把16位数据压缩成8位,G711有两种压缩算法,分别为PCMA和PCMU。G.729采用的是共轭结构的代数码激励线性预测算法,能够实现很高的语音质量和很低的算法延时,被广泛地应用于数据通信的各个领域。三种音频编解码格式对比如下表所示。
编码格式 | 对比 |
Opus | 适应范围广,动态可调比特率、音频带宽和 帧大小,比特率从6kbps到510kbps,采样率从8kHz到48kHz,帧大小从2.5ms到60ms |
G711 | 能提供较好语音质量,但是占用带宽较高,需要64kbps
|
G729 | 针对8KHz采样的16bit量化的PCM音频编码,具备16 : 1高压缩率,占用带宽低,需要32kbps,同时能实现较好语音质量 |
语音采样
语音机器人后台使用的语音数据格式统一为16KHz采样率、16bit量化的PCM原始数据。由于有的SIP供应商采用的语音采样率为8KHz,这样语音机器人在发送语音数据时需要进行下采样将16KHz语音转换为8KHz,在接收到代理服务器发送的8KHz语音后则需要进行上采样转换为16KHz。
如上图所示,从高采样率到低采样率的过程称为下采样,下采样主要是通过抽取实现,上采样是下采样的逆过程,主要通过插值实现。由于抽取可能产生混叠,内插可能产生镜像,因此需要在抽取前进行抗混叠滤波,在内插后进行抗镜像滤波。抗混叠滤波和抗镜像滤波都是使用低通滤波器实现。
总结
语音机器人线上已经正式接入招聘、黄页业务线的商机过滤场景,每天外呼电话量数万,后续将接入客服通知、简历验真等更多的业务场景。本文主要介绍了语音机器人语音通话的实现过程,包括SIP信令的建立、语音发送控制、语音编解码和语音采样。语音通话是语音机器人的基础能力,后续将持续进行优化,兼容更多的SIP供应商、提高通话质量。