当前位置:首页 > 芯闻号 > 充电吧
[导读]        Speex编解码器的存在是因为需要一款开源且免软件专利使用费的语音编解码器,这是任何开源软件可用的必要条件。本质上来说,Speex相对于语音正如Vorbis(注:免费音乐格式)相对于音

        Speex编解码器的存在是因为需要一款开源且免软件专利使用费的语音编解码器,这是任何开源软件可用的必要条件。本质上来说,Speex相对于语音正如Vorbis(注:免费音乐格式)相对于音频/音乐。不像许多其他语音编解码器,Speex不是为移动电话而设计,而是为分封网络(packet network)和网络电话(VoIP)而设计的。所以当然支持基于文件的压缩。

        Speex设计灵活,支持多种不同的语音质量和比特率。对高质量语音的支持也就意味着Speex不仅能编码窄带语音(电话语音质量,8kHz采样率),也能编码宽带语音(16kHz采样率)。

        为VoIP而不是移动电话而设计意味着Speex对丢失的数据包鲁棒,但对损坏的数据包不鲁棒。这基于在VoIP中数据包要么完整到达要么不能到达这一假设的。因为Speex针对于多种设备,所以它复杂性适度(可调节)并且占用较少内存。

        考虑这些设计目标,我们选用CELP作为编码技术。其中一个主要原因是CELP很早就被证明在低比特率(如4.8kbps的DoD CELP)和高比特率(如16kbps的G.728)都能稳定可靠工作。

1.1  获取帮助

        正如许多开源项目一样,有许多方法可以获取Speex的帮助,包括:

            1)此文档

            2)Speex网站上的其他文档

            3)邮件列表:在speex-dev@xiph.org上于Speex相关主题的讨论(不仅仅针对开发者)

            4)IRC:在irc.freenode.net上的主频道是#speex。注意由于时间的不同,可能需要一些时间联系某人,所以请耐心等待。

            5)私下给作者邮箱jean-marc.valin@usherbrooke.ca发邮件,但仅限于你不想被公开讨论的私人的或精妙的主题。

        在寻求帮助之前(邮件列表或IRC),请最好先阅读本手册(好吧,如果你看到这了,那么这是一个好迹象)。在邮件中讨论已经在手册中具体说明的问题一般是很不礼貌的。另一方面,如果是询问在手册中没有说清楚的问题则是很好地(鼓励)。本手册没有包含Speex的方方面面,所以鼓励每个人问问题,发评论,要求增加的新特性,或简单的让我们知道Speex是如何被使用的。

        再说些附加的关于邮件列表的指引。在你向列表中报告Speex中的bug之前,强烈建议(如果可能)先测试下这些bug在使用speexenc和speexdec命令行工具(见第四章)下是否可复现。基于第三方代码(3rd party code)发布的bug不仅难发现,而且经常是由于与Speex无关的错误引起的。

1.2  关于此文档

        此文档分为如下几章。第二章描述不同的Speex特征并定义此文档中使用的许多术语,第四章描述Speex提供的标准命令行工具,第五章包括用libspeex API编程的具体说明,第七章有Speex相关的信息和标准。

        最后三章描述Speex中所使用的算法。阅读这部分需要信号处理相关知识,但对于仅仅使用Speex则不需要。这部分是为那些对于想了解Speex如何工作或想基于Speex研究的人而准备。第八章解释了CELP后的一般思想,第九和第十章是Speex的一些特性。

2  编解码器描述

        这张具体描述Speex和它的特征。

2.1 概念

        在介绍Speex特征之前,先介绍在语音编码中的一些概念,帮助读者更好地理解手册的剩余部分。尽管其中一些事语音/音频处理中的一般概念,但有些也是Speex中特有的。

        采样率

        采样率是每秒钟采集到的信号样本数,单位是Hertz(Hz)。如果采样率是Fs kHz,则所采样信号的最高频率为Fs/2 kHz(Fs/2被称为奈奎斯特频率)。这是信号处理中的一个基本性质,由采样定理描述。Speex为三种不同的采样率而设计:8kHz,16kHz和32kHz,分别对应窄带,宽带和超宽带。

        比特率

        在对语音信号编码时,比特率定义为单位时间内的比特数,单位是比特每秒(bps)或通常的千比特每秒(kbps)。注意千比特每秒(kbps)和千字节每秒(kBps)的区别。

        质量(可变)

        Speex是有损的编解码器,意味着压缩率以输入语音信号的保真度为代价。不像一些其他的语音编解码器,Speex可以控制质量和比特率之间的折中。Speex编码处理大多数时间由一个范围在0到10之间的质量参数控制。在不变比特率(CBR)中,质量参数是一个整数,在可变比特率(VBR)中,质量参数是一个浮点数。

        复杂度(可变)

        Speex允许编码器拥有可变的复杂度。这通过一个范围在1到10之间的整数控制搜索的执行来实现,类似于gzip和bzip2压缩工具的-1到-9选项。正常使用情况下,复杂度为1的噪声等级比复杂度为10的噪声等级高1到2个dB,但复杂度为10的CPU要求比复杂度为1的高5倍。实际应用中,最好的折中是复杂度2到4,但在编码非语音声音如DTMF声调时更高的复杂度经常被用到。

        可变比特率(VBR)

        可变比特率(VBR)允许编解码器自适应的根据待编码音频的“难度”动态地改变比特率。在Speex例子中,像元音和高能瞬态变化的声音需要高比特率以获得好的质量,但是摩擦音(如s,f)用低比特率就能充分编码。由于这一原因,VBR在相同的质量下能获得更低的比特率,或在不变比特率下获得更好的质量。除了这些优点,VBR有两个主要缺点:第一,在指定质量情况下,无法保证最终的平均比特率;第二,在一些如网络电话(VoIP)这样的实时应用中,依赖于最大比特率,这在通信信道中必须足够低。

        平均比特率(ABR)

        平均比特率解决了VBR中的第一个问题,它动态地调整VBR质量以获得指定的比特率。因为质量和比特率是实时调整的(开环的),ABR的全局质量比正好达到目标平均比特率的VBR编码质量稍微差些。

        声音活动检测(VAD)

        当被激活时,VAD检测待编码的音频是语音还是无声/背景噪声。VAD在VBR编码中默认激活,所以这一选项仅对非VBR编码有效。在这种情况下,Speex检测出非语言段并仅使用足够复现背景噪声的比特率进行编码,这叫“柔化噪音生成”(CNG)。

        断续传输(DTX)

        断续传输室VAD/VBR的附加操作,当背景噪声平稳时会完全停止传输。在基于文件的操作中,既然我们无法停止写文件,则对于平稳背景噪声帧仅用5比特(对应250bps)。

        知觉增强

        知觉增强是解码器的一部分,当被启用时,能减少编解码过程中产生的噪声或失真的知觉。在大多数情况下,知觉增强会带来声音客观上的偏离(如仅考虑SNR),但最后仍听起来更好(主管增强)。

        等待时间和算法延时

        每一个语音编解码器在传输中都会引入延时。对于Speex,延时等于帧长加上处理每一帧需要前几帧的数量。在窄带操作中(8kHz),延时为30ms;在宽带操作中(16kHz)延时为34ms,这不包括编解码帧时的CPU时间。

2.2  编解码器

        Speex的主要特性有:

           1)免费软件/开源,免专利费和版税

           2)利用嵌入比特流集成了窄带和宽带

           3)大范围可用比特率(从2.15kbps到44kbps)

           4)动态比特率转换(AMR)和可变比特率操作(VBR)

           5)声音活动检测(VAD,与VBR集成)和断续传输(DTX)

           6)可变复杂度

           7)嵌入宽带结构(可伸缩采样率)

           8)32kHz超宽带采样率

           9)强度立体声编码选项

           10)定点实现

2.3  预处理器

        这是在1.1.x版本中已经介绍的预处理器模块。预处理器在对音频编码前对音频进行预处理,有三个主要功能:

           1)噪声抑制

           2)自动增益控制·(AGC)

           3)声音活动检测(VAD)

        解码器能减少输入信号的背景噪声。预处理能得到高质量语音,而不管降噪后的信号是否通过Speex编码。然而,先降噪再进行编解码是有好处的,因为Speex编解码器通常会对噪声输入同样进行编解码,这将会扩大噪声,而降噪能大大减少这一影响。

        自动增益控制(AGC)是为了处理录音音量在不同设置里有很大差别这一问题,AGC将会调整信号音量到参考音量大小。这对网络电话时非常有用的,因为这样就不需要手工调节麦克风增益了。第二个好处是若将麦克风增益设置为较低的等级,更容易避免削波。

        预处理器提供的声音活动检测(VAD)比编解码器中直接提供的VAD更先进。

2.4  自适应抖动缓冲器

        当通过UDP(User DatagramProtocal,用户数据报协议)或RTP(Real TimeProtocal,实时传输协议)传输声音(或其他任何内容)时,数据包可能丢失,不同延时到达,甚至乱序。抖动缓冲器的作用是对数据包进行重排序并保存在足够长的buffer(但有一定限度)里,然后将数据包发送去解码。

2.5  声学回声消除器

        在任何免提式通信系统中,远端的语音在本地扬声器播放时,经过在房间里传播后又会被麦克风录音。如果将麦克风录音直接又发送到远端,则远端的用户将会听到他自己的回声。声学回声消除器就是为了在将录音发送到远端前消除声学回声。注意回声消除器意味着提高了远端接收的语音质量。

2.6  重采样器

        在一些情况下,转换音频的采样率是很有用的,原因有很多,如能混合不同采样率流,能支持声卡不支持的采样率,能转码等。这也是为什么现在重采样器也是Speex项目的一部分的原因。重采样器能在任意采样率间进行转换(采样率必须是有理数),能控制质量和复杂度的折中。

3  编译和端口

        在UNIX/Linux或任何其他支持autoconf的平台(如Win32/cygwin)下编译Speex很容易,只需输入

               % ./configure [options]

               % make

               % make install

        Speex配置脚本支持的选项有:

               -prefix=

               -enable-shared/-disable-shared  是否编译共享库

               -enable-static/-disable-static  是否编译静态库

               -disable-wideband  禁用Speex的宽带部分(典型地为了节省空间)

               -enable-valgrind  为调试启用valgrind(一款用于内存调试内存泄漏检测以及性能分析的软件开发工具)额外的匹配记录(默认不启用)

               -enable-sse  启用SSE(StreamingSimd Extensions,指令集)指令(仅支持x86浮点数)

               -enable-fixed-point  为没有浮点单元(FPU)的处理器编译Speex

               -enable-arm4-asm  启用ARMv4结构配置特性(仅支持gcc)

               -enable-arm5e-asm  启用ARMv5E结构配置特性(仅支持gcc)

               -enable-fixed-poin-debug  仅调试定点代码(非常慢)

               -enable-epic-48k  启用特殊(不兼容)的4.8kbps窄带模型(在1.1.x和1.2beta版本中已损坏)

               -enable-ti-c55x  启用对TI C5x系列的支持

               -enable-balckfin-asm  启用Blackfin DSP结构配置特性(仅支持gcc)

               -enable-vorbis-psycho  使编码器使用Vorbis心理音响学模型,这处于试验阶段,将来可能取消

3.1  平台

        Speex可在包括浮点单元和定点单元的许多平台下编译和工作。通常,任何能计算两个16位带符号数乘法(结果是32位)和能在充分地时钟频率下运行(依赖结构)的平台都能运行Speex。已知的Speex的工作平台有(可能还有其他):

        1)x86 & x86-64    2)Power   3)SPARC    4)ARM   5)Blackfin    6)Coldfire(68k系列)   7)TI C54xx & C55xx    8)TI C6xxx    9)TriMedia(试验)

          已知的Speex工作的操作系统有(可能还有其他):

         1)Linux    2)uClinux    3)MacOS X    4)BSD    5)其他UNIX/POSIX变体    6)Symbian

         源代码目录中README.xxx文件包含在某个平台或操作系统下编译的额外信息。

3.2  端口和优化

        以下是在新平台或目前已有平台下配置端口或优化Speex要考虑的一些注意事项。

3.2.1  CPU优化

        最影响Speex的CPU使用的是浮点编译还是定点编译。如果你的CPU/DSP没有浮点单元FPU,则定点编译将更快。如果有FPU,则需要测试以下浮点编译和定点编译哪个快。在x86平台中,浮点编译一般更快。为了对Speex定点编译,你需要输入-fixed-point来配置脚本或为编译器定义FIXED-POINT宏。对于1.2beta3版本,现在能禁用浮点兼容的API,这意味着你的代码无需浮点仿真库即可链接,为了达到这一目的,可以通过-disable-float-api配置或定义DISABLE_FLOAT_API宏。等到VBR特性移植到定点,你将需要通过-disable-vbr配置或定义DISABLE_VBR宏。

        在一些DSP平台中需要核实的一些事有:1)确定高速缓存被设置为回写式模型;2)如果芯片用SRAM代替高速缓存,确认大量代码处于SRAM而不是RAM中。

        如果你要编写汇编,以下函数通常是你必须最先优化的:1)filter_mem16()    2)iir_mem16()    3)vq_nbest()    4)pitch_xcorr()    5)interp_pitch()。滤波器函数filter_mem16()和iir_mem16()应用在转置直接II型(DF2T)。然而对基于乘法累计(MAC)的平台,DF2T需要频繁重装蓄电池,这将使代码非常慢。对于这些平台(如Blackfin和Coldfire),更好的方法是应用这些函数为直接I型(DF1),这在MAC时更容易再装。然而如果这么做,需要确认DF1实现仍能得到像原始DF2T实现一样的滤波器值,这很必要,因为滤波器是时变的并且必须在任何编码器或解码器上直接计算相同的值(不算机器舍入)。

3.2.2  内存优化

        内存优化主要是在一些小的嵌入式平台中需要考虑。对于PC,Speex已经足够小,无需内存优化。有几种方法的减少Speex的内存使用,包括代码大小和数据大小。对于优化代码大小,关键是移除你不需要的特性。以下是禁用一些你不需要的特性的例子:1)宽带支持(-disable-wideband);2)立体声支持(移除stereo.c);3)VBR支持(-disable-vbr或DISABLE_VBR);4)你所使用的比特率不要静态码本(*_table.c文件)

        Speex也有一些配置临时数组的方法。当使用适当支持C99的编译器时(到2007年,微软编译器不支持,gcc支持),最好定义VAR_ARRAYS,以利用C99的可变大小数组这一特性。下一个最好做的是定义USE_ALLOCA以使Speex能用函数alloca()分配临时数组。注意在许多系统中,alloca()可能无效。如果没有定义VAR_ARRAYS和USE_ALLOCA,则Speex将利用它的内部分配分配一大块”可用空间”,这样的主要缺点是浪费。需要为最坏情况(最坏比特率,最高复杂度设置...)分配足够的栈,默认的,在多个编码器/解码器状态之间内存不共享。最后,如果只能“手动”分配,也有一些方法可以提高。通过复写os_support.h中的speex_alloc_scratch(),可以使所有状态总是返回同一块内存(此时必须特别注意线程)。除此之外,通过重新定义NB_ENC_STACK和NB_DEC_STACKA(宽带类似),可以为提前知道的情况分配内存,此时,需要衡量使用的采样率、比特率和复杂度级别所需的内存数量。    

4  命令行编码器/解码器

        Speex最基本的是命令行编码器(speexenc)和解码器(speexdec)。这些工具产生并读取封装在Ogg容器内的Speex文件。尽管能在任意容器内封装Speex,但Ogg是文件命令行容器。这一部分介绍如何在Ogg中为Speex文件使用命令行工具。

4.1  speexenc

        speexenc的作用是从未加工的PCM文件或wave文件生成Speex文件。可通过如下调用:

                speexenc[options] input_file output_file

        input_file或output_file的‘-’值分别对应标准输入和标准输出。有效的选项有:

                -narrowband(-n)   告诉Speex默认将输入视为窄带(8kHz)

                -wideband(-n)  告诉Speex将输入视为宽带(16kHz)

                -ultra-wideband(-u) 告诉Speex将输入视为超宽带(32kHz)

                -quality n  设置编码质量(0-10),默认为8

                -bitrate n  编码比特率(比特率将小于等于n)

                -vbr n  启用VBR(可变比特率),默认禁用

                -abr n  启用ABR(平均比特率)为n kbps,默认禁用

                -vad  启用VAD(声音活动检测),默认禁用

                -dtx  启用DTX(断续传输),默认禁用

                -nrames n  每个Ogg数据包包含n帧(这在低比特率时能节省空间)

                -comp n  设置编码速度和质量的折中,n值越大,编码速度越慢(默认为3)

                -V    详细的操作,输出所使用的比特率

                -help(-h)  输出帮助

                -version(-v) 输出版本信息

       Speex注释

                -comment  增加给定的字符串为额外的注释,这可能花费几倍时间

                -author  声道作者

                -title  声道标题

        原始输入选项

                -rate n  原始输入的采样率

                -stereo  将原始输入视为立体声

                -le  原始输入为小头(little-endian,高位字节放在高地址单元)

                -be  原始输入为大头(big-endian,高位字节放在低地址单元)

                -8bit  原始输入为8位无符号数

                -16bit  原始输入为16位有符号数

4.2  speexdec 

        speexdec用于解码Speex文件,可通过如下调用

                speexdec[options] speex_file [output_file]

        input_file或output_file的值‘-’分别对应标准输入和标准输出。若没有指定output_file,则文件通过声卡播放。有效的选项有:

                -enh  启用后置滤波(默认)

                -no-enh  禁用后置滤波

                -force-nb  强制窄带解码

                -force-wb  强制宽带解码

                -force-uwb  强制超宽带解码

                -mono 强制单声道解码

                -stereo  强制立体声解码

                -rate n  强制解码采样率为n Hz

                -packet-loss n  模拟n%随机包丢失

                -V  详细操作,输出使用的比特率

                -help(-h)  输出帮助

               -version(-v)  输出版本信息

5  Speex编解码器API(libspeex)

        libspeex库包含所有使用Speex编解码器对语音编码和解码的函数。若在UNIX系统中链接,需要在编译器命令行中加入-lspeex-lm。注意libspeex的调用时可重入的,但不是线程安全的。这意味着可以在多个线程中条用,但多个线程间对同一状态的调用需要互斥锁保护。代码示例参见附录A,完整的API文档可在Speex网站的文档部分找到(http://www.speex.org/)。

5.1 编码

        在用Speex编码语音之前,首先需要包括头文件:

                #include

        然后在代码中,必须声明一个Speex位封装结构和一个Speex编码状态:

               SpeexBits bits;

                void *enc_state;

       然后需要两个初始化:

               speex_bits_init(&bits);

               enc_state = speex_encoder_init(&speex_nb_mode);

对于宽带编码,speex_nb_mode替换为speex_wb_mode。大多数情况下,你需要知道所使用采样率的帧长,可通过变量frame_size获得(单位是样本数,而不是字节):

                speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&frame_size);

实际应用中,当用8,16或32kHz采样率是frame_size通常为20ms。Speex编码器可设置许多参数,但最有用的是控制质量和比特率折中的质量参数:

               speex_encoder_ctl(enc_state,SPEEX_SET_QUALITY,&quality);

其中quality是一个0到10之间的整数(包含10)。图9.2描述了窄带时质量和比特率之间的关系。

        初始化之后1,对于每一输入帧:

               speex_bits_reset(&bits);

               speex_encode_int(enc_state,input_frame,&bits);

                nbBytes= speex_bits_write(&bits,byte_ptr,MAX_NB_BYTES);

其中input_fram是一个short *指针,只想一个语音帧的开始位置;byte_ptr是一个char *指针,指向将被写的已编码帧;MAX_NB_BYTES是在无溢出情况下能写到byte_ptr的最大字节数;nbBytes是实际写到byte_pte的字节数(已经编码的字节数)。在调用speex_bits_wrtie之前,可通过调用speex_bits_nbytes(&bits)获得需要被写的字节数,返回这一字节数。

        也可以使用speex_encode()函数,返回一个指向音频的float *指针。然而这将使得没有FPU的平台(如ARM)最后端口更难懂。在内部,speex_encode()和speex_encode_int()是以相同的方式处理的。编码器是否使用定点版本仅由编译时间标志决定,而不是API级别。

       在完成编码之后,释放资源:

               speex_bits_destroy(&bits);

               speex_encode_deatroy(enc_state);

        以上是编码器部分。

5.2  解码器

        在用Speex解码语音之前,首先需要头文件:

                #include

        你也需要声明一个Speex位封装结构和一个Speex解码状态:

               SpeexBitsbits;

                void * dec_state;

        然后进行初始化:

               speex_bits_init(&bits);

               dec_state = speex_decoder_int(&speex_nb_mode);

对于宽带解码,speex_nb_mode替换为speex_wb_mode。若需要获得解码器将使用的帧大小,可通过变量frame_size(单位是样本数,而不是字节数)获得:

               speex_decoder_ctl(dec_state,SPEEX_GET_FRAME_SIZE,&frame_size);

         解码器同样有一个参数可以设置:是否启用知觉增强:

               speex_decoder_ctl(dec_state,SPEEX_SET_ENH,&enh);

其中enh初始化为0则禁用知觉增强,值为1则启用。对于1.2-beta1版本,默认启用知觉增强。

         解码初始化后,对每一输入帧:

                speex_bits_read_from(&bits,input_bytes,nbBytes);

                speex_decode_int(dec_state,&bits,output_frame);

其中input_bytes是一个包含一帧接收到的比特流数据的char*指针;nbBytes是比特流的大小(字节);output_frame是一个short*型指针,指向解码语音将被写入的区域。若第二个参数值为NULL,则表明当前帧没有比特。当有一帧丢失时,Speex解码器将尽量“猜测”正确的信号。

         跟编码器一样,speex_decode()函数也可以使用,返回一个指向输出音频的float*型指针。在完成解码后,要释放资源:

                 speex_bits_destroy(&bits);

                 speex_decoder_destrpy(dec_state);

5.3  编解码器选项(speex_*_ctl)

        Speex编码器和解码器支持许多选项,可通过speex_encoder_ctl和speex_decoder_ctl函数设置。这些函数类似于输入输出系统函数调用,他们的原型是:

                void speex_encoder_ctl(void *encoder,int request,void *ptr);

                void speex_decoder_ctl(void *decoder,int request,void *ptr);

        尽管有许多设置函数,但是对于许多应用默认设置一般足够,仅当使用者理解了这些设置并需要时才需设置选项。一个常见错误是设置了许多没必要的设置。

        以下是一个允许请求设置值得列表,其中一些仅适用于编码器或解码器。由于最后一个参数是void*型的,所以_ctl()函数不是类型安全的,需要小心使用。类型spx_int32_t同等于C99中的类型int32_t。

                SPEEX_SET_ENH:设置知觉增强为开(1)或关(2)(spx_int32_t型,默认为开,仅用于解码器)

                SPEEX_GET_ENH:获取知觉增强状态(spx_int32_t型,仅用于解码器)

                SPEEX_GET_FRAME_SIZE:获取当前模式下每帧的样本数(spx_int32_t型)

                SPEEX_SET_QUALITY:设置编码器语音质量(spx_int32_t型,从0到10,默认为8,仅用于编码器)

                SPEEX_GET_QUALITY:获取当前编码器语音质量(spz_int32_t型,从0到10,仅用于编码器)

                SPEEX_SET_MODE:设置模型数字,同RTP规格里指定(spx_int32_t型,仅用于编码器)

                SPEEX_GET_MODE:获取当前模型数字,同RTP规格里指定(spx_int32_t型,仅用于编码器)

                SPEEX_SET_VBR:设置变比特率(VBR)为开(1)或关(0)(spx_int32_t型,默认为关,仅用于编码器)

                SPEEX_GET_VBR:获取变比特率(VBR)状态(spx_int32_t型,仅用于编码器)

                SPEEX_SET_VBR_QUALITY:设置编码器VBR语音质量(浮点型,从0.0到10.0,默认为8.0,仅用于编码器)

                SPEEX_GET_VBR_QUALITY:获取当前编码器VBR语音质量(浮点型,从0.0到10.0,仅用于编码器)

                SPEEX_SET_COMPLEXITY:设置分配给编码器的CPU资源(spx_int32_t型,从1到10,默认为2,仅用于编码器)

                SPEEX_GEY_COMPLEXITY:获取分配给编码器的CPU资源(spx_int32_t型,从1到10,默认为2,仅用于编码器)

                SPEEX_SET_BITRATE:设置比特率为不超过参数的最近整数值(SPX_INT32_t型,单位比特每秒,仅用于编码器)

                SPEEX_GET_BITRATE:获取当前比特率(spx_int32_t型,单位比特每秒,仅用于编码器)

                SPEEX_SET_SAMPLING_RATE:设置实际采样率(spx_int32_t型,单位Hz)

                SPEEX_GET_SAMPLING_RATE:获取实际采样率(spx_int32_t型,单位Hz)

                SPEEX_RESET_STATE:重置编码器/解码器状态为初始状态,清空所有内存(不推荐)

                SPEEX_SET_VAD:设置声音活动检测(VAD)为开(1)或关(0)(spx_int32_t型,默认为关,仅用于编码器)

                SPEEX_GET_VAD:获取声音活动检测(VAD)状态(spx_int32_t型,仅用于编码器)

                SPEEX_SET_DTX:设置断续传输(DTX)为开(1)或关(0)(spx_int32_t型,默认为关,仅用于编码器)

                SPEEX_GET_DTX:获取断续传输(DTX)状态(spx_int32_t型,仅用于编码器)

                SPEEX_SET_ABR:设置平均比特率(ABR)为n(spx_int32_t型,单位比特每秒,仅用于编码器)

                SPEEX_GET_ABR:获取平均比特率(ABR)设置(spx_int32_t型,单位比特每秒,仅用于编码器)

                SPEEX_SET_PLC_TUNING:告诉编码器对一个包丢失百分比进行优化编码(spx_int32_t型,百分数,仅用于编码器)

                SPEEX_GET_PLC_TUNING:获取PLC编码的当前调谐(spx_int32_t型,百分数,仅用于编码器)

                SPEEX_SET_VBR_MAX_BITRATE:设置VBR操作中允许的最大比特率(spx_int32_t型,单位比特每秒,仅用于编码器)

                SPEEX_GET_VBR_MAX_BITRATE:获取当前VBR操作中允许的最大比特率(spx_int32_t型,单位比特每秒,仅用于编码器)

                SPEEX_SET_HIGHPASS:设置高通滤波器为开(1)或关(0)(spx_int32_t型,默认为开)

                SPEEX_GET_HIGHPASS:获取当前高通滤波器状态(spx_int32_t型)

5.4  模式查询

        Speex模式查询类似于speex_encoder_ctl和speex_decoder_ctl函数调用。因为模式是只读的,所以仅能获取一个特别模式的信息。函数调用如下:

                voidspeex_mode_query(Speexmode *mode, int request, void *ptr);

        其中request可允许的值有(除非特别声明,这些值通过指针ptr返回):

                SPEEX_MODE_FRAME_SIZE 获取模式的帧大小(样本数)

                SPEEX_SUBMODE_BITRATE 通过ptr获取子模式比特率(整数,单位bps)

5.5  封包和带内信号

        有时期望每个数据包(或其他基本存储单元)不止包含一帧,此时可在调用speex_bits_write写数据流之前调用speex_encode N次来实现。若每个包的帧数不是由带外机制决定,则可以包含一个终止码。终止码用5位对代码15(十进制)编码,如表9.2所示。注意对于1.0.2版本,调用speex_bits_write自动插入终止码来填充最后一字节,这样没有任何其他费用并保证包里没有更多帧时Speex能准确检测到。

        可以发送带内信息到另一端。这些信息之前加入一个包含4位信息类型代码的模式14的“伪帧”。表5.1列出了可能的代码,包含他们的意义和信息大小。大多数信息是要发送到另一端编码器或解码器的请求,可以自由接受或无视这些请求。默认的,无视所有带内信息。

        最后,应用可以用代码13定义常用带内信息,信息字节大小用5位编码,解码器若不知如何解码则可以跳过它。

6  语音处理API(libspeexdsp)

        对于1.2beta3版本,Speex中的非编解码部分单独分离成libspeexdsp库,包括预处理器,声学回声消除器,抖动缓冲器和重采样器。在UNIX环境下,可通过在编译器命令行中添加-lspeexdsp -lm链接到你的程序中。正如libspeex,libspeexdsp调用时可重入的,但不是线程安全的,这意味着可以在多线程中使用,但多线程中对同一状态的调用必须由互斥锁保护。

6.1 预处理器

        调用Speex预处理器之前,首先需要头文件

                #include

        然后,创建预处理器状态:

               SpeexPreprocessState *preprocess_state =speex_preprocess_state_init(frame_size,sampling_rate);

推荐frame_size的大小同编码器中的一样,为20ms。

        对于每一输入帧,需要调用:

               speex_preprocess_run(preprocess_state, audio_frame);

其中audio_frame可为输入或输出。若不需要输出处理后的数据,可调用以下函数替代:

               speex_preprocess_eatimate_update(preprocess_state, audio_frame);

这一函数会更新预处理器内部状态变量而无需计算输出音频,节省CPU周期。

        预处理器参数可以改变,通过调用:

               speex_preprocess_ctl(preprocess_state, request, ptr);

调用方法同编码器和译码器中的一样,选项在6.1.1中列出。

        最后,销毁预处理器状态:

               speex_preprocess_state_destroy(preprocess_state);

6.1.1  预处理器选项

        同编解码器一样,预处理选项可通过函数控制。可用选项有:

                SPEEX_PREPROCESS_SET_DENOISE 开启(1)或关闭(2)降噪(spx_int32_t型)

               SPEEX_PREPROCESS_GET_DENOISE  获取降噪状态(spx_int32_t型)

               SPEEX_PREPROCESS_SET_AGC  开启(1)或关闭(2)自动增益控制(AGC)(spx_int32_t型)

                SPEEX_PREPROCESS_GET_AGC 获取AGC状态(spx_int32_t型)

               SPEEX_PREPROCESS_SET_VAD  开启(1)或关闭(2)声音活动检测(VAD)(spx_int32_t型)

                SPEEX_PREPRECESS_GET_VAD 获取VAD状态(spx_int32_t型)

                SPEEX_PREPROCESS_SET_AGC_LEVEL

                SPEEX_PREPROCESS_GET_AGC_LEVEL

                SPEEX_PREPROCESS_SET_DEREVERB 开启(1)或关闭(2)混响消除(spx_int32_t型)

                SPEEX_PREPROCESS_GET_DEREVERB 获取混响消除状态(spx_int32_t型)

               SPEEX_PREPROCESS_SET_DEREVERB_LEVEL  暂时不可用

                SPEEX_PREPROCESS_GET_DEREVERB_LEVEL 暂时不可用

                SPEEX_PREPROCESS_SET_DEREVERB_DECAY 暂时不可用

                SPEEX_PREPROCESS_GET_DEREVERB_DECAY 暂时不可用

                SPEEX_PREPROCESS_SET_PROB_START

                SPEEX_PREPROCESS_GET_PROB_START

                SPEEX_PREPROCESS_SET_PROB_CONTINUE

                SPEEX_PREPROCESS_GET_PROB_CONTINUE

                SPEEX_PREPROCESS_SET_NOISE_SUPPRESS 设置最大噪声衰减,单位dB(负spx_int32_t型)

                SPEEX_PREPROCESS_GET_NOISE_SUPPRESS 获取最大噪声衰减,单位dB(负spx_int32_t型)

                SPEEX_PREPROCESS_SET_ECHO_SUPPRESS 设置最大残余回声衰减,单位dB(负spx_int32_t型)

                SPEEX_PREPROCESS_GET_ECHO_SUPPRESS 获取最带残余回声衰减,单

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭