詳解低延時高音質:編解碼篇

語音社交已經出現了數十年,而近期的“互動播客”場景讓音頻互動再次成爲業界焦點。如何提供好的音頻互動體驗?怎麼優化音質?如何應對全球傳輸下的網絡挑戰?如何在高音質的基礎上讓聲音更悅耳?我們將從今天開始通過「詳解低延時高音質」系列內容,從多個層面深入淺出逐一解答這些問題。


繼 Elon Musk 後,Bill Gates 也開了一場“互動播客”。 現在,已有很多團隊開始加碼音頻社交場景。 這個場景看似實現簡單,但想讓身處不同國家的用戶得到相同的高音質體驗,卻沒那麼容易。
那麼我們接下來就從編解碼、降噪與回聲消除算法、網絡傳輸、音質優化幾方面,由淺入深地講講高音質、低延時背後的技術原理與“改造”思路。
我們今天先來講一下語音編解碼器。不過在講語音編解碼器之前,我們需要先了解音頻編解碼的原理,才能更快地理解到底是什麼在影響着音質體驗。

語音編碼與音樂編碼


音頻編碼指的是把音頻信號轉化爲數字碼流的過程(如下圖所示)。在這個過程中,音頻信號會被分析從而產生特定參數。隨後,這些參數會按照一定規則寫入比特流。這個比特流也就是我們常說的碼流。解碼端接收到碼流後,會按照約定好的規則將碼流還原爲參數,再使用這些參數構建出音頻信號。


圖片源自:Earlham College
音頻編解碼器的發展歷史非常悠久,早期編解碼器的核心算法是非線性量化,這是一種現在看來比較簡單的算法,其壓縮效率並不算高,但適用於包括語音和音樂在內的絕大多數音頻類型。之後,隨着技術的發展和編解碼分工的細化,編解碼器的演進方向分成了兩條路——語音編碼器和音樂編碼器。
主要用來編碼語音信號的語音編解碼器,開始逐漸向基於時域線性預測框架的方向演化。這種編解碼器參考了聲道的發音特性,將語音信號分解爲主要的線性預測係數和次要的殘差信號。線性預測係數編碼所需的比特率非常少,卻能高效的構建出語音信號的“骨骼”;殘差信號則像是“血肉”,能夠補充出語音信號的細節。這種設計大幅提升了語音信號的壓縮效率,但是這種基於時域的線性預測框架在有限複雜度下無法很好的編碼音樂信號。
而針對音樂信號進行編碼的音樂編解碼器則走上了另一條演化的道路。因爲相比時域信號,頻域信號的信息更多的集中在少部分頻點上,更利於編碼器對其進行分析和壓縮。所以音樂編解碼器基本都會選擇對在頻域上對信號進行編碼。
後來,隨着技術日趨成熟,兩種編解碼架構又再次走到了一起,即語音音樂混合編碼器,WebRTC 中默認使用的編解碼器 Opus 就是這類編解碼器。這類編解碼器的特點是融合了兩種編碼框架,並針對信號類型自動切換合適的編碼框架。一些國內外知名的產品都會用到 Opus ,比如Discord。

語音編碼中,什麼在影響互動體驗?


說起語音編解碼器的一些技術指標,一般會談到採樣率、碼率、複雜度、抗丟包能力等,那這些技術指標分別代表什麼,對音頻體驗的影響又是怎樣的呢?
你可能看到過“採樣率越高,音質越好”、“編碼複雜度越高越好”的說法,但事實並非如此!

一、採樣率

從人耳可以聽到的模擬信號,轉化到計算機可以處理的數字信號,需要一個採樣的過程。聲音可以被分解爲不同頻率不同強度正弦波的疊加。採樣可以想象成在聲波上採集了一個點。而採樣率指的就是在這個過程中每秒採樣的點數,採樣率越高,表示在這個轉化過程損失的信息越少,也就是越接近原聲。

採樣率決定了音頻信號的分辨率。在人耳可感知範圍內,採樣率越高,高頻分量就被保留的越多,這段信號的聽感就越清晰明亮。舉個例子,我們打傳統電話時,往往會感覺對方的聲音比較沉悶,這是因爲傳統電話的採樣率是 8kHz,只保留了能保證可懂度的低頻信息,很多高頻的分量被丟失了。所以想要音頻互動體驗越好,就需要在人耳可感知範圍內儘量提高採樣率。
二、碼率
經過採樣,聲音從模擬信號轉化爲數字信號。碼率表示的就是這個數字信號在單位時間內的數據量。
碼率決定了音頻信號經過編解碼後的細節還原度。 編解碼器會把給定的碼率按優先級分配給各個分析模塊輸出的參數。在編碼碼率有限的情況下,編解碼器會優先保證對語音質量影響較大的參數進行編碼,而放棄編碼一些影響較小的參數。這樣在解碼端,因爲使用的參數並不完整,所以其構建出的語音信號也會有難以避免的損傷。一般來說,同一款編解碼器的碼率越高,其編解碼後的損傷就越小。但碼率並不是越高越好,一方面,碼率和編解碼質量並不是線性關係,在超過“質量甜點”後,碼率升高對質量的提升開始變得不明顯;另一方面,在實時互動中,碼率過高可能擠佔帶寬產生網絡擁塞,從而引發丟包,反過來破壞了用戶體驗。

關於質量甜點:在視頻領域,質量甜點指的是在既定的碼率和屏幕大小下通過設定合理的分辨率和帖速率來得到最佳視頻主觀質量體驗。在音頻領域也有類似的情況。

三、編碼複雜度
編碼複雜度一般集中在編碼端信號分析模塊。一般來說,對語音信號分析的越詳盡,其潛在壓縮率可能就越高,所以編碼效率和複雜度有一定相關性。同樣的,編碼複雜度和編解碼質量亦不是線性關係,兩者之間也存在一個“質量甜點”,能否在有限複雜度的前提下設計出高質量的編解碼算法往往直接影響了編解碼器的可用性。
四、抗丟包能力
首先,抗丟包的原理是什麼?我們在傳輸音頻數據的時候會遇到丟包,如果當前數據包丟失了,我們希望可以通過某種手段來猜出來或者得到當前幀大概的信息,然後利用這些不完全準確的信息,解碼出一個和原始信號相近的語音幀。當然,只靠憑空猜一般是沒什麼好結果的,如果前一個數據包或者後一個數據包能告訴解碼器當前丟失包的一些關鍵信息就好了,這個信息越多,越有利於解碼端恢復出丟失的語音幀。這些包含在“前一個數據包”或“後一個數據包”中的“關鍵信息”,也就是我們之後要提到的“幀間冗餘信息”。(往期我們講過丟包對抗的更多知識
所以,抗丟包能力和編碼效率是相對互斥的,編碼效率的提升往往需要儘量減少幀間的信息冗餘,而抗丟包能力又依賴一定的幀間信息冗餘,幀間信息冗餘可以保證在當前數據包丟失時,通過前/後序語音幀恢復出當前語音幀。在實時互動場景下,因爲用戶的網絡是非可靠網絡,可能一個用戶走着走着就進了電梯,或坐在高速行駛的車上。在這種網絡裏,充斥着丟包與延時抖動,所以編解碼抗丟包能力又是不可或缺的。因此,如何平衡編碼效率和抗丟包能力,也需要經過詳盡的算法設計和打磨驗證。

如何平衡音頻體驗與技術指標?


是怎麼做的呢?我們的工程師綜合考慮了上述幾點,打造了一款專爲實時通訊使用的高清語音編解碼器 Agora Nova(以下簡稱 Nova)。
32kHz 採樣率
首先在採樣率上的選擇,Nova 並沒有選擇其他語音編解碼器使用的8khz採樣率或16khz採樣率,而是選擇了更高的 32kHz 採樣率。這意味着 Nova 首先在通話音質的起跑線上就取得了較大的領先優勢。雖然業內常用的 16kHz 採樣率(備註:微信用的就是 16kHz)已經滿足了語音可懂度的基本需求,但部分語音細節仍然需要更高的採樣率才能捕捉到,我們希望提供更高清的語音通話能力,即既保證了可懂度,又提升了清晰度,這也是我們選擇 32kHz 的原因。
優化編碼複雜度
採樣率越高,語音清晰度就越高,同時意味着單位時間內需要分析/編碼/傳輸的採樣點就越多,編碼碼率和複雜度都需要相應地增加。編碼碼率和複雜度的增加勢必會給用戶的帶寬和設備性能功耗帶來壓力。但這不是我們想看到的。爲此,我們經過理論推導和大量實驗驗證,設計了一套精簡的語音高頻分量編碼系統,在分析複雜度增加很小前提下,最低使用 0.8kbps 即可實現高頻信號的編碼(基於不同技術,以往要表達高頻信號,碼率一般需要高於1~2kbps),極大增加了語音信號的清晰度。
平衡抗丟包性能與編碼效率
在抗丟包能力的保障上,我們也在保證編碼效率的前提下選擇了最平衡的方案,經過實驗驗證,這種方案即又保證了編碼壓縮效率,又保證了丟包時的恢復率。此外,除了 Nova,針對不穩定的網絡環境,我們還研發上線了抗丟包能力更強的語音編解碼器 Solo語音音樂混合編解碼器 SoloX 等。
Agora Nova vs. Opus
Nova 有着豐富的模式選擇以供不同場景選擇,諸如可適應模式、高品質模式、低能耗高品質模式、超高頻模式和超低比特率模式等。
如果把 Nova 和先進的開源編解碼器 Opus 做對比,得益於 Nova 高效的信號處理算法,其在通用語音編碼碼率下,有效頻譜信息要比同等碼率下的 Opus 多 30%。在主、客觀評價體系下,Nova 的語音編碼質量高於 Opus:
  • 客觀評價層面,使用 ITU-T P.863 標準定義的客觀質量評估算法對兩個編解碼器的編碼-解碼語料進行打分,Nova 得分始終比 Opus 略高一籌;

  • 主觀評價層面,經過 Nova 編解碼的語音信號的還原度要高於經過 Opus 編解碼的語音信號,反映在聽感上就是更通透,量化噪音更小。

得益於這款高清的語音編解碼器,聲網 SDK 爲全球用戶提供了一致的高質量音頻互動體驗。其實一段語音通話體驗的好壞,除了直接與編解碼器的編碼質量關聯,也會極大地受到其他模塊的影響,比如回聲消除、降噪、網絡傳輸等,我們將在下一期介紹聲網在回聲消除與降噪算法方面的最佳實踐。
END


本文分享自微信公衆號 - 音視頻開發進階(glumes_blog)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章