本文分享了聲網(wǎng)Agora 首席音頻工匠高澤華在 RTC 2018 實(shí)時(shí)互聯(lián)網(wǎng)大會(huì)上,以《SOLO X?:兼容 WebRTC 標(biāo)準(zhǔn)的抗丟包語(yǔ)音編碼器》為題的演講。主要介紹了聲網(wǎng)推出的抗丟包語(yǔ)音編碼器 Agora SOLO? 的算法特點(diǎn),以及第二代編解碼器 Agora SOLO X? 的新特性與測(cè)試效果。以下為演講實(shí)錄。
去年,我們?cè)?RTC 大會(huì)上分享了自主研發(fā)的抗丟包編解碼方案 Agora SOLO? ,主要是面向抗丟包網(wǎng)絡(luò),解決實(shí)時(shí)通信傳輸 last mile 的問(wèn)題。
1
關(guān)于Agora SOLO?
有時(shí),大家對(duì)丟包問(wèn)題會(huì)有一些誤解。很多人認(rèn)為隨著 4G 的普及和 5G 的建設(shè),是不是丟包問(wèn)題變得不重要了?我認(rèn)為并不是這樣,因?yàn)樵诂F(xiàn)有網(wǎng)絡(luò)條件下,不論是 server 到 server,還是 sever 到 last mile 都存在著大量的丟包問(wèn)題。
我們談到丟包就涉及到丟包的概念,到底什么叫做丟包?其實(shí)任何沒(méi)有按時(shí)到達(dá)的包都是丟包。如果把一個(gè)包的延時(shí)拉到足夠大,一般來(lái)說(shuō),我們可以通過(guò)無(wú)數(shù)次重傳來(lái)解決丟包問(wèn)題。如果這個(gè)包沒(méi)有在規(guī)定的時(shí)間到達(dá),都算丟包。而且,丟包也不一定是網(wǎng)絡(luò)原因?qū)е?,有時(shí)候是由于系統(tǒng)的調(diào)度等原因造成。
舉個(gè)例子。通常,Android 系統(tǒng)上播放線程、解碼線程和收包線程都可以不是一個(gè)線程。Android 并不是特別實(shí)時(shí)的操作系統(tǒng)。一旦系統(tǒng)比較忙的時(shí)候,就容易產(chǎn)生收包線程和解碼線程的沖突,導(dǎo)致丟包產(chǎn)生。而這種丟包是由于系統(tǒng)產(chǎn)生的。甚至在解碼時(shí),解碼器完成解碼后交給播放器播放,其中的 buffer 也會(huì)導(dǎo)致卡頓。
丟包也與帶寬限制相關(guān)。如果帶寬足夠大,可以通過(guò)無(wú)數(shù)次重傳來(lái)實(shí)現(xiàn)抗丟包效果。但如果帶寬很有限,就不能完全依靠無(wú)限制的重傳來(lái)實(shí)現(xiàn)抗丟包效果。
比如說(shuō),曾經(jīng)聯(lián)通做過(guò)這樣的事情,流量包月,但每個(gè)月的帶寬只能在 128kbps,滿足你對(duì)網(wǎng)頁(yè)和音視頻的基本需求。在這種服務(wù)下,如果你開(kāi)一些高性能或者大碼率的信源通訊的時(shí)候就會(huì)產(chǎn)生帶寬擁塞,帶寬擁塞首先導(dǎo)致延時(shí)增加,下一步就會(huì)產(chǎn)生丟包。所以,實(shí)際上帶寬和丟包也相關(guān)。
由于我們聲網(wǎng)在全球布網(wǎng),非洲、東南亞、中東和印度的網(wǎng)絡(luò)狀況與中國(guó)的網(wǎng)絡(luò)狀況相差還比較遠(yuǎn)。即使在中國(guó)的網(wǎng)絡(luò)環(huán)境下,上海和偏遠(yuǎn)地區(qū)的網(wǎng)絡(luò)狀況也是不一樣的。所以,并不是以后上了 5G 就不存在丟包問(wèn)題了,相反,我認(rèn)為隨著網(wǎng)絡(luò)的差異化會(huì)導(dǎo)致丟包的問(wèn)題變得越來(lái)越普遍。
舉一個(gè)例子,描述一下什么情況會(huì)產(chǎn)生丟包?如上圖所示為典型的丟包模型,device 1 與 device 2、device 3、device 4 進(jìn)行通信。比如,device 1,把 packet 1、packet 2、packet 3 一起發(fā)給 device 2,packet 1、packet 2、packet 3 丟了一個(gè)包是 packet 2。在這個(gè)時(shí)間窗口計(jì)算丟包率時(shí),當(dāng)前的丟包率是 33%。此時(shí) device 2 會(huì)給 device 1 發(fā)回一個(gè)回傳控制,即 loss info,loss info 帶上丟包率是 33% 的信息。根據(jù)這個(gè)信息,device 1 會(huì)重新對(duì) device 2 進(jìn)行抗丟包的處理,發(fā)兩個(gè) packet 4 和兩個(gè) packet 5。那么,當(dāng)丟了一個(gè) packet 4 時(shí),還有一個(gè) packet 4 可以起到抗丟包的效果。也就是說(shuō),在整個(gè)系統(tǒng)中,在第一個(gè)時(shí)間窗口,packet 1、packet 2、packet 3,在這 3 個(gè)包內(nèi)算丟包率,再把丟包率回傳到 device 1,由 device 1 根據(jù)丟包率的信息,去發(fā)送抗丟包的冗余。
在其中,我們會(huì)發(fā)現(xiàn)幾個(gè)問(wèn)題。第一是時(shí)間窗口問(wèn)題。如果按照 3 個(gè)時(shí)間窗口來(lái)算,丟包率是 33%。如果按照 4 個(gè)時(shí)間窗口算,丟包率是 25%。如果按照 2 個(gè)時(shí)間窗口算,丟包率是 50%。這就產(chǎn)生一個(gè)問(wèn)題,即丟包率算的其實(shí)沒(méi)有那么準(zhǔn)。
第二,device 2 接收到 device 1 發(fā)送的包之后,會(huì)回傳一個(gè) loss info 給 device 1。一般來(lái)講,loss info 中會(huì)加入一些 FEC 的控制,保證它不會(huì)被丟。但實(shí)際上 loss info 的包仍可能會(huì)丟失。
我們假設(shè)上述情況中 loss info 沒(méi)有丟包,device 1 發(fā)送冗余的包給 device 2,譬如發(fā)送兩個(gè) packet 4 和兩個(gè) packet 5。由于此時(shí)的丟包率是 33%。那么 packet 4 丟掉之后,對(duì)于 packet 4 來(lái)說(shuō),起到了抗丟包的效果,但是對(duì)于 packet 5 來(lái)說(shuō),發(fā)的兩個(gè) packet 5 并沒(méi)有起到抗丟包的效果,這對(duì)網(wǎng)絡(luò)帶寬是浪費(fèi)的。
再假設(shè)前面窗口也取準(zhǔn)了,loss info 也沒(méi)有丟,packet 4、packet 5 也都取得了抗丟包的效果,還是會(huì)存在一個(gè)問(wèn)題。在回傳的信道中已經(jīng)有很長(zhǎng)的 RTT 在里面,發(fā)過(guò)去一個(gè)包,device 2 進(jìn)行估算,估算后,再發(fā)送一個(gè) loss info 回到 device 1。如果 RTT 太長(zhǎng),發(fā)包的過(guò)程中還是會(huì)不斷出現(xiàn)丟包。也就是在長(zhǎng) RTT 的情況下,這種抗丟包方案的效果是比較有限,或者可以說(shuō)存在一些缺陷。
我們還可以假設(shè)以上問(wèn)題都不存在。在多人通話中,每個(gè)設(shè)備接收端的網(wǎng)絡(luò)環(huán)境不同,假設(shè) device 1 與 device 2 之間是 3G 或有損的 Wi-Fi 環(huán)境,而 device 3、device 4 分別使用 4G、5G。那么,device 1 在處理loss info 時(shí)應(yīng)該采取什么策略呢?如果都加入 FEC 的話,就意味著浪費(fèi)了 device 3 和 device 4 的帶寬,但如果不想浪費(fèi)帶寬,沒(méi)有 FEC ,就意味著無(wú)法實(shí)現(xiàn)對(duì) device 2 的抗丟包效果。
所以在多人環(huán)境下,網(wǎng)絡(luò)帶寬的差異化是做網(wǎng)絡(luò)策略時(shí)要考慮的重要因素。同時(shí),還有一些人為或成本因素需要我們?cè)谧鼍W(wǎng)絡(luò)策略時(shí)進(jìn)行綜合考慮。例如,在中國(guó)與印度之間進(jìn)行實(shí)時(shí)通信時(shí),其中一個(gè) server 在印度當(dāng)?shù)?,可以直接與中國(guó)的 server 進(jìn)行連接。但印度的通信成本較高,會(huì)產(chǎn)生一定的資費(fèi)。這時(shí)我們可以選擇通過(guò)新加坡的 server 繞個(gè)遠(yuǎn),但這個(gè)過(guò)程又會(huì)產(chǎn)生一些丟包問(wèn)題。
2
Agora SOLO? 的優(yōu)勢(shì)在哪兒?
在多人環(huán)境下,傳統(tǒng)的抗丟包策略無(wú)法很好解決這類問(wèn)題,所以聲網(wǎng)在去年 10 月份推出了一個(gè)新的編碼器叫 Agora SOLO?。
一段音頻信號(hào)通過(guò) Agora SOLO? 處理后,會(huì)生成兩個(gè)成對(duì)的包 packet 1 和 packet 2 ,它們?yōu)橥粠⑶一パa(bǔ)。即我收到一個(gè) packet 1 的時(shí)候,我可以解碼出一個(gè) 8kbps 的窄帶音頻信號(hào),如果我收到一個(gè) packet 2,也可以解碼出一個(gè) 8kbps 的窄帶音頻信號(hào),但如果我同時(shí)收到一個(gè)packet1 和一個(gè)packet 2,我就可以恢復(fù)出一個(gè) 16kbps 的寬帶高質(zhì)量音頻信號(hào)。
一定程度上講,這個(gè)編解碼器可以解決剛才提到的 FEC 遇到的所有抗丟包的策略問(wèn)題。
通常,編解碼器做的事情是壓縮、去冗余,而抗丟包從一定程度上講是信道處理的擴(kuò)大化。抗丟包是一種糾錯(cuò)算法的擴(kuò)展,通過(guò)加冗余實(shí)現(xiàn)抗丟包。而對(duì)于 Agora SOLO? 來(lái)說(shuō),是把去冗余和加冗余進(jìn)行結(jié)合,對(duì)重點(diǎn)信息加冗余,對(duì)非重點(diǎn)信息則更多的去冗余,以達(dá)到在信道和信源的聯(lián)合編碼的效果。
我們強(qiáng)調(diào)了在編碼器上加一定的冗余去抗丟包,實(shí)際上就會(huì)帶來(lái)一些編碼效率的降低。但這種情況下,我們可以通過(guò)增加一些新的算法,減少編碼效率的降低。并且,和原始的 codec 編碼效率相比,從結(jié)果上看還要更好一些。
上圖是我們用 ITU NTT 的中文測(cè)試序列跑的測(cè)試結(jié)果。稍微介紹一下,ITU 的 NTT 是標(biāo)準(zhǔn)的編解碼器測(cè)試序列,里面有 26 國(guó)語(yǔ)言,這里只拿出了中文部分的測(cè)試結(jié)果。那么橫坐標(biāo)內(nèi)的 PESQ 是窄帶編碼器的客觀測(cè)試標(biāo)準(zhǔn),最后一列,PESQ-WB 是寬帶編解碼的客觀測(cè)試標(biāo)準(zhǔn),滿分是 5 分,通常打到 4 分就是完美了。后面有我們這個(gè)編碼器與一些傳統(tǒng)編碼器在 PESQ 分?jǐn)?shù)的對(duì)比。
我們可以看到,是只收到 8kbps 的 packet 1, PESQ 的 MOS 分是 3.52 分。如果只收到 packet2,MOS 分是 3.51 分。如果 packet1 和 packet2 都收到,在16kbps 時(shí),MOS 分是 3.95 分。以上是窄帶的分?jǐn)?shù)。寬帶下的 PESQ 的 MOS 分是 3.582 分。
用新的編碼器后,我們?cè)倏匆幌滤男Ч?。此時(shí)就不需要再考慮是否加 loss info,我們可以直接從 device 1 給所有的 device 2、device 3、device 4 發(fā) packet 1、packet 1’、packet 2、packet 2’、packet 3、packet 3’的包。
為什么可以這樣做?因?yàn)閷?shí)際上,如果 packet 1 或者 packet 1’ 丟包,不會(huì)有太大影響,你仍然可以恢復(fù)出一個(gè)有限的 8kbps 質(zhì)量的音頻數(shù)據(jù)。如果沒(méi)有丟包,收到了 packet 1、packet 1',就可以恢復(fù)出 16kbps 的音頻數(shù)據(jù),其中并沒(méi)有任何的冗余信息。這種算法不像原來(lái)的 FEC,兩個(gè)包完全相等,或者一大一小,那會(huì)造成帶寬浪費(fèi)。這種算法不會(huì)造成帶寬浪費(fèi),那么你就無(wú)需考慮以下問(wèn)題:
第一,延時(shí)問(wèn)題;
第二,回傳 loss info 的丟包問(wèn)題;
第三,多人通信中,每個(gè)網(wǎng)絡(luò)帶寬不一致的問(wèn)題。
總體來(lái)說(shuō),這個(gè)編碼器被我稱為接近完美的抗丟包編解碼,因?yàn)闆](méi)有完美的編解碼器。
Agora SOLO? 有如下四個(gè)特點(diǎn):
第一,更低延時(shí)。無(wú)需回傳信道丟包信息,默認(rèn)發(fā)送多倍數(shù)據(jù);
第二,更高質(zhì)量。收到一個(gè)包質(zhì)量可達(dá)到普通編解碼器水平,收到兩個(gè)包質(zhì)量即可達(dá)到高質(zhì)量編解碼的水平;
第三,面向多人環(huán)境;
第四,簡(jiǎn)化策略。無(wú)需策略調(diào)整,不擔(dān)心策略顆粒度問(wèn)題。
所以從抗丟包的四種方法(FEC、PLC、ARC、ARQ)來(lái)看,需要想盡各種辦法去做 balance。但有了這種方法后,你無(wú)需考慮太多,直接調(diào)用即可。另外在有限的成本下,如果同時(shí)使用一條高質(zhì)量的高成本的服務(wù)器的帶寬和一條低成本相對(duì)有丟包下的帶寬時(shí),你可以發(fā)兩條流,分別是 packet 1 和 packet 1’,這樣可以起到更好的效果。
如上圖所示,是我們做的 Agora SOLO? 和其他編碼器的對(duì)比。從圖中我們可以很快發(fā)現(xiàn)ILBC 和 AMR-NB 的 MOS 分比較低,這是由于它們倆是上個(gè)時(shí)代的編碼器,因此屬于正?,F(xiàn)象。
SILK 和 Opus 的 MOS 分比較高,但我們會(huì)發(fā)現(xiàn) SILK+FEC20 時(shí),基礎(chǔ) MOS 分會(huì)下降得非常厲害,因?yàn)槟靡徊糠謳捜プ鋈哂嗑蜁?huì)導(dǎo)致基礎(chǔ) MOS 分下降。
而 Opus+FEC20 時(shí),實(shí)際上編不出在丟包 5% 時(shí)的碼率,因?yàn)榇a率控制的設(shè)計(jì)相對(duì)比較保守。但我們可以看到它加 FEC20 后,基礎(chǔ) MOS 分在下降。
而 Agora SOLO? 的基礎(chǔ) MOS 分和 SILK、Opus 幾乎一樣,下降在 0.2 之內(nèi)。而它在抗丟包時(shí),一旦發(fā)生丟包,幾乎沒(méi)有 MOS 分下降。在丟包 5%、10%、15%、20% 時(shí),它的 MOS 分維持在一個(gè)相對(duì)穩(wěn)定的情況,和競(jìng)品比有時(shí)候可以達(dá)到 1 分的差距。
做過(guò)通信 MOS 分競(jìng)品比較的人應(yīng)該知道,高 0.3-0.5 分已經(jīng)是非常困難,高 1 分幾乎是不可能。以 20% 為例,Agora SOLO? 的 MOS 分是 3.2,而 SILK 卻只有 2.2 和 2.3,雖然加上 FEC20 后是 3.0,但加上 FEC 后 SILK 的基礎(chǔ) MOS 分會(huì)比較低。
這是 ITU NTT 的中文測(cè)試第一條序列——女聲。女聲相對(duì)來(lái)說(shuō)比較難編,因?yàn)橹袊?guó)人說(shuō)話有四聲問(wèn)題,比其他語(yǔ)言更復(fù)雜。女聲的高頻信息比男聲更豐富,所以編起來(lái)也會(huì)更難。
由圖可知,SILK16 的 MOS 分是 3.5,SILK16+FEC 編不出來(lái),Opus16 的 MOS 分是 3.5,Opus16+20FEC 的 MOS 分是 3.3,Opus20+20FEC 的 MOS 分是 2.8。雖然碼率更高了,但由于帶寬原因,給 FEC 的碼率更高,它的內(nèi)核碼率反而更低,所以它的基礎(chǔ) MOS 分變得很低。
而 Agora SOLO? 的 基礎(chǔ) MOS 分是 3.5,在不丟包的情況下它和 Opus16 和 SILK16 的 MOS 分基本一致。在丟包的情況下,以 20% 為例,它的 MOS 分是 2.5,比其他都高,這就是 Agora SOLO?。
3
Agora SOLO? 的模擬測(cè)試結(jié)果
我們不僅做了線下 ITU 的網(wǎng)損測(cè)試,還做了線上的模擬測(cè)試。如上圖所示,我們用兩臺(tái) iPhone 去做模擬丟包的測(cè)試,device A 經(jīng)過(guò) Wi-Fi、內(nèi)網(wǎng) VOS 和 Wi-Fi,去和 device B 通信。
這是我們的測(cè)試結(jié)果。紅色是丟包率,綠色是丟幀率。從圖中我們可以看到,丟包率原本是 50% 左右,經(jīng)過(guò) Agora SOLO? 之后,它的丟幀率只剩 20%。NOVA 是我們的另一個(gè)編碼器,它的丟包率和丟幀率都是 50%,沒(méi)有做任何的 FEC。
當(dāng)采用一包兩幀策略做抗丟包的時(shí)候,在 20% 的丟包率下,Agora SOLO? 基本沒(méi)有丟幀的產(chǎn)生。而傳統(tǒng)的編碼器下,丟幀率還是有一定的損失。
4
兼容 WebRTC 標(biāo)準(zhǔn)的抗丟包語(yǔ)音編碼器SOLO X?
過(guò)去一年里,我們把 Agora SOLO? 編碼器的抗丟包部分移植到了 OPUS 上,我們給這個(gè)技術(shù)起了一個(gè)新的名字叫分組譜互補(bǔ)技術(shù),并開(kāi)發(fā)了一個(gè)新的編碼器叫SOLO X?。
SOLO X?算法和 SOLO? 是一樣的,那我們直接看結(jié)果上的差異。
16kbps 時(shí),我們可以看到 SOLO X?的 MOS 分會(huì)下降到 3.2。它的抗丟包的效果在 20% 的時(shí)候是 2.4,和 Agora SOLO? 差不多,比 Opus20 和 Opus16 都要好。
如果是 20kbps 時(shí),它的 MOS 分是 3.46。在丟包 20% 時(shí),它的 MOS 分是 2.6 ,還是比 Opus16+20FEC、Opus20+20FEC 的效果好,基礎(chǔ) MOS 分也高。
它的優(yōu)勢(shì)主要是和 OPUS 結(jié)合后,可以與 OPUS 互相兼容。用聲網(wǎng) Native 的 SDK 和 WebRTC 的 SDK 進(jìn)行互通時(shí),如果它支持 SOLO X? 編碼器,它就可以解出兩條更高質(zhì)量的流。而為了做到兼容,會(huì)有一些質(zhì)量損失,導(dǎo)致SOLO X? 在 16kbps 的 MOS 分比 SOLO? 要下降一些,這也是我們后期優(yōu)化的主要方向。
對(duì)于 8kHz 來(lái)看,為了起到兼容的效果,它的基礎(chǔ) MOS 分也有下降,但是它的抗丟包效果沒(méi)有明顯下降。
圖:SOLO X? 在 ITU NTT 的跑分結(jié)果
和 WebRTC 做兼容后,我們對(duì) WebRTC 的互通做了測(cè)試。 googDecodingPLC 的意義是加了網(wǎng)損后,當(dāng)外邊沒(méi)有收到包時(shí),會(huì)調(diào)用 googDecodingPLC 函數(shù)去解碼,做后端的抗丟包補(bǔ)償。圖中右側(cè)縱軸的單位是幀,即這段時(shí)間內(nèi)補(bǔ)償了多少幀來(lái)做抗丟包。如果我們實(shí)現(xiàn)了抗丟包的效果,則不用調(diào)大量后端 PLC 做補(bǔ)償。
從上圖數(shù)據(jù)可以看到,在只使用 OPUS 編碼器時(shí),在 20% 和 40% 的丟包模擬下,可以看到 5 分鐘以內(nèi)補(bǔ)償幀數(shù)分別在 6 千次和 11 千次左右。用SOLO X? 時(shí),20% 丟包的情況下,補(bǔ)償幀只有 1K 多一點(diǎn)。40% 丟包時(shí),丟包補(bǔ)償幀只有 4K 左右,可以看到明顯下降,這意味著已經(jīng)有更多的包到達(dá)解碼端,不需要調(diào)用 PLC 做補(bǔ)償。
5
SOLO X? 和 WebRTC 互通中的數(shù)據(jù)表現(xiàn)
如上圖所示,是我們?cè)诩嫒菽J胶头羌嫒菽J较碌?PESQ-MOS 分。前面給的數(shù)據(jù)都是兼容 Opus 編碼器的 MOS 分,而非兼容模式下 PESQ-MOS 分可以做的更高。
實(shí)際上這張圖也是 PESQ-WB 的 MOS 分,理論上,我們應(yīng)該用 POLQA 去比分,那么在 48kHz,48kbps 和 32kHz,32kps 去比,MOS 分的差異和影響對(duì)比會(huì)更大。因?yàn)閷?duì)高頻的權(quán)重越高,一旦有損失就會(huì)導(dǎo)致分比較低。這也是為什么幾乎相同的對(duì)比策略和解碼輸出, PESQ-WB 的分比 PESQ 的分要低的原因。
在非兼容模式下,它的 MOS 分會(huì)遠(yuǎn)遠(yuǎn)高于兼容模式。后期我們會(huì)針對(duì)兼容模式進(jìn)行優(yōu)化,我覺(jué)得是有機(jī)會(huì)達(dá)到接近非兼容模式時(shí)的效果的。
6
Agora SOLO? 的下一步
2017 年,我們花了兩年時(shí)間把 SOLO? 的編碼器做了出來(lái),今年做 SOLO X? 目的是與 OPUS 互通,目前主要做 Voice 這一塊,計(jì)劃 2019 年推出針對(duì)音樂(lè)的編碼器,相信效果會(huì)更突出,因?yàn)橐魳?lè)在實(shí)際產(chǎn)生中都是使用 128k 或者 196K 的碼率,這種碼率下做 FEC 的代價(jià)會(huì)非常非常高。
最后我想說(shuō),對(duì)創(chuàng)業(yè)公司來(lái)說(shuō)花大力氣做編解碼是很吃虧的事情。因?yàn)樽鼍幋a器很累,也很苦,普通公司通常不會(huì)去做。所以我很感謝聲網(wǎng)給我這個(gè)機(jī)會(huì),也感謝 Tony 的鼓勵(lì)。坦白講,無(wú)數(shù)的不眠之夜,整夜整夜的失眠才做出了 Agora SOLO? 和 SOLO X?。
-
編碼器
+關(guān)注
關(guān)注
45文章
3638瀏覽量
134426 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7553瀏覽量
88729 -
5G
+關(guān)注
關(guān)注
1354文章
48436瀏覽量
563961
原文標(biāo)題:Agora SOLO X?:兼容 WebRTC 標(biāo)準(zhǔn)的抗丟包語(yǔ)音編碼器
文章出處:【微信號(hào):shengwang-agora,微信公眾號(hào):聲網(wǎng)Agora】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論