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

聲網Agora發表於2021-11-16

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

繼 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 為全球使用者提供了一致的高質量音訊互動體驗。其實一段語音通話體驗的好壞,除了直接與編解碼器的編碼質量關聯,也會極大地受到其他模組的影響,比如回聲消除、降噪、網路傳輸等,我們將在下一期介紹聲網在回聲消除與降噪演算法方面的最佳實踐。

圖片

相關文章