刘品
学以致用---博主简介:专注语音数字信号处理方面的研究以及算法在手机平台上面的移植和优化。涉及语音/音频编解码,语音增强,语音识别,语音音质客观评估,VOIP语音引擎 Qos算法模块和声音变速不变调和变调不变速等功能实现。熟悉ARM 各个系列的CPU,用ARMv4,ARMv5,ARMv6 and Cortex Neon 汇编优化相关算法代码,争取perforamance 最优。目前主要Windows mobile and Android platform上做相关speech/audio算法以及应用开发。(交流Email:liupin.2008@gmail.com)
posts - 306,comments - 352,trackbacks - 1
各种各样的编解码在各种领域得到广泛的应用,下面就把各种codec的压缩率进行一下比较,不正确之处望各位同行指正。
Speech codec:
    现主要有的speech codec 有: G.711, G.723, G.726 , G.729, ILBC
                                           QCELP, EVRC, AMR, SMV

   主要的audio codec 有:
                               real audio, AAC, AC3, MP3, WMA, SBC等,各种编解码都有其应用的重点领域。

   本文主要对speech codec相关指标进行总结:
   ITU 推出G.7XX系列的speech codec, 目前广泛应用的有:G.711,G.723, G.726, G.729. 每一种又有很多分支,如G.729就有g.729A, g.729B and g.729AB

  G.711:
            G.711就是语音模拟信号的一种非线性量化,细分有二种:G.711 A-law and G.711 u-law.不同的国家和地方都会选取一种作为自己的标准. G.711 bitrate 是64kbps. 详细的资料可以在ITU 上下到相关的spec,下面主要列出一些性能参数:
    G.711(PCM方式:PCM=脉码调制 :Pulse Code Modulation)
• 采样率:8kHz
• 信息量:64kbps/channel
• 理论延迟:0.125msec
• 品质:MOS值4.10               
 
 G.723.1:
        G.723.1是一个双速率的语音编码器,是 ITU-T建议的应用于低速率多媒体服务中语音或其它音频信号的压缩算法;
其目标应用系统包括H.323、H.324等多媒体通信系统,目前该算法已成为IP电话系统中的必选算法之一;编码器的帧长为30ms,还有7.5ms的前瞻,编码器的算法时延为37.5ms;编码器首先对语音信号进行传统电话带宽的滤波(基于G.712),再对语音信号用传统8000-Hz速率进行抽样(基于G.711),并变换成16 bit线性PCM码作为该编码器的输入;
在解码器中对输出进行逆操作来重构语音信号;高速率编码器使用多脉冲最大似然量化(MP-MLQ),低速率编码器使用代数码激励线性预测(ACELP)方法,编码器和解码器都必须支持此两种速率,并能够在帧间对两种速率进行转换;
此系统同样能够对音乐和其他音频信号进行压缩和解压缩,但它对语音信号来说是最优的;采用了执行不连续传输的静音压缩,这就意味着在静音期间的比特流中加入了人为的噪声。除了预留带宽之外,这种技术使发信机的调制解调器保持连续工作,并且避免了载波信号的时通时断。
 
G.726:
       G.726有四种码率:, 32, 24, 16 kbit/s Adaptive Differential Pulse Code Modulation (ADPCM),最为常用的方式是 32 kbit/s,但由于其只是 G.711速率的一半,所以可将网络的可利用空间增加了一倍。G.726具体规定了一个 64 kbpsA-law 或 µ-law PCM 信号是如何被转化为40, 32, 24或16 kbps 的 ADPCM 通道的。在这些通道中,24和16 kbps 的通道被用于数字电路倍增设备(DCME)中的语音传输,而40 kbps 通道则被用于 DCME 中的数据解调信号(尤其是4800 kbps 或更高的调制解调器)。
G.726 encoder 输入一般都是G.711 encoder的输出:64kbps A-law or u-law.其算法实质就是一个ADPCM, 自适应量化算法。    

G.729:
    G..729语音压缩编译码算法
采用算法是共轭结构的代数码激励线性预测(CSACELP),是基于CELP编码模型的算法;能够实现很高的语音质量(长话音质)和很低的算法延世;算法帧长为10ms,编码器含5ms前瞻,算法时延15ms;其重建语音质量在大多数工作环境下等同于32kb/s的ADPCM(G.726),MOS分大于4.0;编码时输入16bitPCM语音信号,输出2进制比特流;译码时输入为2进制比特流,输出16bitPCM语音信号;在语音信号8KHz取样的基础上,16bit线性PCM后进行编码,压缩后数据速率为8Kbps;具有相当于16:1的压缩率。
    G.729系列在当前的VOIP得到广泛的应用,且相关分支较多,可以直接从ITU网上得到source code 和相关文档。
   G.729(CS-ACELP方式:Conjugate Structure Algebraic Code Excited Linear Prediction)
• 采样率:8kHz
• 信息量:8kbps/channel
• 帧长:10msec
• 理论延迟:15msec
• 品质:MOS值3.9

iLBC(internet low bitrate codec):
         是全球著名语音引擎提供商Global IP Sound开发,它是低比特率的编码解码器,提供在丢包时具有的强大的健壮性。iLBC 提供的语音音质等同于或超过 G.729 和 G.723.1,并比其它低比特率的编码解码器更能阻止丢包。iLBC 以13.3 kb/s (每帧30毫秒)和15.2 kb/s (每帧20毫秒)速度运行,很适合拨号连接。
         iLBC的主要优势在于对丢包的处理能力。iLBC独立处理每一个语音包,是一种理想的包交换网络语音编解码。在正常情况下,iLBC会记录下当前数据的相关参数和激励信号,以便在之后的数据丢失的情况下进行处理;在当前数据接收正常而之前数据包丢失的情况下,iLBC会对当前解码出的语音和之前模拟生成的语音进行平滑处理,以消除不连贯的感觉;在当前数据包丢失的情况下,iLBC会对之前记录下来的激励信号作相关处理并与随机信号进行混合,以得到模拟的激励信号,从而得到替代丢失语音的模拟语音。总的来说,和标准的低位速率编解码相比,iLBC使用更多自然、清晰的元素,精确的模仿出原始语音信号,被誉为更适合包交换网络使用的可获得高语音质量的编解码。
  此外,大部分标准的低位速率编解码,如G.723.1和G.729,仅对300Hz——3400Hz的频率范围进行编码。在这个频率范围里,用G.711编解码所达到的语音质量,就是传统PSTN网络进行语音通话的效果。
  iLBC充分利用了0——4000Hz的频率带宽进行编码,拥有超清晰的语音质量,这大大超出传统300Hz——3400Hz的频率范围。
  广受欢迎的Skype网络电话的核心技术之一就是iLBC语音编解码技术,Global IP Sound称该编码器语音品质优于PSTN,而且能忍受高达30%的封包损失。
  总的来说,在相同的包交换通信条件下,iLBC的语音质量效果比G.729、G.723.1以及G.711更好,声音更加圆润饱满,且丢包率越高,iLBC在语音质量上的优势就越明显!
  目前,在国际市场上已经有很多VoIP的设备和应用厂商把iLBC集成到他们的产品中。如:Skype, Nortel等。在国内市场上,目前尚无VoIP厂家正式推出支持“iLBC”的网关设备,迅时公司 率先推出支持“iLBC”的中继网关和IAD设备。
     
更多资料你链接:
www.itu.int
http://www.ilbcfreeware.org/documentation.html#presentations
http://itbbs-arch.pconline.com.cn/topic.jsp?tid=2648071
http://bbs.sdgb.cn/ShowThread.aspx?PostID=11843

http://en.wikipedia.org/wiki/G.726
http://www.itu.int/rec/T-REC-G.726/e


    
   
      
posted on 2008-06-20 02:49 刘品 阅读(10319) 评论(28) 编辑 收藏

FeedBack:
2008-08-07 09:12 | speech codec[未注册用户]
经过向版主请教与speech codec相关的知识后,真是学到了很多东西啊,版主对speech codec相关的算法和特定的平台移植和优化工作经验十分丰富啊!
特此回帖表谢意!

 回复 引用   
#2楼[楼主]
2008-08-07 23:10 | 刘品      
本blog能对你有所帮助,也是我的目的啊,通过与大家的交流,我也对相关知识得到更为深入的认识,希望将来继续交流相关问题。
 回复 引用 查看   
2008-08-31 23:58 | 1111111111111[未注册用户]
您好,我是北京的一名大学生 有些关于Speech codec的问题想向您请教一下可以吗
你有qq吗 我的是289671627

 回复 引用   
#4楼[楼主]
2008-09-01 20:43 | 刘品      
欢迎就相关问题来交流,QQ:459927436.只有晚上或周末才有空聊天.
 回复 引用 查看   
2008-11-29 13:59 | 音频工作者[未注册用户]
楼主,你好!

你能不能对G.711, G.722,G.722.1,G.722.2, G.723.1, iLBC detail information introduce, include input type and frame length, algorithm delay, such as G.722.1: input signal audio sample rate have two, 16KHz and 32KHz, have support 24kbit/s, 32kbit/s and 48kbit/s, algorithm delay:40ms. and so on,

thanks!

 回复 引用   
#6楼[楼主]
2008-12-01 11:51 | 刘品      
good idea!

 回复 引用 查看   
2008-12-05 11:24 | Hello1111[未注册用户]
楼主,

太强了。请问一下,iLBC 编码语音的MOS分是多少?

谢谢!

 回复 引用   
#8楼[楼主]
2008-12-05 12:18 | 刘品      
测试过,iLBC在13.3kbit/s,没掉包的情况下,MOS:3.97,
15.2kbit/s,没掉包的情况下,MOS:4.01.


注:MOS:4.5是满分.

 回复 引用 查看   
2009-03-27 23:46 | 未注册[未注册用户]
目前ITU-T最新的是G.729.1; 3GPP最新的是AMR-WB和AMR-WB+;3GPP2最新的是VMR-WB。audio还有诸如MS/IMA/OKI ADPCM, dts和ac3plus等等太多啦,realaudio又包含了很多音频格式,最新的ra实际用的是aac-lc和he-aac。speech codec目前的发展趋势基本有两个:变速率和宽带语音甚至音频化,有与audio codec融合的趋势,典型的如G.729.1, AMR-WB+等。audio codec则是低码率化和支持更多声道。3GPP和3GPP2的变速率实际上走的是不同的技术路线,3GPP2的speech codec从EVRC开始引入噪声抑制模块算是一大特色。等等等等,这些科普的东西实在太多啦,懒得说了。
楼主能否共享一些有实际价值的东西?比如实际使用中的G.729AB是如果打包的?qcelp8k在cdma中的码流格式?ILBC定点化等等。毕竟标准本身到处可以下载,而实际应用中用到的才是真正有价值的。

 回复 引用   
2009-08-13 15:28 | goldenpark[未注册用户]
因为工作关系google了半天,看到了楼主这篇博客,想请教您一些关于将g.726或者g.729往ARM上移植的问题。
因为初次接触,所以不知道怎么进行整个过程,有了源代码(应该是windows下的)之后应该进行一些什么工作呢。。。
是需要找到linux下能用的源代码么?之后编译出一些库文件,在程序中调用么?
望您赐教啊!!!

 回复 引用   
#11楼[楼主]
2009-08-13 15:57 | 刘品      
pc上能跑通的Code,还是比较容易porting 到linux。你要先明白application layer 怎么调用g.729 Codec DLL,这也是API接口定义问题。
如:你定义API有三个function:
init()
frame_enc/dec()
uninit()

你的G.729 codec也做成这三上接口,把这三个函数extern出来,做出DLL or .so/.a。 application 就能调用G.729 Codec.


 回复 引用 查看   
2009-11-20 10:25 | yuxiao100      
你好我最近也在把开源的ILBC算法移植到ARM上,也需要定点转换。
看到你做了类似的工作,是否可以指点一下?
我在上海。可以交流吗?谢谢

 回复 引用 查看   
#13楼[楼主]
2009-11-20 12:04 | 刘品      
欢迎就相关问题来交流,QQ:459927436.只有晚上或周末才有空聊天.

 回复 引用 查看   
2010-04-16 11:48 | microzhang      
请问一下
iLBC 可以优化或处理所有的这些, 由网络引发的问题吗?:
电路噪声:

频率相关失真:模拟线路(如modem)对不同频率信号具有不同的电传递特性,如有些传递快而另一些慢;

延迟:说话者开始说话到听者听到声音的时间;

抖动:分组到达间隔不规则造成;

回声:听到自己的声音的延迟超过25ms(即25ms后听到自己的声音)就可能引起通话不畅;

随机位偏差:如分组传递出错,这将造成整个分组丢弃并重传;

突发误差:如分组丢失;

量化、codec失真:

 回复 引用 查看   
#15楼[楼主]
2010-04-16 14:05 | 刘品      
hi, microzhang

你列举的网络引发的问题,有的我了解过,有的还不怎么了解。但所以的都要一个codec来解决是不可能的。如延时有很多组成部分,如codec本身的延时,还有网络的延时,还有一些application应用不当也会有延时,如work buffer开得过大。还有就是packet loss问题,如只有少量的包丢失,是可以很好的隐藏,但多了再好的codec技术也能隐藏的,听得还是不舒服或出现断接现象。
至于codec量化失真,这个不要去考虑,因为losser codec都会有失真,只是这个失真我们很难于发觉的。

 回复 引用 查看   
2011-07-25 12:46 | 不再让你孤单      
楼主,我现在在做AMR转G.711的转换,使用3GPP TS26.073提供的code转换,转出来的声音通过加wave头后,听不到,请指教。

我直接从网络上采下来的G.711数据,加wave头就可以播放出来。

 回复 引用 查看   
#17楼[楼主]
2011-07-26 09:59 | 刘品      
@不再让你孤单
首先要弄清楚AMR和G.711格式。 AMR转G.711应该要二个过程:1) AMR ---> linear PCM, linear PCM ---> G.711 encoder就转成了G.711数据。

3GPPTS26.073 可以将AMR decoder成PCM, 这个加wave头肯定能听到声音,直接render出来了。你听不到,说明你那弄错了。

G.711数据,要经过G.711 decoder变成linear pcm后,才能送到render,你就能听得到的。

 回复 引用 查看   
2011-07-26 14:00 | 不再让你孤单      
@刘品
楼主,这个问题困惑我很久了,希望你能帮帮我...
我把大致情况说一下:
我采集的AMR数据是从移动通信基于IP承载的核心网上取下来的,传送格式如下:

AMR
NBUP
RTP
UDP
IP

目前AMR帧的类型是Frame type 7, AMR codec mode=12.2kbps, class A,B,C=81,103,60 (一共244bit)

传送格式在3GPP TS25.415中定义。

我从网络上将IP报文采下来后,将AMR数据从IP报文中分拣出来,由于在网络上传送的AMR数据根据语音bit的重要性调整了传送顺序(按CLASS A,B,C分类),
因此我将这些bit数序按照 3GPP 26.101 Table B.8 恢复成正常的顺序,就是:bit0...bit243的正常顺序。

然后我按照3GPP TS26.073 6.3的要求,生成bitstream file,在使用TS26.073提供的decoder工具,将 语音bitstream文件转换成PCM格式。

最后我自己在给这个PCM文件加上wav头,使用mp3播放。

这里有一点我不太确定的地方:
由于AMR使用了静音压缩,在语音帧之间会出现SID_FIRST 和SID_UPDATE 帧,在NO DATA期间,我使用NO_DATA帧进行了填充,不知道这样对不对?

在生成的wav文件里,在静音压缩这段时间,我什么也听不见,在有语音数据这段时间,我能听到似乎是背景噪声,但听不到语音,不知道为什么?

我可以把代码发给你帮我看看吗?这个邮箱 liupin.2008@gmail.com 是否可以?谢谢。

 回复 引用 查看   
#19楼[楼主]
2011-07-26 21:17 | 刘品      
@不再让你孤单
首先看bitstream file 是不是对的,我想原因很大可能是出在这。你可以把你dump出的bitstream file给我一个,发到邮箱,我可以抽空帮你看看。

 回复 引用 查看   
2011-07-27 13:17 | 不再让你孤单      
@刘品
楼主,邮件给你了,请查收,多谢帮助。

 回复 引用 查看   
2011-08-17 17:34 | ajaxhe      
楼主,想请教你个问题。
windows下如何对G.711进行解码呢?
一些网友说,对G.711加上wave头就可以播放出来。
那这个wave头要如何加呢?
加上wave头后,又如何解码呢?

初涉音频方面,还请楼主帮忙解个惑~
谢谢~

 回复 引用 查看   
2011-08-17 18:29 | yangsuper      
楼主,您好!我刚接触AMR-WB,因为项目时间比较紧张,我现在需要将从ITU上下载的26.173的源代码在vc下编译且仿真通过,我对AMR的标准不熟悉,不知道怎么使用ITU的这个源代码,希望得到您的指点。可以加您的QQ:459927436详细聊吗?
 回复 引用 查看   
#23楼[楼主]
2011-08-17 21:57 | 刘品      
@ajaxhe
G711 就是A-law和u-law非线性压缩。bit rate是64kbps. G711数据往往是包装成wave 格式,在fmt chunk里有ID显示数据是G711,但要播放出来还要是经过G711 decoder, 但这个filter windows下都有自带。你不用自带自己写一个G711 decoder 都是相当容易的事。

 回复 引用 查看   
#24楼[楼主]
2011-08-17 21:58 | 刘品      
@yangsuper
AMR-WB 的代码现在大部分都是用3gpp上的代码. 如仅仅是在PC上用,那自己封装一下API,用起来还是很方便的。如是在嵌入式平台上用,那还是要花点时间去优化和整合一下。

 回复 引用 查看   
2011-08-19 09:01 | ajaxhe      
楼主,你好,还有个关于g.711和AAC编码的选择问题。
我的音频采集卡的采样率是8KHz-16KHz,采样精度是16bits。采样频率低的情况下,是否有必要使用AAC这种高级的压缩算法呢?
我算了下,如果是我的音频采集卡的话,码率大概在128kbps,使用g.711就可以解决。而一般的AAC文件的码率最低也有128kbps。所以,使用AAC会不会有杀鸡用牛刀的感觉。

以上是本人的拙见,初涉音频编解码,还请楼主赐教。

 回复 引用 查看   
#26楼[楼主]
2011-08-29 17:28 | 刘品      
@ajaxhe
关于codec 选择,这个要根据应用来的。主要考虑以下三点:
1) 音频的采样率,如语音的一般是8KHz,或16KHz,这时往往选G7XX,或AMR_NB/WB, QCELP, or EVRC等Voice codec; 音频一般是44.1KHz, 这个往往要用AAC, MP3
2) 对码率的要求也就是带宽, 你应该对现有的codec,码率是多少应该要用全面的了解。
3) Codec算法复杂度,这个主要考虑CPU loading,如在PC上的应用,这一点可能不要考虑,但在嵌入式平台上这个就不得不考虑。

 回复 引用 查看   
2011-08-30 15:15 | ajaxhe      
谢谢楼主,受教了~
 回复 引用 查看   
2012-01-02 16:15 | shenli[未注册用户]
楼主,你好;
请问有了音频数据,如何判断音量的大小?
不同的音频文件音量相差较大,我们要做一下控制;

 回复 引用   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1224287 jhYx1Bdsnbw=