背景

智能语音机器人是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采用的是共轭结构的代数码激励线性预测算法,能够实现很高的语音质量和很低的算法延时,被广泛地应用于数据通信的各个领域。三种音频编解码格式对比如下表所示。

语音采样

语音机器人后台使用的语音数据格式统一为16KHz采样率、16bit量化的PCM原始数据。由于有的SIP供应商采用的语音采样率为8KHz,这样语音机器人在发送语音数据时需要进行下采样将16KHz语音转换为8KHz,在接收到代理服务器发送的8KHz语音后则需要进行上采样转换为16KHz。

如上图所示,从高采样率到低采样率的过程称为下采样,下采样主要是通过抽取实现,上采样是下采样的逆过程,主要通过插值实现。由于抽取可能产生混叠,内插可能产生镜像,因此需要在抽取前进行抗混叠滤波,在内插后进行抗镜像滤波。抗混叠滤波和抗镜像滤波都是使用低通滤波器实现。

总结

语音机器人线上已经正式接入招聘、黄页业务线的商机过滤场景,每天外呼电话量数万,后续将接入客服通知、简历验真等更多的业务场景。本文主要介绍了语音机器人语音通话的实现过程,包括SIP信令的建立、语音发送控制、语音编解码和语音采样。语音通话是语音机器人的基础能力,后续将持续进行优化,兼容更多的SIP供应商、提高通话质量。


欢迎大家关注“58架构师”微信公众号,定期分享云计算、AI、区块链、大数据、搜索、推荐、存储、中间件、移动、前端、运维等方面的前沿技术和实践经验。

sip rtp长时间通话 挂断_智能语音机器人中的语音通话实践相关推荐

  1. Android Telephony 9.0通话挂断连接处理机制(opt/Telephony)

    前言:今天看了一下通话断开处理流程,所以做一个笔记来记录一下今天的学习成果. 通话断开连接一般有两种应用场景 本地主动挂通话 远端断开通话连接 (这里还包括网络挂断和对方挂断) 先处理本地挂断 本地主 ...

  2. FreePBX 12 SIP协议30分钟自动挂断问题处理

    FreePBX 12 SIP协议30分钟自动挂断问题处理 问题: SIP每次通话几乎恰好在 30 分钟左右掉线,而IAX协议并没有这个问题. 解决方案: 登录管理后台找到Settings =>A ...

  3. 单片机长时间程序跑飞_单片机程序跑飞的三种现象、原因及解决方法

    今天在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现象.原因及解决方法. 一.数组越界(数组溢出 ...

  4. python 长时间运行 会停止_如何“停止”和“恢复”长时间运行Python脚本?

    这里有一些简单的东西可以帮助你: import time import pickle REGISTRY = None def main(start=0): """Do s ...

  5. 使用java实现类似nc的功能_在FANUC机器人中使用后台运行逻辑实现PLC功能

    后台逻辑概念 PLC是工业自动化领域常用的一种逻辑控制产品,以其性能稳定.兼容性好.可扩展性强.体积小.性价比高而被广泛应用.在机器人产品中,为了降低系统集成的难度,很多机器人产品自身也会在控制系统中 ...

  6. android 通话状态监听(自定义接听挂断按钮与通话界面,根据公司的业务逻辑可以实现自己的来电秀功能)...

    前言: 因为公司需求,要自定义一款来电秀的app当做周边产品来配合主营的app业务. 之前因为赶项目,没时间整理这块,现在项目告一段落了,现在回头看看感觉这个功能还是挺有意思的,比较有针对性.电话呼入 ...

  7. horizon client长时间不操作不断开_动挡操作禁忌,伤车只在一瞬间!否则变速箱会提前...

    如今购置汽车的人越来越多了,很多的人购置汽车,都是为了让自己的生活质量得到提升.有了汽车今后,不管干什么都特其余方便,比如说上下班,可以开着车去.而现在的汽车也是多种多样的,手动挡,自动挡手自一体挡, ...

  8. Android手机实现自动挂断功能

    关于获取手机通话状态获取方式,请参考其他文档,此文不做介绍. 1.非ROOT手机 反射方法 通过AIDL和放射的方式实现电话挂断,是网上使用最多的方法. 首先我们需要创建一个aidl文件,包路径为:c ...

  9. 华硕笔记本飞行堡垒坠机:开机或长时间待机后wlan没有了,解决方案竟是···

    项目场景: 笔记本电脑开机后或者长时间待机后断网并且WiFi连接没有了 问题描述: 今天在开启电脑的时候出现了一个问题,之前电脑也有出现过同样的问题,笔记本型号飞行堡垒6,可能其他电脑也出现同样的情况 ...

最新文章

  1. Springboot-mongodb MongoRepository接口 save方法 详解
  2. Drupal 覆写系统样式
  3. SAP UI5应用点了search按钮后的实现调试
  4. hdu5279 YJC plays Minecraft 【分治NTT】
  5. 收集数据至泛型Dictionary
  6. SQL Server 导入bak备份出错
  7. SAP License:SAP精细化的应收付及要素为根设计思想
  8. kotlin web_Kotlin Web应用程序教程
  9. 我个人的未来5年IT学习计划
  10. PHP将swf转为gif,swf怎么转换成gif 怎么把swf转换成gif
  11. android x5全屏白色,x5webview 自定义全屏界面
  12. Photoneo Montion L3D相机安装和注意事项
  13. protues仿真出现Simulation is not running in real time....的情况处理
  14. AI伦理无法回避的5个问题:生物进化是否有方向?
  15. revit二次开发 IdlingExternalEvent 空闲事件与外部事件
  16. 2017年值得一看的7个APP设计
  17. 零基础轻松学python青少年趣味编程pdf_零基础轻松学PYTHON:青少年趣味编程(全彩版) 快学习教育编著 著...
  18. 小白操作:zuul网关升级为getway网关,以及jwt的使用
  19. 英文版windows 中文软件乱码的解决方案:设置Locale
  20. Dr.com客户端提示“使用代理软件”并断网怎么解决?

热门文章

  1. Matlab生成Word文件(含表格和图片插入)
  2. Sep 15th 2018
  3. pageable设置size_使用Pageable 分页
  4. 自学python能成功吗_可以自学python吗?
  5. Houdini普通面片破碎
  6. 新闻人工智能真的能让内容产业迎来第二春?
  7. 选择域名的技巧有哪些
  8. 【信息学奥赛】1030:计算球的体积(C++)
  9. Vue中splice的使用
  10. win10防火墙_WIN10系统必做的6个优化,优化完电脑性能飙升。