火山引擎 RTC 自研音頻編碼器 NICO 實(shí)踐之路
精選1. 前言
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,越來越多的人開始嘗試使用或者依賴實(shí)時(shí)音視頻產(chǎn)品解決團(tuán)隊(duì)溝通與協(xié)作問題。在通話過程中,我們時(shí)常會(huì)遇到因?yàn)榫W(wǎng)絡(luò)波動(dòng)(如擁塞、丟包、延時(shí)和抖動(dòng)等)而導(dǎo)致的音頻卡頓、掉字或者雜音等問題,影響工作效率。為解決此類音頻弱網(wǎng)問題,業(yè)界一般采用前向糾錯(cuò)(Forward Error Correction,F(xiàn)EC)或者重傳等網(wǎng)絡(luò)策略優(yōu)化方法,但這些方法存在冗余率過高、帶寬利用效率低等缺點(diǎn),而提升音頻編碼器的編碼效率和抗丟包能力、提高帶寬利用效率,是解決音頻弱網(wǎng)問題更為高效的一種方法。Opus 作為 RTC 領(lǐng)域廣泛使用的音頻編碼器,其編碼質(zhì)量較高,且提供一定的抗丟包能力,但是在高丟包以及突發(fā)丟包場景,音質(zhì)會(huì)明顯下降,同時(shí),其編碼效率也有進(jìn)一步提升的空間。RTC 自研 NICO(Network Intelligent Audio Coding,NICO)編碼器在完全兼容Opus 的基礎(chǔ)上,極大提高了編碼效率,并提供了超強(qiáng)的抗丟包能力。目前 NICO 已經(jīng)成功集成進(jìn)火山引擎 RTC,并應(yīng)用于抖音和視頻會(huì)議等業(yè)務(wù),極大提升了弱網(wǎng)場景音頻體驗(yàn)。
2. 音頻編解碼技術(shù)簡介
音頻編碼器是一種將音頻信號(hào)進(jìn)行壓縮和解壓縮的裝置。一般分為 3 大類:波形編碼器、參數(shù)編碼器和統(tǒng)一編碼器。
2.1 波形編碼
波形編碼,顧名思義就是對(duì)音頻信號(hào)的波形進(jìn)行數(shù)字化處理。G.711 是由 ITU-T 制定的一個(gè)典型的波形編碼器,碼率為 64kbps,最早應(yīng)用于固定電話場景,其核心思想是將每一個(gè) 14 比特的音頻采樣數(shù)據(jù)壓縮成 8比特 表示。G.711 利用了人耳對(duì)大能量信號(hào)不敏感的特點(diǎn),幅度大的信號(hào)量化誤差大,幅度小的信號(hào)量化誤差小,可以將信號(hào)碼率壓縮 50% 左右。
2.2 參數(shù)編碼
隨著科學(xué)家對(duì)語音信號(hào)的特性和人耳感知聲音的機(jī)制理解更加深入,參數(shù)編碼器逐漸在語音編碼和音頻編碼領(lǐng)域成為主流。參數(shù)編碼就是指通過對(duì)信號(hào)提取若干個(gè)特征參數(shù),并對(duì)特征參數(shù)進(jìn)行量化壓縮的方法。參數(shù)編碼不以波形匹配為準(zhǔn)則,而是通過對(duì)信號(hào)中的關(guān)鍵特征進(jìn)行提取,并以高效的量化方式進(jìn)行壓縮,達(dá)到高質(zhì)量恢復(fù)信號(hào)關(guān)鍵信息的目的。因此,參數(shù)編碼器的編碼效率也要明顯高于波形編碼器。下面分別針對(duì)語音和音頻信號(hào)的參數(shù)編碼方法進(jìn)行說明。
2.2.1 語音編碼
下圖是一個(gè)碼激勵(lì)線性預(yù)測(Codebook Excitation Linear Prediction,CELP)編碼器系統(tǒng)框圖,是一個(gè)典型的參數(shù)語音編碼器。主要利用了語音信號(hào)具有短時(shí)相關(guān)性和長時(shí)相關(guān)性的特點(diǎn),使用線性預(yù)測的方法去除相鄰樣點(diǎn)間的相關(guān)性(即短時(shí)相關(guān)性),提取到線性預(yù)測(Linear Prediction Coding,LPC)系數(shù),通過分析語音信號(hào)中的長時(shí)相關(guān)性提取基音周期參數(shù),去除語音信號(hào)中的長時(shí)相關(guān)性,然后利用隨機(jī)碼書擬合隨機(jī)激勵(lì)信號(hào),通過分析合成的方式獲得最佳編碼參數(shù)。這種方式只需要對(duì) LPC 系數(shù)、基音周期、隨機(jī)碼書和兩個(gè)增益參數(shù)進(jìn)行量化壓縮,解碼端就可以恢復(fù)高質(zhì)量語音。參數(shù)編碼器只需要不到 20kbps 的碼率即可達(dá)到與 G.711@64kbps 相同的質(zhì)量,編碼效率具有明顯的優(yōu)勢。典型的編碼器有:G.729、AMR-NB 和 AMR-WB 等。
2.2.2 音頻編碼
下圖是一個(gè)典型的頻域編碼器系統(tǒng)框圖。音樂信號(hào)和自然界的聲音是通過不同的載體進(jìn)行發(fā)聲的,發(fā)聲方式也千差萬別,不太可能利用發(fā)聲方式進(jìn)行建模。換句話說,使用語音編碼的方法編碼音頻信號(hào)的編碼效率不高,編碼質(zhì)量比較差。于是科學(xué)家另辟蹊徑,通過對(duì)人耳感知聲音的方式進(jìn)行研究,發(fā)現(xiàn)人耳對(duì)不同頻率信號(hào)的感知敏感度也有所不同,因此發(fā)明了一種基于心理聲學(xué)模型的編碼器,尤其適合對(duì)音樂信號(hào)和自然界聲音的編碼。典型的編碼器有:MP3、AAC 和 HE-AAC 等。
2.3 統(tǒng)一編碼
綜上可知,語音編碼器只適合編碼語音信號(hào),音頻編碼器只適合編碼音頻信號(hào)。在實(shí)際應(yīng)用場景中,我們經(jīng)常會(huì)遇到在說話過程中會(huì)有音樂或者其他背景聲音的場景。那么是否存在一種編碼器,能夠依據(jù)信號(hào)的類型,自適應(yīng)選擇最佳編碼方式,達(dá)到最佳編碼質(zhì)量呢?答案是肯定的。統(tǒng)一編碼器采用統(tǒng)一框架高質(zhì)量編碼語音信號(hào)和音頻信號(hào),它能夠很好的解決混合語音和音樂信號(hào)的高質(zhì)量編碼問題。典型的統(tǒng)一編碼器有:Opus、EVS 和 USAC 等。
3. 自研 NICO 編碼器技術(shù)優(yōu)化
為了解決 Opus 編碼器在高丟包以及突發(fā)丟包場景中質(zhì)量變差的問題,自研 NICO 編碼器引入了多種編碼工具和創(chuàng)新技術(shù),以提高編碼器抗高隨機(jī)丟包和突發(fā)丟包的能力。另外,在提高編碼效率的同時(shí),NICO 實(shí)現(xiàn)了與 Opus 編碼器完全兼容,解決了與現(xiàn)網(wǎng) RTC 設(shè)備互聯(lián)互通的問題。
3.1 抗弱網(wǎng)編碼技術(shù)及優(yōu)化
3.1.1 多描述編碼
多描述編碼是一種專門為弱網(wǎng)場景設(shè)計(jì)的編碼技術(shù),其核心思想是“編碼器產(chǎn)生的多個(gè)描述碼流相互獨(dú)立又互為補(bǔ)充”。單個(gè)多描述碼流就可以解碼獲得完整語音,每多收到一個(gè)多描述碼流,獲得的解碼語音質(zhì)量可以得到進(jìn)一步增強(qiáng)。多描述編碼方法是一種非常適合在無可靠傳輸網(wǎng)絡(luò)場景使用的編解碼技術(shù),能夠有效減少由于丟包引起的各種音頻卡頓問題,但是在無丟包場景,其解碼質(zhì)量差于單碼流編碼器。而且,多描述編碼算法的復(fù)雜度要比單碼流編碼器高很多,多描述碼流個(gè)數(shù)越多,復(fù)雜度就會(huì)成倍增加,這也在一定程度上限制了多描述編碼技術(shù)的使用。
針對(duì)上述問題,我們?cè)谠O(shè)計(jì)多描述編碼算法時(shí),對(duì)現(xiàn)有多描述編碼技術(shù)和 Opus 編碼器中 NSQ 量化方法進(jìn)行了詳細(xì)的分析。我們發(fā)現(xiàn),現(xiàn)有算法只能做到寬帶多描述編碼,且高頻質(zhì)量明顯差于Opus,同時(shí) Opus 中 NSQ 量化方法十分復(fù)雜,基于 Opus 的多描述編碼復(fù)雜度會(huì)明顯偏高。我們通過多種技術(shù)優(yōu)化,解決了上述難題,使 NICO 支持了窄帶到全帶的多描述編碼,滿足了不同應(yīng)用場景對(duì)編碼音質(zhì)的差異化需求,同時(shí)保證了 NICO 在無丟包場景編碼質(zhì)量能對(duì)齊甚至稍優(yōu)于 Opus,在高丟包場景明顯優(yōu)于 Opus,而編碼復(fù)雜度和 Opus 相當(dāng)。
3.1.2 帶內(nèi) FEC 算法
帶內(nèi) FEC 算法是一種在當(dāng)前幀碼流中攜帶過去歷史幀碼流的一種方法,與帶外 FEC 算法相比,其減少了 RTP 頭部開銷,比特利用效率更高。當(dāng) Opus 碼流攜帶帶內(nèi) FEC 信息時(shí),如果當(dāng)前幀碼流數(shù)據(jù)丟失,解碼器可以通過解析下一幀碼流中的帶內(nèi) FEC 信息解碼當(dāng)前幀音頻。Opus 帶內(nèi) FEC 有不錯(cuò)的對(duì)抗隨機(jī)丟包的能力,但對(duì)突發(fā)丟包無能為力,開啟帶內(nèi) FEC 也會(huì)導(dǎo)致編碼復(fù)雜度明顯上升,并且其帶內(nèi) FEC 幀信息在無丟包時(shí)不會(huì)帶來額外的質(zhì)量提升,帶寬利用效率不高。在實(shí)際使用場景中,我們還發(fā)現(xiàn)帶內(nèi) FEC 占用碼率過多,影響主幀編碼質(zhì)量,會(huì)導(dǎo)致雜音的問題。
為解決上面這些問題,NICO 帶內(nèi) FEC 算法做了許多創(chuàng)新,全面優(yōu)化了編碼流程和碼率分配等環(huán)節(jié),提升了編碼效率,降低了編碼復(fù)雜度,并且在突發(fā)丟包場景,NICO 的效果遠(yuǎn)優(yōu)于 Opus。
3.1.3 丟包隱藏算法
丟包隱藏(Packet Loss Concealment,PLC)算法是指當(dāng)前幀的碼流因?yàn)槟撤N原因丟失時(shí),解碼器利用歷史解碼數(shù)據(jù)或者參數(shù)預(yù)測當(dāng)前幀解碼數(shù)據(jù)的算法。PLC 算法作為恢復(fù)丟失幀音頻的最后解決方案,是大多數(shù)音頻編碼器中常用的技術(shù),對(duì)提升丟包場景下的主觀聽感有較大作用。Opus 的 PLC 算法對(duì)丟包幀處理較為簡單,對(duì)于能量、基音周期等參數(shù)只是做簡單的衰減或者復(fù)制等操作,恢復(fù)出的音頻經(jīng)常會(huì)出現(xiàn)能量偏低、雜音等問題。NICO 對(duì)此進(jìn)行了大量改進(jìn),參考了歷史幀的變化趨勢,對(duì)于丟包幀解碼參數(shù)預(yù)測更為準(zhǔn)確,恢復(fù)的音頻聽感較 Opus 有明顯提升。
3.2 編碼質(zhì)量提升
3.2.1 帶寬擴(kuò)展算法
帶寬擴(kuò)展(BandWidth Extension,BWE)是一種使用少量比特編碼高頻信息,高質(zhì)量恢復(fù)高頻信號(hào)的算法。在 Opus 編碼器中,所采用的 BWE 技術(shù)是以填充隨機(jī)噪聲的方式恢復(fù)高頻空洞,這種方式會(huì)導(dǎo)致恢復(fù)出的高頻信號(hào)能夠聽到明顯的高頻噪聲,體驗(yàn)較差;在低碼率編碼方法中,還會(huì)使用頻譜折疊的方式恢復(fù)高頻,由于沒有考慮高頻與低頻信號(hào)的相關(guān)性,折疊后的高頻部分與原始信號(hào)往往相差較大,有時(shí)會(huì)聽到明顯的高頻量化噪聲。在 NICO 編碼器中,我們對(duì) BWE 算法進(jìn)行了改進(jìn),充分利用高頻與低頻信號(hào)的相關(guān)性優(yōu)化高頻恢復(fù)效果,提升了低碼率條件下音頻信號(hào)的恢復(fù)質(zhì)量。
下圖是低碼率 Opus 和 NICO 解碼音頻的頻譜對(duì)比??梢钥闯?,在高頻部分,Opus 使用隨機(jī)噪聲恢復(fù),而 NICO 恢復(fù)了更多的高頻細(xì)節(jié),與原始信號(hào)更為接近。
3.2.2 不連續(xù)傳輸算法
不連續(xù)傳輸(Discontinuous Transmission,DTX)是指 VAD 算法檢測到非活動(dòng)語音時(shí),編碼器會(huì)減少數(shù)據(jù)發(fā)送,只間隔性發(fā)送低字節(jié)數(shù)的靜音描述幀(Silence Insertion Descriptor,SID),達(dá)到降低編碼碼率的目的。舒適噪聲生成(Comfort Noise Generation,CNG)指的是解碼端收到 SID 幀后會(huì)依據(jù)解碼參數(shù)生成舒適噪聲,保持聽感連續(xù)。Opus 的 DTX/CNG 算法存在編解碼端 CPU 消耗偏高、VAD 算法不夠準(zhǔn)確導(dǎo)致出現(xiàn)不平穩(wěn)噪聲等問題。針對(duì)上述問題,我們對(duì) DTX/CNG 算法做了一系列優(yōu)化,改進(jìn)了編碼端 VAD 算法和編解碼處理邏輯,解決了舒適噪聲不平穩(wěn)問題,還大幅降低了 DTX 段編碼端與解碼端的 CPU 消耗。
以下是 Opus 和 NICO 解碼帶噪語音的效果對(duì)比,Opus 解碼音頻在噪聲段不夠平穩(wěn),而 NICO 解碼音頻噪聲段能量平穩(wěn),聽感更佳。
3.2.3 動(dòng)態(tài)模式切換
在實(shí)際通話過程中,用戶的網(wǎng)絡(luò)狀況可能比較復(fù)雜。為了在各種網(wǎng)絡(luò)狀況下獲得最佳通話質(zhì)量,我們?cè)O(shè)計(jì)了動(dòng)態(tài)模式切換功能。編碼器可以依據(jù)網(wǎng)絡(luò)反饋的網(wǎng)絡(luò)狀態(tài)信息自適應(yīng)調(diào)整編碼模式。當(dāng)用戶網(wǎng)絡(luò)狀況很好時(shí),編碼器基于網(wǎng)絡(luò)反饋的丟包率信息自動(dòng)切換到 Opus 編碼模式,以獲得更優(yōu)語音通話質(zhì)量;當(dāng)用戶網(wǎng)絡(luò)狀況變差時(shí),編碼器基于網(wǎng)絡(luò)反饋的丟包率以及帶寬等信息,從 Opus 編碼動(dòng)態(tài)平滑切換到 NICO 模式編碼,提升編碼器的抗丟包能力。
3.3 兼容 WebRTC 的設(shè)計(jì)
傳統(tǒng)方案中,讓具有不同編碼器能力的終端進(jìn)行通信,往往需要服務(wù)器進(jìn)行轉(zhuǎn)碼再轉(zhuǎn)發(fā)的操作,而轉(zhuǎn)碼操作會(huì)造成音質(zhì)下降、復(fù)雜度增加和延時(shí)變長等問題。NICO 編碼器通過獨(dú)特的碼流設(shè)計(jì),使得 NICO 的碼流與 Opus 完全兼容。換句話說,具有 NICO 編碼能力的客戶端能和 Web 端等原生 WebRTC 應(yīng)用直接進(jìn)行互通,不僅規(guī)避了轉(zhuǎn)碼服務(wù)器帶來的各種問題,還拓展了 NICO 的應(yīng)用領(lǐng)域,在 P2P 通信和不同廠商間互聯(lián)互通等場景都能無障礙使用 NICO。
為了達(dá)到與原生 Opus 完全兼容的目的,NICO 的碼流結(jié)構(gòu)和 Opus 完全一致。當(dāng)只有 Opus 解碼能力的終端在接收到 NICO 的碼流時(shí),也能解碼出正常質(zhì)量的語音,聽感較解碼原生 Opus 的碼流無明顯差異;而具有 NICO 解碼能力的終端解析 NICO 的碼流時(shí),便能使用到 NICO 的抗丟包能力,在丟包場景下達(dá)到遠(yuǎn)優(yōu)于 Opus 的效果。
以下三段音頻分別是原始音頻、使用 Opus 編解碼音頻和使用 NICO 編碼 Opus 解碼的音頻,可以感受到,對(duì)于相同音頻序列,使用 NICO 編碼的碼流被 Opus 解析時(shí),解碼音質(zhì)較 Opus 編解碼幾乎無差異。
- 原始音頻 A音頻:00:0000:15?
- Opus 編解碼音頻音頻:00:0000:15?
- NICO 編碼-Opus 解碼音頻音頻:00:0000:15?
3.4 復(fù)雜度優(yōu)化
為提升抗丟包能力并完全兼容 Opus 碼流,NICO 編碼器做了非常多的技術(shù)創(chuàng)新和改進(jìn),同時(shí)對(duì)復(fù)雜度也做了很多優(yōu)化工作,達(dá)到對(duì)齊 Opus 的水平。這些優(yōu)化工作在保證質(zhì)量的同時(shí)降低了 NICO 的復(fù)雜度,確保 NICO 在低端機(jī)器上都能夠流暢運(yùn)行。
下圖為 NICO 和 Opus 編碼器 CPU 消耗對(duì)比結(jié)果,測試采用了實(shí)時(shí)率(Real-Time Factor,RTF)作為 CPU 消耗衡量指標(biāo)。在 iPhone Xs Max 手機(jī)上,NICO 在優(yōu)化特性都開啟的情況下,CPU 消耗相較于 Opus 關(guān)閉帶內(nèi) FEC 增加了9%,而相較于 Opus 打開帶內(nèi) FEC 降低接近 15%。
3.5 質(zhì)量對(duì)比
我們?cè)u(píng)估了 NICO 與 Opus 開啟帶內(nèi) FEC 在同等碼率、無丟包、隨機(jī)丟包 30%、40% 和突發(fā)丟包 25% 測試條件下的 POLQA 打分。結(jié)果顯示,Opus 解碼音頻質(zhì)量隨著丟包率的增加有明顯下降,在突發(fā)丟包場景下,更是降到 2 分以內(nèi)。NICO 解碼音頻隨著丟包率的增加,MOS 分有一定程度下降,但下降緩慢且明顯優(yōu)于 Opus。在突發(fā)丟包 25% 時(shí),NICO 的 MOS 分接近 4 分,遠(yuǎn)遠(yuǎn)好于 Opus。
下面是 Opus 和 NICO 在 40% 隨機(jī)丟包和 25% 突發(fā)丟包條件下的頻譜對(duì)比示意圖。從頻譜圖上來看,Opus 在隨機(jī)丟包場景會(huì)頻繁出現(xiàn)因 PLC 造成的能量衰減、頻譜能量不連續(xù)的情況,而 NICO 的頻譜恢復(fù)效果更好,有更好的連續(xù)性,沒有明顯的頻譜上的損傷。
在突發(fā)丟包場景,Opus 解碼音頻會(huì)出現(xiàn)語音聽感明顯不連續(xù)、卡頓掉字等現(xiàn)象,而 NICO 解碼音頻的連續(xù)性非常好,無任何卡頓。
以下為一條音頻序列的測試結(jié)果,感興趣的朋友可以自行體驗(yàn)效果差異。
- 原始音頻 B音頻:00:0000:15?
- Opus 40%隨機(jī)丟包解碼音頻音頻:00:0000:15?
- NICO 40%隨機(jī)丟包解碼音頻音頻:00:0000:15?
- Opus 25%突發(fā)丟包解碼音頻音頻:00:0000:15?
- NICO 25%突發(fā)丟包解碼音頻音頻:00:0000:15?
3.6 小結(jié)
可以看出,相較于帶外 FEC、重傳等網(wǎng)絡(luò)策略,提升編碼器抗弱網(wǎng)能力和編碼質(zhì)量是解決音頻弱網(wǎng)痛點(diǎn)問題性價(jià)比更優(yōu)的方案。相比業(yè)界已有方案,NICO 編碼器的技術(shù)優(yōu)化和創(chuàng)新工作具有以下幾項(xiàng)優(yōu)點(diǎn):
- 全面支持窄帶到全帶多描述編碼,滿足不同業(yè)務(wù)場景對(duì)編碼音質(zhì)的差異化需求,改進(jìn)帶內(nèi) FEC 和 PLC 算法,在高丟包與突發(fā)丟包場景,弱網(wǎng)抗性明顯優(yōu)于 Opus 編碼器;
- 改進(jìn) BWE、DTX 和 CNG 等算法,提出動(dòng)態(tài)編碼模式切換方法,明顯提升編碼質(zhì)量;
- 獨(dú)特的碼流設(shè)計(jì)完全兼容 Opus,確保 NICO 終端與 WebRTC 終端以及不同 RTC 廠商互聯(lián)互通,降低了端到端兼容性改造成本;
- 高效優(yōu)化編碼復(fù)雜度,保障在高中低端機(jī)上均可以流暢運(yùn)行,使用火山引擎 RTC 應(yīng)用的用戶都能享受到 NICO 帶來的質(zhì)量提升。
4. 未來展望
目前,NICO 主要針對(duì)通話場景做了大量優(yōu)化工作,提升了弱網(wǎng)場景的音頻體驗(yàn),后續(xù)我們會(huì)將其拓展到其它場景,例如直播、連麥和空間音頻傳輸?shù)?。同時(shí),AI 技術(shù)為編解碼器方向帶來了技術(shù)革新,未來有潛力在復(fù)雜度可控和超低碼率條件下實(shí)現(xiàn)高清音頻通話,進(jìn)一步提升用戶在弱網(wǎng)場景下的通話體驗(yàn),我們將密切關(guān)注業(yè)界相關(guān)技術(shù)的進(jìn)展,不斷提升火山引擎 RTC 語音相關(guān)技術(shù)的能力上限。
參考資料
Recommendation G.711 (11/1988): Pulse code modulation (PCM) of voice frequencies
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
Andreas S., Ted Painter.Audio Signal Processing and Coding ,2007, Wiley-Interscience
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
J.M. Valin, RFC 6716: Definition of the Opus Audio Codec, 2012
V.K. Goyal. Multiple description coding: compression meets the network, 2002,IEEE Signal Processing Magazine
H Sanneck, A Stenger, A new technique for audio packet loss concealment. Proceedings of GLOBECOM'96