李 强,明 艳
在语音信号处理、多媒体通信、通信原理和移动通信等课程中,都会涉及语音编码相关的知识,如G.711A律64 kb/s的PCM编码、第二代移动通信GSM系统中的RPE-LTP编码和第三代移动通信系统中的AMR编码等[1-3]。在这些理论课的授课过程中,老师大多只是讲解语音编码的基本原理、相关标准和应用场景等内容,学生不能亲身体验用这些标准实现的编码器输出语音的质量,如语音的音质、清晰度、自然度和辨识度等[4]。学习这些课程的学生也大多不会考虑用软件,如用C语言去实现相关标准的语音编码器。如果学生用软件实现了这些语音编码器,也没有一个便捷的系统或平台给予支撑,如对语音的质量进行测试,采用这些实现的编码器进行语音通话等。针对这些教学和学生对语音质量测试和应用的需求,本文采用了多线程模块化的软件结构,通过UDP/IP协议[5],利用校园局域网为传输通道,实现了一个语音通信实验系统。该系统除了支持多种标准的语音编码器进行双向实时通话外,还能测试编码器语音的主观质量、编解码时延、传输流量、语音压缩比等指标。由于系统采用了模块化的设计结构,学生可以把自己用软件实现的语音编解码器添加到系统的编解码模块中,即可利用该系统实现双向语音实时通话,并进行性能指标的测试。因此,本文实现的系统具有良好的灵活性和扩展性,可用于与语音编码相关课程的实验和理论教学中。
基于局域网的语音通信实验系统的架构如图1所示。系统由语音信号的采集,语音数据的存储、统计和播放,语音编解码器,传输控制和网络传输5个部分组成。
1.1.1 语音信号的采集
系统通过PC机声卡采用音频波形API技术[6]对语音信号进行实时采集、量化和编码。采样率、量化方式和量化级数可根据需要通过系统界面进行设置。采集到的数据以语音编码的帧长为单位填充到设置的数据缓冲区中。
图1 基于局域网的语音通信实验系统架构
1.1.2 语音的存储、统计和播放
在进行语音通信前,需对语音数据进行连续保存。系统采用乒乓存储结构[7],设置两个语音缓冲队列,轮流对两个缓冲区读写数据。某一缓冲区被填满语音数据后,系统立刻解锁该缓冲区,并读取数据,采用语音编码器对数据进行压缩编码,形成数据码流后,通过局域网发送到接收端,同时把该缓冲区重新加入语音缓冲区队列中。
为了对发送到局域网的数据流量进行统计,在缓冲区中设定了一个事件,当压缩后的数据码流的数据量达到事件设定的大小,便开始发送数据。本系统把发送一次的数据称为一个包,通过统计包的个数来计算发送的数据流量。
接收端接收到语音数据码流后,采用与发送端相同标准的语音解码器进行解码,把解码后的数据写入接收缓冲区中。本系统对接收缓冲区设置了两个指针,即播放指针和写指针。写指针解决数据覆盖问题,指示用于写入数据缓冲区的位置;而播放指针则表示当前所播放的数据末尾。接收端通过调用Media库里的WaveOut函数对解码后的语音进行播放。
1.1.3 语音编解码器
本系统实现了G.711 A律PCM编码、G.729、MELP、SMV和ARM语音编解码器。G.711是ITU-T提出的8 kHz采样,8 bit非均匀量化的波形编码标准[8],广泛用在电话通信中,其原理和方法是通信原理课程的重要内容。G.729声码器使用了LPC分析合成技术,通过使得实际语音与合成语音之间误差能量最小为准则来进行编码,该声码器具有较高的压缩率;MELP采用多带混合激励等技术提高了合成的语音质量,可实现1.2~4 kb/s的低码率声码器;SMV是3G移动通信系统变速率语音编码选项之一[9-11]。针对这些不同标准,不用应用场景的语音编码器,本文系统通过调用语音编解码器函数的方式来实现对采集或接收到的语音进行实时编解码。
1.1.4 传输控制
UDP是一种面向无连接的协议,具有资源消耗小,处理速度快的优点[12],通常用于音频、视频和普通数据的传送。本系统为了实现语音数据的实时传送,采用了UDP Socket作为网络端口的监听[13],该Socket采用异步工作模式。为了实现全双工语音通信,系统分别建立发送和接收UDP Socket,通过绑定接收端和发送的端口号,对Socket的发送数据和接收数据进行消息处理。当收发双方启动程序并监听后,均处于侦听通话邀请状态,当某一方向另一方发出通话邀请,被叫方能够听到发送端的声音,当点击开始通话后,双方便进入语音通信状态,收发两端的系统启动录音和放音线程,即可进行全双工语音通信。
1.1.5 网络传输
系统以局域网作为语音通信的传输媒介。两台接入局域网的PC机启动并运行语音通信测试系统软件后,设置收发两端的IP地址,选择相同的编码器,并呼叫对方,当对方确认后,便可通过局域网进行语音通话。
系统工作在peer to peer模式,即收发双方使用同一个程序[14]。如图2所示,是语音通信采用的线程架构,其中,主线程用来响应程序界面的设置。语音发送和语音接收是分开进行的,均通过异步调用方式来实现。语音的发送通过Bufferfull事件触发m¯pWaveIn¯BufferFull来实现,而收发两端系统则通过 m¯pUdpServer¯PacketReceived来接收语音数据,并调用m¯pWaveOut.Play来播放语音。监听是否收到数据也采用了异步方式,目的是减少线程数目和开销。
图2 多线程架构
通过引入多线程,系统可以同时发送和播放语音。语音的发送和播放通过SendTestAudio和Play-TestAudio线程来实现。引入SendTest的目的是通过编码和播放测试语音,测试语音质量和计算语音编码器的编码效率。
实验系统界面如图3所示,在 “参数设定”中选择语音编码器类型、采样率和量化级数。当对方收到通话邀请时,系统会自动询问是否匹配参数,只有参数匹配一致才能正常传输。 “设备选择”的设置主要是考虑到当一个终端拥有多个语音输入输出设备时,要对参与工作的设备进行选择。“本地设置”用于设置本地IP地址和端口号11100。本地设置完成后,单击 “监听”,然后在“目标设置”中,设置接收端的IP地址和端口号11100。收发两端点击 “开始通话”,则可以进行双向的实时通信。在通话过程中,系统还可以实时显示编解码延时、接收和发送数据包的数量和字节数。“发送测试音”和 “播放测试音”可以对wav格式的语音文件进行编解码处理和播放。
图3 语音通信实验系统界面
本文设计的系统能测试语音质量、压缩比、编解码延时、数据流量等指标,可用于语音编码相关课程的理论和实验教学,如老师讲解某个语音编码器的编码原理和方法时,可以现场为学生播放经过该系统输出的语音,也可以比较不同语音编码器的特点,如音质、算法复杂度、压缩比等。实验老师用该系统可以开发出一些相关的实验项目,如要求学生去实现一些语音编码器,然后用该系统进行测试等。
图4 G.711 A率编码器测试结果
如果在本地和目标IP地址均设置为127.0.0.1,系统可以进行自发自收的自环测试。自环测试时,点击 “发送测试音”,从PC机中选择要编码的语音文件,然后点击 “开始通话”,用选择的语音编码器对语音文件数据进行编解码处理;再点击 “发送测试音”,可以播放经过编解码后的语音,如果点击 “播放测试音”,则可播放没有经过任何编解码处理的原始语音文件。
如图3所示,是没有经过压缩编码的某个语音文件的自环测试界面,接收和发送字节数均为110.375 kB,即该语音测试文件的大小为110.375 kB。如图4所示,显示了该测试语音文件经G.711 A率编码器的测试结果,收发字节数为55.187 5 kB,编解码延时分别为2.1μs和1.2μs,通过计算该编码器发送字节数和原始语音文件字节数之比,可得出该编码器的语音压缩比为1/2。分别点击图4系统界面的 “发送测试音”和 “播放测试音”,启动语音的播放,通过试听,可以体验经过编解码处理后的语音和原始语音之间音质的差别,评估出语音编码器的主观语音质量。如图5所示,是G.729语音编码器的测试结果,收发字节数均为7.031 25 kB,压缩比接近1/16,编解码延时分别为678.6μs和256.3 μs。
图5 G.729编码器测试结果
图6 采用SMV编码器的语音通信界面
如图6所示,是在两台PC机上运行本文语音通信测试系统,通过校园局域网进行语音通话的界面。两端系统均选择SMV 4 kb/s语音编码器,“本地设置”和 “目标设置”分别输入本地和目的IP地址,点击 “开始通话”后,两端语音通信测试系统即可进行双向实时语音通信,并实时显示收发数据流量和编解码延时。
本文采用多线程模块化结构进行软件设计,通过UDP/IP协议,以局域网为传输通道,实现了具有良好可扩展性和实用性的语音通信系统。该系统既能通过局域网络进行双向实时语音通信,又能测试各种语音编码器语音的主观质量和压缩比,还能实时显示语音通信过程中编解码延时,可用于语音信号处理相关课程的理论教学案例演示,也可基于该系统开发相应的实验项目,还可用于学生测试自己实现的语音编码器的质量。
[1]张鸣.通信原理仿真实验系统设计[J].实验技术与管理,2013,30(6):54-57,61.
[2]晏燕,王惠琴.多媒体通信课程的教学改革与探讨[J].兰州文理学院学报(自然科学版),2014,28(4):107-110,128.
[3]涂继辉,苏丽秋.基于OpenBTS和Asterisk的移动通信实验系统设计与实现[J].实验技术与管理,2014,31(5):65-70.
[4]杨毅,邓北星,马晓红.《语音信号处理》实验教学研究与实践[J].实验科学与技术,2012,10(6):112-115,180.
[5]崔鹤,刘云清,盛家进.基于FPGA的UDP/IP协议栈的研究与实现[J].长春理工大学学报(自然科学版),2014,37(2):133-137.
[6]冯金金,吴游.基于DSP的音频信号压缩通信系统的设计与实现[J].信息技术,2016(8):200-203.
[7]李桂菊.利用DSP底层结构提高MPEG-4编码的实时性[J].中国光学,2011,4(5):461-467.
[8]徐海潮,张江鑫,蒋伊乐.基于DM365的IP语音终端设计[J].杭州电子科技大学学报 (综合版),2013,33(5):146-149.
[9]郭燕.多点语音通信在船舶通信系统中的仿真[J].舰船科学技术,2016,38(7):98-99.
[10]李强,谢虹恩.改进的基于MELP的非连续传输语音编码算法[J].重庆邮电大学学报(自然科学版),2014,26(5):636-641.
[11]夏晓峰.可选取模式声码器SMV算法优化[J].鸡西大学学报 (综合版),2014,14(9):49-51.
[12]范开俊,徐丙垠,陈羽,等.配电网分布式控制实时数据的GOOSE over UDP传输方式[J].电力系统自动化,2016,40(4):115-120.
[13]李淑梅,王志彬.Socket在局域网聊天系统中的应用[J].吉林师范大学学报(自然科学版),2014,35(1):71-73.
[14]张立晨,张晋豫.基于分区概率的P2P实时流媒体缓存策略[J].软件,2014,35(4):12-17.