付璐 刘哲 韩琨
(1.华东师范大学信息学院通信工程系电子信息科学与技术,上海200241;2.天津大学材料科学与工程学院材料成型及控制工程专业,天津300072)
摘要:近年来语音引擎发展迅速,其编码质量与速率也不断变化。Speex就是一套能实现高质量和低比特率编码的强大的
语音引擎编码算法。文章首先介绍了Speex编/解码算法的特性与优势,并分析了Speex算法原理,包括Speex算法相关概
念,预处理模块,Speex的窄带及宽带子模式的编码原理等。并利用speex算法libspeex库和libspeexdsp库中的函数设计了
对PCM语音数据进行压缩与解压功能的程序,最后对程序功能进行了测试。
关键词:VoIP;语音压缩;Speex算法;噪声消除;回声抵消
中图分类号:TP391文献标识码:A文章编号:1009-3044(2012)26-6357-03
Design of Voice Encoder/Decoder Based on Speex Algorithm
FU Lu1, LIU Zhe2, HAN Kun1
(1.Dept. of Electronic Engineering, East China Normal University Department, Shanghai 200241, China; 2.School of Materials Science and Engineering,Tianjin University,Tianjin 300072, China)
Abstract: The voice encoding has developed rapidly, and there are a lot of changes in the quality and the rate. Speex which is a powerful speech engine developed in recent years can achieve high quality and low bit rate voice encoding. The features and ben? efits of Speex encoding / decoding algorithms is introduced in this article, and then the Speex algorithm theory, including the pre-processing module, Speex narrowband and broadband sub-mode coding principles are analyzed. Also the voice encoder and decoder based on the libspeex and libspeexdsp libraries are developed to achieve the compression and decompression of the voice data, and finally the program function is tested.
Key words: VoIP; voice compression; Speex algorithm; noise cancelation; echo cancelation
近年来语音引擎[1-2]发展迅速,其编码质量与速率也不断变化。Speex就是一套能实现高质量和低比特率编码[3]的强大的语音引擎编码算法。为了保障IP网络中的语音通信质量[4-5],Speex算法除了提供了基于码激励线性预测(CELP)算法的编/解码模块,还在其最新发布的版本中提供了声音预处理和声学回声消除模块。同时,Speex算法压缩后的低比特率(2~44 kbps)特点,以及支持多种
比特率的优势,使之更加适合于VoIP的系统[6-7]。
1 Speex编解码算法简介
Speex算法是基于CELP算法的多模式多速率的语音编码算法。对应8kHz、16kHz、32kHz三种不同的语音采样率,Speex算法提供了窄带、宽带以及超宽带三种不同带宽的语音编码模式
1.1 Speex算法——窄带模式
1)整帧分析:在Speex窄带模式中,每个语音帧长20ms,对应于160个取样;每个帧被分成4个子帧,每个子帧长5ms,对应40个取样。对于大多数的窄带比特率(8kbps及以上),只有线性光谱(LSP)和全局激励增益gframe,而这两个参数是在整帧的层面上编码的。其他所有的参数都在子帧层面上编码。
2)子帧分析与合成:Speex算法在三大方面不同于多数的CELP编/解码器。首先,相对于很多CELP编/解码器用单个增益进行分数基音估计,Speex算法要用到3个增益,但它仅使用一个整数对基音进行周期编码。其次,在对固定码本增益编码时,很多CELP编码器采用了移动平均预测来进行编码;而Speex算法是对全真激励增益和子帧增益相关系数的乘积来编码。最后,Speex算法在子向量量化值的使用方面,采用了随机码本信号取代代数码本信号。
3)比特分布:在Speex算法中,定义了范围在256bps~24.6kbps之间的7种不同的窄带比特率。首先分别用1bit和4bits对带宽(Band wide)和窄带子模式号(Mode ID)进行编码;其中mode ID的范围为0到15,只有前7个值是可用的。在比特流的打包处理上,整帧层的所有参数首先进行打包,随后是子帧层参数的打包。在某一子帧曾参数完全打包后,下一子帧层的参数才开始进行打包处理[8]。
1.2 Speex算法——宽带模式
在Speex算法的宽带模式下,Speex采用正交镜像滤波器把16kHz的信号分成两个8kHz的信号。其中0~4kHz表示低带部分,4~ 8kHz表示高带部分。
1)线性预测:在宽带模式下,分出的告贷部分的线性预测与窄带模式相似。不同的是,宽带模式下使用了多阶量化器(MSVQ)对高带的LSP系数编码,并且仅用了12个比特。在这12个比特中,前6bits用来量化10个系数,后6bits用来量化残差。
2)基音预测:在宽带模式下,由于带宽部分有4kHz以上轻微的谐波结构,同时由于QMF将4~8kHz的部分折叠成了4~0kHz,使谐波的位置不再是基音的倍数,因此基音预测难以实施。故在Speex算法编解码的高带部分没有引入基音预测。
3)比特分配:在宽带模式中,在高带编码前,窄带帧已经打包完成。因此宽带帧可能会被窄带解码器正确解码,同时如果多个帧被打包在同一包中时,可能会导致警告信息的弹出。而解码器为了与比特流保持同步,不得已抛弃了高带部分。
2基于Speex算法的语音压缩与解压的程序设计
2.1压缩程序
压缩程序的主程序编写在speexenc文件中,程序设计的思路为,首先编写speexenc(编码)的用法;然后编写如何实现对输入文件的压缩:先用fopen函数打开输入的文件,并判断参数,再进行初始化配置参数,预处理,然后给待生成的spx文件写头,调用libspeex库中的函数对语音数据进行压缩处理并写入spx文件中,即可输出压缩后的spx文件。其程序流程如图1所示。
2.2解压缩程序
解压缩程序同压缩程序设计类似,其实现部分也是主要调用libspeex库中函数。解压缩的主程序编写在speexdec文件中,程序设计的思路为,首先编写speexdec的用法;然后编写如何实现对spx文件的的解压:先用fopen函数打开待解压的文件,再进行初始化,然后编写解码循环,循环中要读取spx文件所有的数据包,并把第一个数据包作文speex头处理,调用libspeex库中的函数对spx文件进行解压处理,处理完之后即可输出解压后的文件。其程序流程如图2所示。
为了验证语音压缩和解压程序的功能,首先对一个PCM语音文件进行了压缩。
在压缩程序Speexenc下的bin文件夹内放入一个语音文件1.wav,然后输入如下命令speexenc -n --vbr 1.wav 2.spx,其中PCM文件1.wav语音为8kHz采样率、16bits量化的单声道数据,程序运行结果图3所示:
图3 Speex语音压缩程序运行结果
在压缩完成后,再对生成的压缩文件进行相同参数的解压,输入如下命令speexdec -n --force-nb --rate 8000 --mono 2.spx 2. wav,程序的运行结果如图4所示:
图4Speex语音解压缩程序运行结果
那么文件2.wav就是原始语音文件1.wav经过压缩和解压过程后生成的语音文件,图5和图6分别为这两个语音文件的波形图。
比较这两个波形可以看出,解压之后略有失真,而且实际听起来也是有一点噪声,但是从波形上看基本相同,因此该程序设计基本上达到了预期的目标,实现了对语音文件的压缩与解压。
4结束语
Speex作为一套功能强大的语音引擎,具有诸多优点,这些特点使得Speex特别适合VoIP的系统和无线语音传输系统,能实现高质量和低比特率的编码。本文在介绍了Speex编/解码算法的特性基础上,分析了Speex算法原理,介绍了如何利用speex算法libspe ex库和libspeexdsp库中的函数设计基于Speex算法的PCM语音压缩与解压程序,并通过测试验证了程序的功能。
参考文献:
[1]蔡铁,龙志军,伍星.基于语音质量预测的Speex自适应码率控制算法[J].计算机应用,2010,3(2):12-17.
[2]杨明.数字音频压缩技术发展现状[J].中国新闻科技,1999(4).
[3] Andre Neubauer, Jurgen Freudenberger, Volker Kuhn.编码理论:算法、结构和应用[M].张宗橙,译.北京:人民邮电出版社,2009.
[4]谢晓钢,蔡骏,陈奇川.基于Speex语音引擎的VoIP系统设计与实现[J].计算机应用研究,2007,12(5):33-41.
[5]胡爱荣.Speex语音编解码算法及其在DSP上的实现[D].北京:北京邮电大学,2008.
[6]李洪艳.基于VoIP和异构计算的SPEEX研究与实现[D].成都:电子科技大学,2011.
[7]杨淑文.基于Speex技术的无线语音编/解码和传输系统设计[D].哈尔滨:哈尔滨工业大学,2009.
[8] Zhong Jieshi,Zhang Ke. Research and Implementation of Speech Codec Based on Speex [J]. Computer Measurement & Con trol, 2010,2(6):102-111.