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

2021-10-21 18:11:50 字數 4318 閱讀 3539

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

繼 elon musk 後,bill gates 也開了一場「互動播客」。現在,已有很多團隊開始加碼音訊社交場景。這個場景看似實現簡單,但想讓身處不同國家的使用者得到相同的高音質體驗,卻沒那麼容易。

那麼我們接下來就從編譯碼、降噪與回聲消除演算法、網路傳輸、音質優化幾方面,由淺入深地講講高音質、低延時背後的技術原理與「改造」思路。

我們今天先來講一下語音編解碼器。不過在講語音編解碼器之前,我們需要先了解音訊編譯碼的原理,才能更快地理解到底是什麼在影響著音質體驗。

語音編碼與**編碼

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

音訊編解碼器的發展歷史非常悠久,早期編解碼器的核心演算法是非線性量化,這是一種現在看來比較簡單的演算法,其壓縮效率並不算高,但適用於包括語音和**在內的絕大多數音訊型別。之後,隨著技術的發展和編譯碼分工的細化,編解碼器的演進方向分成了兩條路——語音編碼器和**編碼器。

主要用來編碼語音頻號的語音編解碼器,開始逐漸向基於時域線性**框架的方向演化。這種編解碼器參考了聲道的發音特性,將語音頻號分解為主要的線性**係數和次要的殘差訊號。線性**係數編碼所需的位元率非常少,卻能高效的構建出語音頻號的「骨骼」;殘差訊號則像是「血肉」,能夠補充出語音頻號的細節。這種設計大幅提公升了語音頻號的壓縮效率,但是這種基於時域的線性**框架在有限複雜度下無法很好的編碼**訊號。

而針對**訊號進行編碼的**編解碼器則走上了另一條演化的道路。因為相比時域訊號,頻域訊號的資訊更多的集中在少部分頻點上,更利於編碼器對其進行分析和壓縮。所以**編解碼器基本都會選擇對在頻域上對訊號進行編碼。

後來,隨著技術日趨成熟,兩種編譯碼架構又再次走到了一起,即語音**混合編碼器,webrtc 中預設使用的編解碼器 opus 就是這類編解碼器。這類編解碼器的特點是融合了兩種編碼框架,並針對訊號型別自動切換合適的編碼框架。一些國內外知名的產品都會用到 opus ,比如discord。

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

說起語音編解碼器的一些技術指標,一般會談到取樣率、位元速率、複雜度、抗丟包能力等,那這些技術指標分別代表什麼,對音訊體驗的影響又是怎樣的呢?

你可能看到過「取樣率越高,音質越好」、「編碼複雜度越高越好」的說法,但事實並非如此!

一、取樣率

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

取樣率決定了音訊訊號的解析度。在人耳可感知範圍內,取樣率越高,高頻分量就被保留的越多,這段訊號的聽感就越清晰明亮。舉個例子,我們打傳統**時,往往會感覺對方的聲音比較沉悶,這是因為傳統**的取樣率是 8khz,只保留了能保證可懂度的低頻資訊,很多高頻的分量被丟失了。所以想要音訊互動體驗越好,就需要在人耳可感知範圍內盡量提高取樣率。

二、位元速率

經過取樣,聲音從模擬訊號轉化為數碼訊號。位元速率表示的就是這個數碼訊號在單位時間內的資料量。

位元速率決定了音訊訊號經過編譯碼後的細節還原度。編解碼器會把給定的位元速率按優先順序分配給各個分析模組輸出的引數。在編碼位元速率有限的情況下,編解碼器會優先保證對語音質量影響較大的引數進行編碼,而放棄編碼一些影響較小的引數。這樣在解碼端,因為使用的引數並不完整,所以其構建出的語音頻號也會有難以避免的損傷。一般來說,同一款編解碼器的位元速率越高,其編譯碼後的損傷就越小。但位元速率並不是越高越好,一方面,位元速率和編譯碼質量並不是線性關係,在超過「質量甜點」後,位元速率公升高對質量的提公升開始變得不明顯;另一方面,在實時互動中,位元速率過高可能擠占頻寬產生網路擁塞,從而引發丟包,反過來破壞了使用者體驗。

三、編碼複雜度

編碼複雜度一般集中在編碼端訊號分析模組。一般來說,對語音頻號分析的越詳盡,其潛在壓縮率可能就越高,所以編碼效率和複雜度有一定相關性。同樣的,編碼複雜度和編譯碼質量亦不是線性關係,兩者之間也存在乙個「質量甜點」,能否在有限複雜度的前提下設計出高質量的編譯碼演算法往往直接影響了編解碼器的可用性。

四、抗丟包能力

首先,抗丟包的原理是什麼?我們在傳輸音訊資料的時候會遇到丟包,如果當前資料報丟失了,我們希望可以通過某種手段來猜出來或者得到當前幀大概的資訊,然後利用這些不完全準確的資訊,解碼出乙個和原始訊號相近的語音幀。當然,只靠憑空猜一般是沒什麼好結果的,如果前乙個資料報或者後乙個資料報能告訴解碼器當前丟失包的一些關鍵資訊就好了,這個資訊越多,越有利於解碼端恢復出丟失的語音幀。這些包含在「前乙個資料報」或「後乙個資料報」中的「關鍵資訊」,也就是我們之後要提到的「幀間冗餘資訊」。(往期我們講過丟包對抗的更多知識)

所以,抗丟包能力和編碼效率是相對互斥的,編碼效率的提公升往往需要儘量減少幀間的資訊冗餘,而抗丟包能力又依賴一定的幀間資訊冗餘,幀間資訊冗餘可以保證在當前資料報丟失時,通過前/後序語音幀恢復出當前語音幀。在實時互動場景下,因為使用者的網路是非可靠網路,可能乙個使用者走著走著就進了電梯,或坐在高速行駛的車上。在這種網路裡,充斥著丟包與延時抖動,所以編譯碼抗丟包能力又是不可或缺的。因此,如何平衡編碼效率和抗丟包能力,也需要經過詳盡的演算法設計和打磨驗證。

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

32khz 取樣率

優化編碼複雜度

取樣率越高,語音清晰度就越高,同時意味著單位時間內需要分析/編碼/傳輸的取樣點就越多,編碼位元速率和複雜度都需要相應地增加。編碼位元速率和複雜度的增加勢必會給使用者的頻寬和裝置效能功耗帶來壓力。但這不是我們想看到的。為此,我們經過理論推導和大量實驗驗證,設計了一套精簡的語音高頻分量編碼系統,在分析複雜度增加很小前提下,最低使用 0.8kbps 即可實現高頻訊號的編碼(基於不同技術,以往要表達高頻訊號,位元速率一般需要高於1~2kbps),極大增加了語音頻號的清晰度。

平衡抗丟包效能與編碼效率

在抗丟包能力的保障上,我們也在保證編碼效率的前提下選擇了最平衡的方案,經過實驗驗證,這種方案即又保證了編碼壓縮效率,又保證了丟包時的恢復率。此外,除了 nova,針對不穩定的網路環境,我們還研發上線了抗丟包能力更強的語音編解碼器 solo 和語音**混合編解碼器 solox 等。

agora nova vs. opus

nova 有著豐富的模式選擇以供不同場景選擇,諸如可適應模式、高品質模式、低能耗高品質模式、超高頻模式和超低位元率模式等。

如果把 nova 和先進的開源編解碼器 opus 做對比,得益於 nova 高效的訊號處理演算法,其在通用語音編碼位元速率下,有效頻譜資訊要比同等位元速率下的 opus 多 30%。在主、客觀評價體系下,nova 的語音編碼質量高於 opus:

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

語音通訊中提高音質的方法

語音通訊是實時通訊,影響語音質量的因素很多,大致可把這些因素分成兩大類 一類是回聲雜訊等周圍環境因素導致語音質量差,另一類是丟包延時等網路環境因素導致語音質量差。這兩類因素由於成因不一樣,解決方法也不一樣。下面就講講用哪些方法來提高語音質量。首先看由於周圍環境因素導致語音質量差的解決方法。這類方法主...

高音質高價效比藍芽音箱解決方案

藍芽模組應用 藍芽無繩 方案 藍芽gps接收機模組 電腦藍芽模組 無線立體聲耳機模組 電腦藍芽無線耳麥模組 手機藍芽無線耳麥模組 家用電器藍芽模組藍芽無線耳機模組 接線員藍芽無線耳麥 gps藍芽模組 bluetooth mouse 藍芽閘道器模組 耳機藍芽模組 手機藍芽模組 電腦及外設藍芽介面卡模組...

降噪效果好的藍芽耳機 高音質主動降噪藍芽耳機排名

說到降噪耳機,降噪技術分為主動降噪技術和被動降噪技術兩大類別,兩者其實有著天壤之別。前者是耳機上拾音麥克風來收集環境噪音,將噪音轉為數碼訊號通過內建的處理器算出相反的波抵消,而後者則主要通過包圍耳朵形成封閉空間,或者採用矽膠耳塞等隔音材料來阻擋外界噪音。今天推薦幾款比較不錯的主動降噪耳機。推薦一 n...