audio/speech codec(音频/语音编解码器)之我见
codec吧
全部回复
仅看楼主
level 4
BJUTWang 楼主
我在音频/语音编解码领域已工作四年,来水个贴,随便聊聊audio和speech编解码器。
2016年06月11日 11点06分 1
level 4
BJUTWang 楼主
先说编解码器的那些事儿。编解码器的目的,一句话,都是为了实现信息压缩,其手段有两种,一般混搭使用:一,减少冗余信息,比如huffman编码,数字编码等熵编码。二,提取并忽略不重要的细节信息,大部分图片视频语音音频编解码器都是如此。为啥jpg压缩后的图片没有原来清晰?为啥mp3的质量不如CD?就是因为一些细节在接受范围内被忽略了。别忘了jpg往往比原始bmp小10倍以上,mps比原始的wav或pcm也小10倍以上,能用十分之一的数据包含原始资料的大部分信息,已经很了不起了。
2016年06月11日 11点06分 2
level 4
BJUTWang 楼主
编解码器的分类。
从用途上讲,codec分为音频codec,语音codec,图像codec,视频codec以及其他数据的codec。这些从名字上就能看出他们的用途,可能大部分人会迷惑音频和语音codec的区别,音频,指的是音乐或自然环境中各种各样的声音,而语音则纯粹是人说的话的录音(废话,不都是用来听的么?。。。),这两种codec原理是非常不一样的,后面再讲述。
从实时性上讲,有实时codec和非实时codec,前者针对的是数据的实时传输,如打电话时,手机中的语音codec就能把你刚刚说的0.05秒的语音encode,发给对方,对方也立马decode出来,就听到了你的话,这个过程每0.05秒重复一次,这就是实时codec。非实时codec用于信息的存储,如MP3 codec,可以让你用同样大小的硬盘存储十倍以上的歌曲。
从信息损失上讲,分为有损codec和无损codec,有损的codec经过encode和decode之后,其信息无法完全恢复,就算你听不出来,有些细节也是已经损失掉了。无损codec则纯粹使用熵编码,恢复出来的信息和原始的一模一样,但压缩率不高,并且无法做实时codec。
从实现方式上讲,有基于模型的codec和基于数据的codec(这两个词是我发明的,不是专业名称),前者是通过人为的对原始数据进行数学建模,在模型基础上实现信息压缩,现在的音频/语音codec都是如此,先解得要编码的数据在已知的数学模型下的参数,把参数编码,解码器解码先得到参数,在把参数带入数学模型,就恢复出信息啦。音频模型参数一般是频谱幅度和相位,语音一般是谐波和共振峰。最近深度学习很火爆,所以我也把基于数据的codec提一下,这种codec不需要知道数据有啥数学模型,只是需要多多的数据,它自己会学习总结数据的统计规律(也就是训练过程),限制性玻尔兹曼机,自动编解码机,就是个很好的例子,不过还没见到他们在codec领域商用化的例子。
2016年06月11日 12点06分 3
level 4
BJUTWang 楼主
忽略了还有一种编解码器,在这里补充一下,有些编解码器可能不是为信息压缩而存在的,可能是为了加密需要,也就是编码之后的数据量不比原来少,但第三方无法解读了,这也应该算是codec。
2016年06月11日 12点06分 4
level 4
BJUTWang 楼主
好了,接下来说音频编解码器。
音频编解码器的大框架,先从时间域变到频率域,对频率域的信息进行量化,变成量化因子和量化步长,如原始信息是8.3,编码器可能把其变成了量化因子2,量化步长4,因为8.3~=2x4,解码器把量化因子乘以量化步长,就是2x4=8,就得到了原始数据8.3的大部分信息。这是个举例,真实情况非常复杂。解码器得到了频域信息,再把其变到时间域,就可以听啦。音频编解码器千种万种,但大框架都是如此。
下面对大框架的每一步详细说明一下。
时间域数据到频率域数据(简称时频转换),有各种方法,如常见的FFT(离散傅里叶变换),MDCT(增强型离散余弦变换)等等,这些都需要分帧加窗,利用的是音频的短时连续性。其他还有镜像正交滤波器组,小波变换等。他们的目的都是把看上去豪无规律乱糟糟的时间信号变成频率信号,变完之后,你会发现,嘿,原来这些信号都是有规律的。
为啥非要变到频域,在时间域做不行么?因为人的耳朵是对频率敏感的,时频变换就相当于针对人耳的数学建模。你压缩要舍掉一部分信息,那当然舍掉的信息你听不出来是最好的了。下面的量化过程,就是为了选择那些你最听不出来的信息进行舍弃。
人耳对频率的感知有几个规律:对绝对相位不敏感,对相对相位(多声道)敏感;对高频幅度不敏感,对低频幅度敏感;对高频谱线位置不敏感,对低频谱线位置敏感。同时人耳还有掩蔽效应,一个非常大的谱线对时间轴前后方向和频率轴高低方向的小谱线都有掩蔽效应,也就是说,那个小谱线存在与否,你都听不到的。
好了,知道了这些,很明显量化时就:多保留相对相位信息,少保留绝对相位信息;多保留低频幅度和位置信息,少保留高频幅度和位置信息,对于被掩蔽的谱线,直接舍去就好了,反正你也听不到。这是量化原则。
至于量化方法,有标量量化(scaler quantize)和矢量量化(vector quantize),标量量化可以最大灵活的应用人耳的规律,但量化效率低,AAC codec可以说几乎把标量量化用到了极致。矢量量化没那么灵活,但压缩率更高,我曾经用pvq(金字塔型矢量量化器)实现过一个codec,性能超过了同功能的所有其他编解码器。这些就不细讲了,太细节了,如果有兴趣,可以再讨论。
一般量化完后的的量化因子和量化步长等信息,有一些前后帧之间和帧内部的信息冗余,所以再经过一步熵编码(huffman编码或数字编码),编码就大功告成啦。
解码时,先把编码后的数据进行熵解码,得到量化信息,进行反量化,得到频谱信息,进行反时频变换(也就是频率域到时间域),在经过时域叠加,解码也大功告成啦。
我一直觉得短时平稳性假设并不是太符合实际,对频域进行均分不符合人耳感知模型,虽然在量化时进行了补救,但我总觉得不是那么完美,像是绕了一个圈子。而人耳对音频的感知更像一个多分辨率系统,所以,我非常看好小波理论在音频codec领域的应用,相信随着小波理论更成熟,其成为未来音频codec的基础。
2016年06月11日 13点06分 5
level 4
BJUTWang 楼主
再说说语音编解码器。
语音其实是音频的子类,语音是音频而音频不是语音。但是语音很单纯,就是你的嗓子和嘴巴发出的声音,也就是说,语音比音频更有规律,人为的找到这规律,可以实现更高的压缩率,这就是语音codec要比音频codec压缩率高的多的原因。很容易明白,音频codec是可以用来压缩语音的,就是压缩率不高而已,语音codec是不能压缩普通音频的,那解码出来,就没法听了。
刚才说了,语音只是从你嗓子和嘴巴发出的声音,那么我们为何不对嗓子和嘴巴进行建模?这就像,我如果完完全全知道了你的嗓子和嘴巴的动作,那么也就知道了你在发出的声音。这就对了,为啥说音频codec和语音codec完全不同,因为音频codec是基于你耳朵的数学模型,而语音codec是基于你嗓子和嘴巴(换种说法,声带和声道)的数学模型。
现在主流的语音codec,都是基于这样的谐波+共振峰(声带激励源信息和声道调制信息)模型,大框架就是这样:提取谐波系数-》提取共振峰系数-》量化提取完系数后的残差数据-》熵编码,大功告成!说起来简单,其实真实情况也很复杂,比如清音和浊音不同,清音没有谐波系数,只有少量共振峰系数,要清浊音分开编码,同时还有高频加重,噪声抑制,共振峰增强等的增强处理。。。
语音codec也是需要加窗分帧的,但是不需要时频转换。后面的工作也是基于一帧去做的。首先噪声抑制,高频加重预处理,然后提取谐波系数,这个学名叫长时时间预测系数,一般通过自相关的方法求得步长和幅度,代表基频(怎么这么绕呢。。。反正你知道这个系数代表你的声带信息)。
然后在求得这一帧的共振峰信息,这个学名叫短时时间线性预测系数简称LPC,通过一个复杂的矩阵算法可解得,这个系数表征的多项式的根代表着共振峰的大小和位置(更绕了。。。。反正你知道这个系数代表你的声道信息)。LPC不会被直接量化,因为它对量化噪声太敏感了,也就是量化噪声稍微不够,对质量影响很大,要对它们进行一些数学上的转换,变成LSP或LSF,然后再量化,但变来变去,都是代表的你的声道信息。
经过了上面两轮,原始数据快被榨干了(提个系数怎么就榨干了呢?因为每次提出系数,都要用这个系数对原始数据进行“逆滤波”,这样,你会发现原始数据越来越小越来越小了),好吧,反正剩下的东西也不多了,就直接把你们都量化了吧,这就是残差量化,同样可以标量量化,可以矢量量化,把之前的系数也量化一下,打个包,再加个熵编码进一步从渣渣里榨点油,完了。
解码时,先熵解码,得到各个系数和残差,然后用系数组成的滤波器对残差进行“正滤波”,再加一些带宽扩展之类的增强啊,好了。
不同的codec,在增强方式,系数个数,系数精度,量化方法,熵编码方法各不相同,性能如何,还需要听者来验证。
2016年06月11日 13点06分 7
这里我犯了个错误,语音codec是先提取共振峰系数的,也就是声道系数,或者说先进行短时时间线性预测,然后才是谐波系数,即声带系数,或者说后进行长时时间预测。这样做有数学上的巨大优势。EVS codec,把上面的语音编解码模型,几乎用的极致了,是现在最好的实时语音codec。
2016年06月11日 13点06分
level 4
BJUTWang 楼主
下面再怎么水?好吧,人多力量大,希望在本吧遇到同行,可以共同学习共同进步,共同探讨codec领域的知识,毕竟一人不敌二人计,三人合唱一本戏,你有一个苹果,我有一个苹果,咱俩交换,还是一人一个苹果,你有一个思想,我有一个思想,咱俩交换,就每人俩思想。(太啰嗦了,受不了了!!!真是为了水而水!!!)
2016年06月11日 14点06分 9
level 4
BJUTWang 楼主
不知道有没有图像或视频codec的研究员或工程师这里,其实人感知到的信息,90%都是通过眼睛得到的,剩下的10%是听觉触觉嗅觉和味觉的总和。往好了估计,不知道音频和语音这样的听觉信息能占7%不?所以我也很好奇图像视频编解码的模型和细节。(又在啰里啰嗦水经验,真受不了啦!!!)
2016年06月11日 14点06分 11
level 1
YIFY.Codec.我想知道这个解码器哪里有啊,我找不到。
2016年06月14日 07点06分 12
level 1
楼主说的很好,打了这么字辛苦了,支持一下!!
2016年09月11日 07点09分 13
level 1
楼主能否讲解下volte高清语音的编解码器 谢谢
2017年08月16日 08点08分 14
level 1
楼主厉害了!赞!正在学这方面内容,希望可以请教请教
2019年04月30日 06点04分 17
1