編解碼器雜談:淺析 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閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容

  • 在保證視頻圖像質量的前提下,HEVC通過增加一定的計算復雜度,可以實現碼流在H.264/AVC的基礎上降低50%。...
    加劉景長閱讀 7,951評論 0 6
  • 1. Opus ??Opus編碼器 是一個有損聲音編碼的格式,由IETF的編解碼器工作組設計的,合并了Skype的...
    starmier閱讀 12,645評論 0 3
  • I was born in the 77th Avenue and as well buried here. Th...
    鷺_d9d5閱讀 298評論 1 0
  • 作者:山河判斷 籍此文慰問天下父母 親愛的媽媽,今天是清明節,請原諒不孝的兒子不能去老家的青山坡上看望您。時光匆匆...
    易簡文閱讀 379評論 0 0
  • 使用場景 在開發中有些重要業務需要記錄日志并保存.使用spring event 事件發布日志,統一監聽日志并記錄....
    Learn_Java閱讀 2,043評論 0 4