火山引擎 RTC 自研音頻編碼器 NICO 實踐之路

語言: CN / TW / HK

1. 前言

隨着互聯網技術的不斷髮展,越來越多的人開始嘗試使用或者依賴實時音視頻產品解決團隊溝通與協作問題。在通話過程中,我們時常會遇到因為網絡波動(如擁塞、丟包、延時和抖動等)而導致的音頻卡頓、掉字或者雜音等問題,影響工作效率。為解決此類音頻弱網問題,業界一般採用前向糾錯(Forward Error Correction,FEC)或者重傳等網絡策略優化方法,但這些方法存在宂餘率過高、帶寬利用效率低等缺點,而提升音頻編碼器的編碼效率和抗丟包能力、提高帶寬利用效率,是解決音頻弱網問題更為高效的一種方法。Opus 作為 RTC 領域廣泛使用的音頻編碼器,其編碼質量較高,且提供一定的抗丟包能力,但是在高丟包以及突發丟包場景,音質會明顯下降,同時,其編碼效率也有進一步提升的空間。RTC 自研 NICO(Network Intelligent Audio Coding,NICO)編碼器在完全兼容Opus 的基礎上,極大提高了編碼效率,並提供了超強的抗丟包能力。目前 NICO 已經成功集成進火山引擎 RTC,並應用於抖音和視頻會議等業務,極大提升了弱網場景音頻體驗。

2. 音頻編解碼技術簡介

音頻編碼器是一種將音頻信號進行壓縮和解壓縮的裝置。一般分為 3 大類:波形編碼器、參數編碼器和統一編碼器。

2.1 波形編碼

波形編碼,顧名思義就是對音頻信號的波形進行數字化處理。G.711 是由 ITU-T 制定的一個典型的波形編碼器,碼率為 64kbps,最早應用於固定電話場景,其核心思想是將每一個 14 比特的音頻採樣數據壓縮成 8比特 表示。G.711 利用了人耳對大能量信號不敏感的特點,幅度大的信號量化誤差大,幅度小的信號量化誤差小,可以將信號碼率壓縮 50% 左右。

圖片

2.2 參數編碼

隨着科學家對語音信號的特性和人耳感知聲音的機制理解更加深入,參數編碼器逐漸在語音編碼和音頻編碼領域成為主流。參數編碼就是指通過對信號提取若干個特徵參數,並對特徵參數進行量化壓縮的方法。參數編碼不以波形匹配為準則,而是通過對信號中的關鍵特徵進行提取,並以高效的量化方式進行壓縮,達到高質量恢復信號關鍵信息的目的。因此,參數編碼器的編碼效率也要明顯高於波形編碼器。下面分別針對語音和音頻信號的參數編碼方法進行説明。

2.2.1 語音編碼

下圖是一個碼激勵線性預測(Codebook Excitation Linear Prediction,CELP)編碼器系統框圖,是一個典型的參數語音編碼器。主要利用了語音信號具有短時相關性和長時相關性的特點,使用線性預測的方法去除相鄰樣點間的相關性(即短時相關性),提取到線性預測(Linear Prediction Coding,LPC)係數,通過分析語音信號中的長時相關性提取基音週期參數,去除語音信號中的長時相關性,然後利用隨機碼書擬合隨機激勵信號,通過分析合成的方式獲得最佳編碼參數。這種方式只需要對 LPC 係數、基音週期、隨機碼書和兩個增益參數進行量化壓縮,解碼端就可以恢復高質量語音。參數編碼器只需要不到 20kbps 的碼率即可達到與 G.711@64kbps 相同的質量,編碼效率具有明顯的優勢。典型的編碼器有:G.729、AMR-NB 和 AMR-WB 等。

圖片

2.2.2 音頻編碼

下圖是一個典型的頻域編碼器系統框圖。音樂信號和自然界的聲音是通過不同的載體進行發聲的,發聲方式也千差萬別,不太可能利用發聲方式進行建模。換句話説,使用語音編碼的方法編碼音頻信號的編碼效率不高,編碼質量比較差。於是科學家另闢蹊徑,通過對人耳感知聲音的方式進行研究,發現人耳對不同頻率信號的感知敏感度也有所不同,因此發明了一種基於心理聲學模型的編碼器,尤其適合對音樂信號和自然界聲音的編碼。典型的編碼器有:MP3、AAC 和 HE-AAC 等。

圖片

2.3 統一編碼

綜上可知,語音編碼器只適合編碼語音信號,音頻編碼器只適合編碼音頻信號。在實際應用場景中,我們經常會遇到在説話過程中會有音樂或者其他背景聲音的場景。那麼是否存在一種編碼器,能夠依據信號的類型,自適應選擇最佳編碼方式,達到最佳編碼質量呢?答案是肯定的。統一編碼器採用統一框架高質量編碼語音信號和音頻信號,它能夠很好的解決混合語音和音樂信號的高質量編碼問題。典型的統一編碼器有:Opus、EVS 和 USAC 等。

圖片

3. 自研 NICO 編碼器技術優化

為了解決 Opus 編碼器在高丟包以及突發丟包場景中質量變差的問題,自研 NICO 編碼器引入了多種編碼工具和創新技術,以提高編碼器抗高隨機丟包和突發丟包的能力。另外,在提高編碼效率的同時,NICO 實現了與 Opus 編碼器完全兼容,解決了與現網 RTC 設備互聯互通的問題。

3.1 抗弱網編碼技術及優化

3.1.1 多描述編碼

多描述編碼是一種專門為弱網場景設計的編碼技術,其核心思想是“編碼器產生的多個描述碼流相互獨立又互為補充”。單個多描述碼流就可以解碼獲得完整語音,每多收到一個多描述碼流,獲得的解碼語音質量可以得到進一步增強。多描述編碼方法是一種非常適合在無可靠傳輸網絡場景使用的編解碼技術,能夠有效減少由於丟包引起的各種音頻卡頓問題,但是在無丟包場景,其解碼質量差於單碼流編碼器。而且,多描述編碼算法的複雜度要比單碼流編碼器高很多,多描述碼流個數越多,複雜度就會成倍增加,這也在一定程度上限制了多描述編碼技術的使用。

針對上述問題,我們在設計多描述編碼算法時,對現有多描述編碼技術和 Opus 編碼器中 NSQ 量化方法進行了詳細的分析。我們發現,現有算法只能做到寬帶多描述編碼,且高頻質量明顯差於Opus,同時 Opus 中 NSQ 量化方法十分複雜,基於 Opus 的多描述編碼複雜度會明顯偏高。我們通過多種技術優化,解決了上述難題,使 NICO 支持了窄帶到全帶的多描述編碼,滿足了不同應用場景對編碼音質的差異化需求,同時保證了 NICO 在無丟包場景編碼質量能對齊甚至稍優於 Opus,在高丟包場景明顯優於 Opus,而編碼複雜度和 Opus 相當。

圖片

3.1.2 帶內 FEC 算法

帶內 FEC 算法是一種在當前幀碼流中攜帶過去歷史幀碼流的一種方法,與帶外 FEC 算法相比,其減少了 RTP 頭部開銷,比特利用效率更高。當 Opus 碼流攜帶帶內 FEC 信息時,如果當前幀碼流數據丟失,解碼器可以通過解析下一幀碼流中的帶內 FEC 信息解碼當前幀音頻。Opus 帶內 FEC 有不錯的對抗隨機丟包的能力,但對突發丟包無能為力,開啟帶內 FEC 也會導致編碼複雜度明顯上升,並且其帶內 FEC 幀信息在無丟包時不會帶來額外的質量提升,帶寬利用效率不高。在實際使用場景中,我們還發現帶內 FEC 佔用碼率過多,影響主幀編碼質量,會導致雜音的問題。

為解決上面這些問題,NICO 帶內 FEC 算法做了許多創新,全面優化了編碼流程和碼率分配等環節,提升了編碼效率,降低了編碼複雜度,並且在突發丟包場景,NICO 的效果遠優於 Opus。

圖片

3.1.3 丟包隱藏算法

丟包隱藏(Packet Loss Concealment,PLC)算法是指當前幀的碼流因為某種原因丟失時,解碼器利用歷史解碼數據或者參數預測當前幀解碼數據的算法。PLC 算法作為恢復丟失幀音頻的最後解決方案,是大多數音頻編碼器中常用的技術,對提升丟包場景下的主觀聽感有較大作用。Opus 的 PLC 算法對丟包幀處理較為簡單,對於能量、基音週期等參數只是做簡單的衰減或者複製等操作,恢復出的音頻經常會出現能量偏低、雜音等問題。NICO 對此進行了大量改進,參考了歷史幀的變化趨勢,對於丟包幀解碼參數預測更為準確,恢復的音頻聽感較 Opus 有明顯提升。

3.2 編碼質量提升

3.2.1 帶寬擴展算法

帶寬擴展(BandWidth Extension,BWE)是一種使用少量比特編碼高頻信息,高質量恢復高頻信號的算法。在 Opus 編碼器中,所採用的 BWE 技術是以填充隨機噪聲的方式恢復高頻空洞,這種方式會導致恢復出的高頻信號能夠聽到明顯的高頻噪聲,體驗較差;在低碼率編碼方法中,還會使用頻譜摺疊的方式恢復高頻,由於沒有考慮高頻與低頻信號的相關性,摺疊後的高頻部分與原始信號往往相差較大,有時會聽到明顯的高頻量化噪聲。在 NICO 編碼器中,我們對 BWE 算法進行了改進,充分利用高頻與低頻信號的相關性優化高頻恢復效果,提升了低碼率條件下音頻信號的恢復質量。

下圖是低碼率 Opus 和 NICO 解碼音頻的頻譜對比。可以看出,在高頻部分,Opus 使用隨機噪聲恢復,而 NICO 恢復了更多的高頻細節,與原始信號更為接近。

圖片

3.2.2 不連續傳輸算法

不連續傳輸(Discontinuous Transmission,DTX)是指 VAD 算法檢測到非活動語音時,編碼器會減少數據發送,只間隔性發送低字節數的靜音描述幀(Silence Insertion Descriptor,SID),達到降低編碼碼率的目的。舒適噪聲生成(Comfort Noise Generation,CNG)指的是解碼端收到 SID 幀後會依據解碼參數生成舒適噪聲,保持聽感連續。Opus 的 DTX/CNG 算法存在編解碼端 CPU 消耗偏高、VAD 算法不夠準確導致出現不平穩噪聲等問題。針對上述問題,我們對 DTX/CNG 算法做了一系列優化,改進了編碼端 VAD 算法和編解碼處理邏輯,解決了舒適噪聲不平穩問題,還大幅降低了 DTX 段編碼端與解碼端的 CPU 消耗。

以下是 Opus 和 NICO 解碼帶噪語音的效果對比,Opus 解碼音頻在噪聲段不夠平穩,而 NICO 解碼音頻噪聲段能量平穩,聽感更佳。

圖片

3.2.3 動態模式切換

在實際通話過程中,用户的網絡狀況可能比較複雜。為了在各種網絡狀況下獲得最佳通話質量,我們設計了動態模式切換功能。編碼器可以依據網絡反饋的網絡狀態信息自適應調整編碼模式。當用户網絡狀況很好時,編碼器基於網絡反饋的丟包率信息自動切換到 Opus 編碼模式,以獲得更優語音通話質量;當用户網絡狀況變差時,編碼器基於網絡反饋的丟包率以及帶寬等信息,從 Opus 編碼動態平滑切換到 NICO 模式編碼,提升編碼器的抗丟包能力。

圖片

3.3 兼容 WebRTC 的設計

傳統方案中,讓具有不同編碼器能力的終端進行通信,往往需要服務器進行轉碼再轉發的操作,而轉碼操作會造成音質下降、複雜度增加和延時變長等問題。NICO 編碼器通過獨特的碼流設計,使得 NICO 的碼流與 Opus 完全兼容。換句話説,具有 NICO 編碼能力的客户端能和 Web 端等原生 WebRTC 應用直接進行互通,不僅規避了轉碼服務器帶來的各種問題,還拓展了 NICO 的應用領域,在 P2P 通信和不同廠商間互聯互通等場景都能無障礙使用 NICO。

圖片

為了達到與原生 Opus 完全兼容的目的,NICO 的碼流結構和 Opus 完全一致。當只有 Opus 解碼能力的終端在接收到 NICO 的碼流時,也能解碼出正常質量的語音,聽感較解碼原生 Opus 的碼流無明顯差異;而具有 NICO 解碼能力的終端解析 NICO 的碼流時,便能使用到 NICO 的抗丟包能力,在丟包場景下達到遠優於 Opus 的效果。

以下三段音頻分別是原始音頻、使用 Opus 編解碼音頻和使用 NICO 編碼 Opus 解碼的音頻,可以感受到,對於相同音頻序列,使用 NICO 編碼的碼流被 Opus 解析時,解碼音質較 Opus 編解碼幾乎無差異。音頻體驗點擊:「鏈接」

3.4 複雜度優化

為提升抗丟包能力並完全兼容 Opus 碼流,NICO 編碼器做了非常多的技術創新和改進,同時對複雜度也做了很多優化工作,達到對齊 Opus 的水平。這些優化工作在保證質量的同時降低了 NICO 的複雜度,確保 NICO 在低端機器上都能夠流暢運行。

下圖為 NICO 和 Opus 編碼器 CPU 消耗對比結果,測試採用了實時率(Real-Time Factor,RTF)作為 CPU 消耗衡量指標。在 iPhone Xs Max 手機上,NICO 在優化特性都開啟的情況下,CPU 消耗相較於 Opus 關閉帶內 FEC 增加了9%,而相較於 Opus 打開帶內 FEC 降低接近 15%。

圖片

3.5 質量對比

我們評估了 NICO 與 Opus 開啟帶內 FEC 在同等碼率、無丟包、隨機丟包 30%、40% 和突發丟包 25% 測試條件下的 POLQA 打分。結果顯示,Opus 解碼音頻質量隨着丟包率的增加有明顯下降,在突發丟包場景下,更是降到 2 分以內。NICO 解碼音頻隨着丟包率的增加,MOS 分有一定程度下降,但下降緩慢且明顯優於 Opus。在突發丟包 25% 時,NICO 的 MOS 分接近 4 分,遠遠好於 Opus。

圖片

下面是 Opus 和 NICO 在 40% 隨機丟包和 25% 突發丟包條件下的頻譜對比示意圖。從頻譜圖上來看,Opus 在隨機丟包場景會頻繁出現因 PLC 造成的能量衰減、頻譜能量不連續的情況,而 NICO 的頻譜恢復效果更好,有更好的連續性,沒有明顯的頻譜上的損傷。

圖片

在突發丟包場景,Opus 解碼音頻會出現語音聽感明顯不連續、卡頓掉字等現象,而 NICO 解碼音頻的連續性非常好,無任何卡頓。

圖片

文檔中為一條音頻序列的測試結果,感興趣的朋友可以點擊「鏈接」自行體驗效果差異。

3.6 小結

可以看出,相較於帶外 FEC、重傳等網絡策略,提升編碼器抗弱網能力和編碼質量是解決音頻弱網痛點問題性價比更優的方案。相比業界已有方案,NICO 編碼器的技術優化和創新工作具有以下幾項優點:

  • 全面支持窄帶到全帶多描述編碼,滿足不同業務場景對編碼音質的差異化需求,改進帶內 FEC 和 PLC 算法,在高丟包與突發丟包場景,弱網抗性明顯優於 Opus 編碼器;
  • 改進 BWE、DTX 和 CNG 等算法,提出動態編碼模式切換方法,明顯提升編碼質量;
  • 獨特的碼流設計完全兼容 Opus,確保 NICO 終端與 WebRTC 終端以及不同 RTC 廠商互聯互通,降低了端到端兼容性改造成本;
  • 高效優化編碼複雜度,保障在高中低端機上均可以流暢運行,使用火山引擎 RTC 應用的用户都能享受到 NICO 帶來的質量提升。

4. 未來展望

目前,NICO 主要針對通話場景做了大量優化工作,提升了弱網場景的音頻體驗,後續我們會將其拓展到其它場景,例如直播、連麥和空間音頻傳輸等。同時,AI 技術為編解碼器方向帶來了技術革新,未來有潛力在複雜度可控和超低碼率條件下實現高清音頻通話,進一步提升用户在弱網場景下的通話體驗,我們將密切關注業界相關技術的進展,不斷提升火山引擎 RTC 語音相關技術的能力上限。

參考資料

  1. Recommendation G.711 (11/1988): Pulse code modulation (PCM) of voice frequencies
  1. M. Schroeder; B. Atal, 1985. Code-excited linear prediction(CELP): High-quality speech at very low bit rates. ICASSP '85. IEEE International Conference on Acoustics, Speech, and Signal Processing
  1. Andreas S., Ted Painter. Audio Signal Processing and Coding ,2007, Wiley-Interscience
  1. Neuendorf; et al. The ISO/MPEG Unified Speech and Audio Coding Standard - Consistent High Quality for all Content Types and at all Bit Rates, 2013, Journal of the Audio Engineering Society. Audio Engineering Society
  1. J.M. Valin, RFC 6716: Definition of the Opus Audio Codec, 2012
  1. V.K. Goyal. Multiple description coding: compression meets the network, 2002,IEEE Signal Processing Magazine
  1. H Sanneck, A Stenger, A new technique for audio packet loss concealment. Proceedings of GLOBECOM'96

關於我們

火山引擎 RTC,致力於提供全球互聯網範圍內高質量、低延時的實時音視頻通信能力,幫助開發者快速構建語音通話、視頻通話、互動直播、轉推直播等豐富場景功能,目前已覆蓋互娛、教育、會議、遊戲、汽車、金融、IoT 等豐富實時音視頻互動場景,服務數億用户。 

圖片

🏃 掃描上方二維碼加入我們吧!