基于Speex的嵌入式无线数字音频交互系统

2013-10-15 06:10张立文宋占伟
吉林大学学报(信息科学版) 2013年4期
关键词:编解码数字音频解码

张立文, 吴 迪, 宋占伟

(吉林大学 电子科学与工程学院, 长春 130012)

0 引 言

VoIP(Voice over Internet Protocol)是基于IP网络的语音传输技术, 即将模拟信号数字化, 以数据封包的形式在IP网络上做实时传递。基于IP的实时语音传输技术能有效地利用现有的网络资源, 有利于缓解现有的通信网的紧张局面, 同时大大降低了通信成本。目前对VoIP技术的研究主要围绕改善IP电话的服务质量进行[1], 包括使用更先进的硬件、 可靠的实时传输技术和能随网络状况自适应调整速率的语音编码技术等。

Speex是一套开源的功能强大的语音引擎, 能实现高质量和低比特率的编码。它不仅提供了基于码激励线性预测算法的编/解码模块, 而且还提供了声音预处理和声学回声消除模块, 为保障IP网络中的语音通信质量提供了技术手段。此外, Speex还具有压缩后的比特率低(2~44 kbit/s)的特点, 并支持多种比特率。所以Speex在网络应用上有自己独特的优势, 特别适合VoIP系统[2]。流媒体指的是一种从Internet上获取音频和视频等多媒体数据的新方法, 它能支持多媒体数据流的实时传输和实时播放。通过运用流媒体技术, 服务器能向客户机发送稳定和连续的多媒体数据流[3]。

笔者设计一种在无线WiFi网络环境下的嵌入式语音交互和记录终端, 使用实时传输协议(RTP: Real-time Transport Protocol)实现数字语音的实时传输, 并使用Speex引擎实现数字音频的编解码和改善语音通话质量。

1 系统原理及方案

图1 系统硬件框图

设计以ARM处理器[4]S3C6410为硬件平台, 该处理器内部集成了强大的多媒体处理单元, 以Linux操作系统作为软件平台。每个终端配备一个无线网卡, 通过无线网卡的配置实现Ad-Hoc快速自组网[5]。发送终端通过话筒采集模拟音频数据, 通过音频接口电路转换成数字音频, 利用Speex对数字音频进行编码及抑制噪声和消除回声处理, 然后利用RTP实时传输协议在无线WiFi网络上进行传输, 接收终端接收到语音数据后进行解码。一方面保存到SD卡中; 另一方面通过音频接口电路把数字音频还原为模拟音频送入音箱进行播放。经过整合使每个终端既可作为语音发送端又可作为语音接收端, 从而实现语音的全双工交互和记录的功能, 并用按键控制系统的工作状态[6]。硬件系统总体设计框图如图1所示。其中, 音频编解码系统Audio Codec采用AC97接口, 外接WM9714作为音频解码芯片, 其主要功能是实现模拟音频和数字音频的相互转换[7]。

系统的软件设计在嵌入式Linux交叉编译环境下进行, 具体的软件设计包括系统的初始化、 音频的采集、 音频的相关处理(噪声消除和回声抑制)、 音频Speex编解码、 音频的RTP实时传输、 音频的存储和播放, 其软件流程图如图2所示。

图2 系统软件流程图

2 关键技术及实现

该系统所涉及的关键技术包括: Linux系统下语音的编程技术; Speex实现音频的编解码; Speex噪声抑制和回声消除的处理; 用RTP协议进行语音的实时传输以及系统的全双工整合等。

2.1 语音的采集和播放

设计采用Linux下OSS(Open Sound System)用户空间语音编程。首先进行声卡设备的初始化, 建立与硬件之间的联系; 然后设置音频采集的各技术指标(包括采样频率、 量化位数和声道数); 最后通过读写设备文件/dev/dsp即可实现声音的采集和播放。

2.2 语音的编解码

Speex是个开源、 免费、 专门针对VoIP语音的编解码器, 是一种动态比特率编码方式, 可根据网络环境的变化动态地修改其比特率, 它在窄带和宽带中都提供相应版本。使用Speex之前要在Linux宿主机和ARM开发板上移植Speex, 移植成功后即可使用Speex引擎对数字音频进行编解码和其他相关处理。 使用Speex的API函数对音频数据压缩编码要经过如下步骤[8]。

1) 定义一个SpeexBits类型变量bits和一个Speex编码器状态变量enc_state。

2) 调用speex_bits_init(&bits)和speex_encoder_init(&speex_nb_mode)初始化bits和enc_state。其中speex_nb_mode可定义为窄带模式、 宽带模式或超宽带模式。由于该设计对音频的压缩比要求不高, 故可以选取窄带模式。

3) 调用函数int speex_encoder_ ctl(void *state, int request, void*ptr)设定编码器的参数, 如设置帧的大小和量化的大小等, 以决定编码的质量。

4) 初始化完毕后, 对每帧声音作如下处理: 调用函数speex_bits_reset(&bits)再次设定SpeexBits; 然后调用函数speex_encode(enc_state, input_frame, &bits)进行编码, 在参数bits中保存编码后的数据流。

5) 编码结束后, 调用函数speex_bits_destroy(&bits), speex_encoder_destroy(enc_state)摧毁编码器。

对编码过的音频数据进行解码的步骤和编码大致相同, 不同之处是: 初始化后可对每个输入帧进行如下操作: 用函数speex_bits_read_from(&bits, input_bytes, nbBytes)读取一帧的比特流数据; 然后用函数speex_decode_int(dec_state, &bits, output_frame)对参数bits中的音频数据进行解编码, 在参数out中保存解码后的数据流。

2.3 噪声抑制和回音消除

噪声抑制又称为降噪处理, 是根据语音数据的特点, 识别属于背景噪音的部分, 并从音频帧中过滤掉。Speex的预处理器提供了噪声抑制功能, 其用法如下:

1) 初始化预处理器状态并创建预处理器;

2) 用speex_preprocess_ctl()函数设置预处理器参数, 通过设置SPEEX_PREPROCESS_SET_DENOISE参数打开噪声抑制功能, 并通过参数SPEEX_PREPROCESS_SET_NOISE_SUPPRESS设置最大程度的噪音衰减的分贝;

3) 用函数speex_preprocess_run( preprocess_state, audio_frame )对语音数据进行相关的预处理操作, 其中参数audio_frame为要处理的数据帧;

4) 处理完成后销毁预处理器, 释放资源。

图3 Speex回声消除的工作原理

用Speex实现回声消除的编程步骤。

1) 初始化回声消除器状态, 用函数SpeexEchoState *echo_state=speex_echo_state_init(frame_size, filter_length)创建回声消除器, 设置的两个参数分别为采样数据的大小和回声消除的尾长。这两个参数的设置, 直接影响到回声消除的效果。

2) 用speex_echo_cancellation(echo_state, input_frame, echo_frame, output_frame)函数消除回声。其中声卡捕捉的声音input_frame(要发送出的声音)和扬声器播放的声音echo_frame(要消除的声音)之间的延迟要保证同步。应使它们之间的延迟足够小, 以得到较好的回声消除效果。最后销毁回声消除器, 释放所占用的资源。

3) 用函数speex_echo_state_destroy(echo_state)销毁回声消除器。

2.4 语音的实时传输

RTP是目前解决流媒体实时传输问题的最好办法[10]。RTP是用于Internet上针对多媒体数据流的一种传输协议, 其目的是提供时间信息和实现流同步。RTP本身并不能为按序传输数据包提供可靠的保证, 也不提供流量控制和拥塞控制, 而这些都由RTCP(Real-time Transport Control Protocol)控制协议负责完成。该设计在Linux下利用Jrtplib进行实时流语音编程[11], Jrtplib是个面向对象的RTP封装库, 利用它可以很方便地完成Linux平台上的实时流媒体编程, 其网络编程的流程如图4所示。Jrtplib是个高度封装后的RTP库, 使用时一般不用关心RTCP数据包是如何被发送和接收的, 因为这些都可以由Jrtplib自己完成。只要成功调用PollData()或SendPacket()方法, Jrtplib就能自动对到达的RTCP数据包进行处理, 还会在需要的时候发送RTCP数据包, 从而确保整个RTP会话过程的准确性。

图4 RTP协议传输流媒体数据的流程图

2.5 语音的存储记录和全双工整合

图5 WAV文件头的格式

为保证语音记录的保真度, 笔者把数字音频保存为WAV文件格式并存储到大容量的SD卡中。首先填写设置WAV文件头, WAV文件由若干个Chunk组成, WAV文件头的结构如图5所示, 然后创建一个文件并写入WAV文件头和音频数据即可把声音存储成WAV格式的文件, 从而实现语音的记录功能。

为实现语音的全双工通信功能, 采用Linux下的多线程编程技术[12], 在主进程中创建两个线程: 一个线程用于语音的采集、 处理、 编码和发送, 另一线程用于语音的接收、 解码、 存储和播放, 同时还要使用线程同步技术保证线程同步(对消除回声很必要)。从而可实现语音交互和记录的功能, 并可用按键控制系统的工作状态。

3 系统功能测试

表1 不同通信距离下的测试数据

经各个功能模块的整合后, 即可设计整体系统。下面在WiFi无线网络环境下对系统的功能进行测试, 测试项目包括系统的延时、 语音传输过程中的丢包率、 噪声抑制和回声消除的效果。当两终端的通信距离为5 m,20 m,35 m和50 m时, 系统测试的具体数据如表1所示。

从测试结果中可看出, 当通信距离小于20 m时, 该系统的语音传输的实时性良好, 传输延时很小, 丢包率低, 通话过程中几乎没有回音, 噪声也得到了很好的抑制, 语音通话的质量清晰流畅。但由于系统采用Ad-Hoc模式的无线网络进行通信, 随着通信距离的增加, 无线网络条件随之变差, 网络的延迟较大, 传输过程中的丢包数量增加, 导致语音通话的质量随之降低, 声音通话偶尔有中断, 但不影响通话, 有较明显的回声, 话音服务质量并不理想。

噪声抑制部分的测试结果如图6所示, 从中可看到, 噪声抑制的效果比较明显。

a 未经噪声抑制前的声音波形 b 经噪声抑制后的声音波形

4 结 语

针对如何提高IP电话的话音服务质量的问题, 设计采用了流媒体协议传输无线数字音频数据, 保证了语音传输的实时性和可靠性, 并利用功能强大的开源Speex语音引擎进行数字语音的编解码及噪声抑制和回声消除的相关处理, 提高了VoIP语音通话的质量, 具有很好的应用前景和市场价值。测试结果表明, 当通信距离小于20 m时, 该系统可实现清晰流畅的语音通话; 但随着通信距离的增加, 通话的服务质量有所降低, 还有待进一步的研究和解决。

参考文献:

[1]管玲玲. VoIP与WLAN结合实现移动IP电话的研究 [D]. 武汉: 华中科技大学电子信息工程系, 2007.

GUAN Ling-ling. Research on Mobile IP Phone by VoIP and WLAN [D]. Wuhan: Department of Electronics and Information Engineering, Huazhong University of Science and Technology, 2007.

[2]谢晓钢, 蔡骏, 陈奇川, 等. 基于Speex引擎的VoIP系统设计与实现 [J]. 计算机应用研究, 2007, 24(12): 320-323.

XIE Xiao-gang, CAI Jun, CHEN Qi-chuan, et al. Design and Implementation of VoIP Based on Speex Codec [J]. Application Research of Computers, 2007, 24(12): 320-323.

[3]张勇, 何娜娜, 夏海伦. 移动P2P流媒体中的数据调度算法 [J]. 吉林大学学报: 信息科学版, 2010, 28(6): 570-575.

ZHANG Yong, HE Na-na, XIA Hai-lun. Data Scheduling Algorithm in Mobile P2P Streaming [J]. Journal of Jilin University: Information Science Edition, 2010, 28(6): 570-575.

[4]刘阳阳, 申铉京, 王一棋, 等. 基于ARM的智能监控系统的设计与实现 [J]. 吉林大学学报: 信息科学版, 2011, 29(2): 158-163.

LIU Yang-yang, SHEN Xuan-jing, WANG Yi-qi, et al. Design and Implementation of Embedded Intelligent Monitor System Based on ARM [J]. Journal of Jilin University: Information Science Edition, 2011, 29(2): 158-163.

[5]刘超. 图像捕捉发送单元的研发 [D]. 长春: 吉林大学电子科学与工程学院, 2010.

LIU Chao. R & D of Image Capture Transmission Unit [D]. Changchun: College of Electronics Science and Engineering, Jilin University, 2010.

[6]王黎明, 闫晓玲, 葛德宏, 等. ARM9嵌入式系统开发与实践 [M]. 北京: 北京航空航天大学出版社, 2008.

WANG Li-ming, YAN Xiao-ling, GE De-hong, et al. Development and Implementation of ARM9 Embedded System [M]. Beijing: Beihang University Press, 2008.

[7]李俊. 嵌入式Linux设备驱动开发详解 [M]. 北京: 人民邮电出版社, 2008.

LI Jun. Details for Embedded Linux Device Drivers Development [M]. Beijing: The People’s Posts and Telecommunications Press, 2008.

[8]杨淑文. 基于Speex技术的无线语音编/解码和传输系统设计 [D]. 哈尔滨: 哈尔滨工业大学电子与信息工程学院, 2009.

YANG Shu-wen. Design of Wireless Voice Codec and Transmission System Based on Speex Technology [D]. Harbin: School of Electronics and Information Engineering, Harbin Institute of Technology, 2009.

[9]王庆辉, 李永哲. VOIP声学回声消除算法研究 [J]. 现代电子技术, 2009(7): 157-159.

WANG Qing-hui, LI Yong-zhe. Research on VOIP Acoustic Echo Cancelation Algorithm [J]. Modern Electronics Technology, 2009(7): 157-159.

[10]程红霞, 朱珠, 吴小强, 等. Linux下语音实时通信的一种实现方法 [J]. 兵工自动化, 2010, 29(3): 94-96.

CHENG Hong-xia, ZHU Zhu, WU Xiao-qiang, et al. An Implementation Method of Linux Audio Real-Time Communication [J]. Ordnance Industry Automation, 2010, 29(3): 94-96.

[11]张静, 裴未迟, 许刚. 基于RTP协议的双向语音通信 [J]. 计算机工程, 2003, 29(16): 133-134.

ZHANG Jing, PEI Wei-chi, XU Gang. Full-Duplex Speech Communication Based on RTP [J]. Computer Engineering, 2003, 29(16): 133-134.

[12]吴岳. Linux C程序设计大全 [M]. 北京:清华大学出版社, 2009.

WU Yue. Complete Volume for Linux C Program Design [M]. Beijing: Tsinghua University Press, 2009.

猜你喜欢
编解码数字音频解码
《解码万吨站》
ASN.1 的PER 分层运行库系统的设计和实现
1553B总线控制器编解码设计
解码eUCP2.0
为多重编解码世界做好准备
大型民机试飞遥测视频编解码方法研究
NAD C368解码/放大器一体机
Quad(国都)Vena解码/放大器一体机
数字音频广播业务和航空无线电导航业务的兼容研究测试
基于FPGA的多协议数字音频信号发生方法