编解码器杂谈:浅析 Opus

作者:赵晓涵,声网 Agora 音频算法工程师。原文首发于 RTC 开发者社区

谈起 Opus,对于编解码器有所了解的同学也许会知道,Opus 是由两个编解码器——Silk 和 Celt 融合而成。为什么来自两个组织的编解码器会合二为一,Opus 的性能又如何,本文将简述一下 Opus 的前世今生和部分技术分析。

提到 Opus,就不得不提到它的主要作者,Jean Marc Valin,他从学生时代就开始致力于高音质编解码算法的实现,著名的编解码器 Speex 也是他的作品之一。时间回到2007年,Jean Marc Valin 在博士后期间,完成了 Speex 的开发。在当时,业内编解码器主要分为两个流派:高延时的音乐编解码器(如 MP3、AAC 和 Vorbis)和低延时的语音编解码器(AMR、Speex、G.729)。而工业界对低延时音乐编解码器的需求越来越高,于是 Celt 的开发也被提上了日程。Celt 的早期目标是实现 4-8ms 的编码延时,相比当时 MP3 和 AAC 编码的 100ms+ 延时,优势是非常巨大的。

在研发过程中,Jean Marc Valin 和其他开发者始终围绕着 Vorbis 作者 Christopher “Monty” Montgomery 的意见“尽量保持信号能量谱的低失真”进行开发,这也是 Celt(Constrained Energy Lapped Transform)名字的由来。第一版 Celt 的研发持续了两年,但因为需要保证低延时的原因,Celt 的表现并没有超过 MP3 和 AAC。但在经过了持续六个月的改进后(使用了部分 MP3 的技术),Celt 的表现第一次超过了 MP3。也就是在那个时候,Celt 逐渐走出实验室,迎来了它在工业界的第一批使用者–部分用户因为低延时的强需求不得不选择了 Celt。也就是这一批最早期的用户给了 Celt 的开发者们宝贵的反馈,使其不断改进 Celt。

在开发 Celt 的同时,另一批来自 Skype,以 Koen Vos 为首的开发者开发了业内领先的语音编解码器 Silk,并将其提交至 IETF,作为一款免版税的开源编解码器。Celt 也紧随 Silk 的步伐进行了提交。但 Silk 和 Celt 都遭遇了很大的阻力,这个阻力的来源更多的不是技术因素,而是『政治』因素:此前有大量投资者投资了带版税的编解码器,这些投资者在业内的权威也很大。正是这些阻力促使 Silk 和 Celt 结合到一起,诞生了 Opus。在 Opus 里,Silk 主要负责处理 16khz 及 8khz 的信号,而 Celt 则能处理 8khz 以上的信号。实际上,关于 Opus 里 Silk 和 Celt 的工作模式并不仅仅这么简单,Opus 里共有 32 种模式用来处理不同种类的信号。Opus编解码器架构如下。

编码器:

解码器:

为了和 Silk 结合,Celt 做出了一定的改动。之前 Celt 为了极低延时,把帧长设置的比较短,但 Silk 需要 20ms 的帧长,于是 Celt 牺牲了部分延时和 Silk 的帧长对齐,但仍能把整体延时控制在 10ms。Opus 诞生后又经过了很多改进,关键的改进来自于 Broadcom 提供的一种滤波器,这个滤波器在编码端和解码端各有一个。在编码端,前置滤波器可以保留音乐信号的低频部分,减弱高频部分,这样就可以更高效的去编码;在解码端,后置滤波器可以近乎无损的把被减弱的高频恢复出来。这种前置-后置滤波器结合上述拉长到 20ms 的帧长,Opus 第一次在音乐音质和压缩率上超过了 HE-AAC。这对于 Opus 来说是一个非常重要的节点,因为这代表着 Opus 在语音、音乐、复杂度和延时上有了全面超越其他编解码器的能力。

而融合进 Opus 的 Silk 模块改动则不是很大,主要的改动点都是非常小的细节,我简单整理了一些,如下所示:

一、线性预测部分:二者的计算逻辑是相同的。不同之处有:

  1. OPUS 的整体计算精度更高一些,由 Silk 里的 Q10 转换成了 Q14 后进行判断,包括短时预测、长时预测和激励部分。
  2. 在做 Delaydecision(一种延时选择算法,可以令标量量化拥有近似矢量量化的效率)的时候,OPUS 中对判断算法进行了重写,增加了一个 quantoffset 参数并重新规划了量化的范围,这里和 Silk 比较,带来的 MOS 分增益,我自己测的是大约在 0.05 左右(少量样本测试,不一定准确,仅供参考)。
  3. OPUS 的 Delaydecision 模块默认是计算 40 个采样点的总误差,Silk 是 32 个,选择的采样点越多,误差越小,但延时会越大,这两个我试了一下对 MOS 分的影响基本没有,。
  4. 在编码时,OPUS 使用 SHIFT_ROUND 将 Q10 转化成了 Q0 传入到编码模块,Silk 使用的是 SHIFT 方法,两者的不同之处在于,SHIFT_ROUND 会将 [-512,512] 的值都转化为 0,而 SHIFT 的置零区间为 [0,1024],这里使用不同的 SHIFT 算法会影响到后续编码激励时分配的码率。
  5. OPUS 通过调整计算步骤,增加新参数(如 delayedgain 和 diff 等)等方法,减少了少量计算量。

二、编码部分:

  1. OPUS 中的编码模块由依赖Silk中的概率密度函数 CDF 转成了逆概率密度函数 iCDF,尚不清楚做这种改动的原因,从结果上来看,使用 CDF 和 iCDF 的编码效率是差不多的。
  2. OPUS 将编码 index 和 excition 的函数区分开了,但函数的实现及各个参数的编码顺序和 Silk 是相同的,总的来说,这是一个关于模块化的改进。

三、其余部分:

  1. 增益计算部分,OPUS 在较多函数里使用的是 Q7,Silk 使用的是 Q0,因此 OPUS 对增益的控制能稍微准一些。
  2. OPUS 对码率控制算法进行了重写,但总体逻辑和 Silk 是相同的,个人认为 OPUS 的码率控制更为激进一点,压得狠,放的快。
  3. OPUS 的抖动算法中 Seed 的判断方法也改变了,OPUS 中通过判断 Seed 是否小于 0 进行符号的转换,Silk 通过把 Seed 右移 31 位后做异或后自减进行判断,其实这两种方法的结果是完全一样的,只是方式一的计算量更小。

Silk 和 Celt 整合到一起后,经过各方努力,Opus 在 2012 年作为免版税的开源编解码器成为了 IETF 的标准。也就是在差不多那个时候,WebRTC 也成为了 IETF 在 Web 通信上的标准,而 Opus 凭借其卓越的性能成为了 WebRTC 的内置编解码器。一直到今天,Opus 仍在不断发布版本,就在前不久,Opus 发布了 Opus 1.3.1。从发版趋势可以看出,Opus 也在拥抱 AI 化。

目前 Opus 里和 AI 相关的技术有两个:基于 RNN 的语音音乐分类器和一个附加的基于 RNN 的降噪模块(这个降噪模块目前并不在 Opus 本身的代码里,但不排除以后会和 Speex 一样,把信号处理模块耦合进编解码器)。

从 Opus 的诞生和发展历程可以看出,任何产品做到极致都需要付出不懈的努力和漫长的打磨时间,尤其是在创新领域,其路漫漫,道阻且长,各位同学一起加油吧。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 在保证视频图像质量的前提下,HEVC通过增加一定的计算复杂度,可以实现码流在H.264/AVC的基础上降低50%。...
    加刘景长阅读 7,597评论 0 6
  • 1. Opus   Opus编码器 是一个有损声音编码的格式,由IETF的编解码器工作组设计的,合并了Skype的...
    starmier阅读 11,129评论 0 3
  • I was born in the 77th Avenue and as well buried here. Th...
    鹭_d9d5阅读 271评论 1 0
  • 作者:山河判断 籍此文慰问天下父母 亲爱的妈妈,今天是清明节,请原谅不孝的儿子不能去老家的青山坡上看望您。时光匆匆...
    易简文阅读 351评论 0 0
  • 使用场景 在开发中有些重要业务需要记录日志并保存.使用spring event 事件发布日志,统一监听日志并记录....
    Learn_Java阅读 2,020评论 0 4