游戲語(yǔ)音視頻SDK如何解決回聲消除難題
社交網(wǎng)絡(luò)一路走來(lái),先是文字 + 表情,接著是圖片 + 短視頻,現(xiàn)在是音視頻社交強(qiáng)勢(shì)崛起并成為潮流的時(shí)代。音視頻社交將是社交網(wǎng)絡(luò)的發(fā)展趨勢(shì),畢竟音視頻才是人類最自然的社交方式。在自然的社交環(huán)境中,回聲是十分影響溝通體驗(yàn)的。而回聲消除一直是音視頻技術(shù)的難點(diǎn)。
游戲語(yǔ)音就是音視頻社交在游戲領(lǐng)域的一個(gè)典型的應(yīng)用。如果你不希望討厭戴耳機(jī)的用戶放棄你的游戲,那么在游戲?qū)崟r(shí)語(yǔ)音中實(shí)現(xiàn)回聲消除是必須的。
無(wú)論是競(jìng)技類還是休閑類的游戲,游戲?qū)崟r(shí)語(yǔ)音都成了標(biāo)配。競(jìng)技類的游戲,包括 MMORPG、MOBA、和 FPS,需要快節(jié)奏和高頻率的團(tuán)隊(duì)協(xié)同,游戲語(yǔ)音就像戰(zhàn)時(shí)通訊裝備一樣必不可少。休閑類的游戲,包括棋牌和狼人殺,需要慢節(jié)奏但是零距離的在線社交,玩家在通過(guò)游戲建立的社交紐帶中進(jìn)行多人實(shí)時(shí)聊天,游戲?qū)崟r(shí)語(yǔ)音讓玩家們像坐在同一個(gè)房間玩牌一樣。
在業(yè)界,回聲消除技術(shù)是公認(rèn)難啃的硬骨頭。它本質(zhì)上是一個(gè)復(fù)雜的數(shù)學(xué)問(wèn)題的工程化。音頻工程師往往是數(shù)學(xué)或者物理專業(yè)而不是計(jì)算機(jī)專業(yè)出身的,沒(méi)有過(guò)相關(guān)經(jīng)驗(yàn)的工程師根本就無(wú)從下手?;芈曄夹g(shù)做得比較好的產(chǎn)品有 Tencent QQ 和 Microsoft Skype,開(kāi)源的項(xiàng)目有 WebRTC 和 Speex。在這些開(kāi)源項(xiàng)目之前,回聲消除技術(shù)是大廠的獨(dú)門(mén)武藝,其它團(tuán)隊(duì)只能靠自己一點(diǎn)一滴地摸索積累。在這些開(kāi)源項(xiàng)目之后,WebRTC 和 Speex 提供開(kāi)源的 AEC 模塊,成為業(yè)界不錯(cuò)的教材。
AEC 的原理
回聲消除的原理很多文章介紹過(guò),這里只簡(jiǎn)單介紹筆者在工作中的實(shí)踐。簡(jiǎn)單地來(lái)說(shuō),遠(yuǎn)端的聲音信號(hào)首先通過(guò)揚(yáng)聲器播放出來(lái),然后在房間中經(jīng)過(guò)多個(gè)傳播和反射路徑,最后和近端的聲音一起被麥克風(fēng)采集進(jìn)去。如果沒(méi)有做回聲消除處理,那么遠(yuǎn)端就會(huì)把重新采集進(jìn)去的遠(yuǎn)端聲音信號(hào)播放出來(lái),而且和原始的遠(yuǎn)端聲音有一定的延遲時(shí)間。這就是回聲產(chǎn)生的原理。
要消除回聲,其實(shí)真的很難。這有點(diǎn)像把紅墨水倒進(jìn)藍(lán)墨水里,混合在一起,然后要求把紅墨水從藍(lán)墨水中分離出來(lái)。對(duì)于采集端來(lái)說(shuō),無(wú)論是近端的聲音,還是揚(yáng)聲器播放出來(lái)的聲音,都是從空氣中無(wú)差別地采集到的聲音。對(duì)機(jī)器來(lái)說(shuō),遠(yuǎn)端信號(hào)播放出來(lái)的聲音和近端的聲音是沒(méi)有任何區(qū)別的,就像對(duì)水來(lái)說(shuō)紅墨水和藍(lán)墨水沒(méi)有區(qū)別一樣。回聲消除的工作就是要把沒(méi)有任何區(qū)別的遠(yuǎn)端回聲和近端聲音分離。這項(xiàng)工作其實(shí)比想象中要難得多。
幸運(yùn)的是,我們并非沒(méi)有任何辦法可以找到遠(yuǎn)端回聲和近端聲音的邊界。
遠(yuǎn)端的聲音信號(hào)和回聲是相關(guān)的。也許有朋友會(huì)一拍腦袋煥然大悟地說(shuō):那就直接把遠(yuǎn)端聲音從采集到的聲音中減掉就可以了。然而事情并沒(méi)有那么簡(jiǎn)單。
遠(yuǎn)端的聲音信號(hào)并非等同于回聲。遠(yuǎn)端的聲音從揚(yáng)聲器播放出來(lái),到被采集端采集,經(jīng)歷過(guò)揚(yáng)聲器 - 房間 - 麥克風(fēng)(Loudspeaker-Room-Microphone,LRM)這樣的回聲饋路。在 LRM 回聲饋路中傳播的時(shí)候,遠(yuǎn)端聲音一方面經(jīng)過(guò)多次反射,另外一方面經(jīng)過(guò)多次疊加,最后變得和遠(yuǎn)端聲音信號(hào)有差別了。我們把這個(gè)差別用一個(gè)函數(shù)來(lái)表示:
fe=f(fs)
其中,
fs=far-end signal(遠(yuǎn)端信號(hào));
fe=far-end echo (遠(yuǎn)端回聲);
如果能夠?qū)@個(gè)函數(shù)求解,那么就可以根據(jù)遠(yuǎn)端聲音信號(hào)和遠(yuǎn)端回聲之間的相關(guān)性進(jìn)行建模。這個(gè)模型是對(duì)回聲饋路 LRM 的模擬,會(huì)高度逼近回聲饋路 LRM。
等到這個(gè)模型穩(wěn)定時(shí),輸入遠(yuǎn)端聲音信號(hào) fs,就可以輸出高度接近遠(yuǎn)端回聲的信號(hào) fe。通過(guò)濾波器生成反相的信號(hào),和采集到的聲音信號(hào)進(jìn)行疊加,就可以把回聲信號(hào)消除掉。這就是回聲消除 AEC 的基本原理。
這個(gè)函數(shù)求出來(lái)的解不大可能和遠(yuǎn)端回聲完全一致,只能高度逼近。該函數(shù)求出來(lái)的解和遠(yuǎn)端回聲越逼近,回聲消除的效果就越好。
靜音、單講和雙講
雖然實(shí)時(shí)語(yǔ)音的通話是雙工模式,但是可以分為不同的情形:靜音、單講和雙講。針對(duì)不同的情形要采取不同的回聲消除策略。
1)靜音
即沒(méi)有人說(shuō)話的情形。
在語(yǔ)音段才需要做回聲消除,在非語(yǔ)音段不會(huì)有回聲,不需要做回聲消除,甚至不需要發(fā)送語(yǔ)音信息,從而可以降低碼率,節(jié)約帶寬成本。
因此,準(zhǔn)確探測(cè)語(yǔ)音活動(dòng)十分重要。語(yǔ)音的探測(cè)算法叫 VAD(Voice Activity Detection)。不同的廠商有不同的 VAD 實(shí)現(xiàn)方法。我們是利用基音周期實(shí)現(xiàn) VAD,有效地提高 VAD 判斷的準(zhǔn)確性,避免將非語(yǔ)音段誤判為語(yǔ)音段。
2)單講
即只有遠(yuǎn)端說(shuō)話的情形。
由于只有遠(yuǎn)端說(shuō)話,從麥克風(fēng)采集進(jìn)來(lái)的語(yǔ)音信號(hào)只包含遠(yuǎn)端的回聲,而不包含近端的語(yǔ)音。單講情形下的回聲消除相對(duì)比較容易處理,可以采取比較激進(jìn)的處理策略。
如果確定單講是高概率事件的情況下,可以直接地把所有語(yǔ)音信號(hào)都干掉,然后適當(dāng)?shù)靥畛涫孢m噪音。一般來(lái)說(shuō),在單講情形下,用線性自適應(yīng)濾波器跟蹤回聲饋路,可以很好地消除回聲,大概能夠抑制掉 18dB 的回聲。
3)雙講
有多方同時(shí)說(shuō)話的情形。
由于有多方同時(shí)說(shuō)話,從麥克風(fēng)采集進(jìn)來(lái)的語(yǔ)音信號(hào)就包含了遠(yuǎn)端的回聲和近端的語(yǔ)音,兩者混合在一起。雙講情形下的回聲消除就十分困難:一方面要保護(hù)近端的語(yǔ)音信號(hào)不被損傷,另外一方面還要盡量地把回聲消除干凈。
這里不但有“紅墨水藍(lán)墨水分離”的難題,而且還有“投鼠忌器”的困境。一般來(lái)說(shuō),在遠(yuǎn)端回聲比近端語(yǔ)音要高大概 6dB~8dB 的情況下,如果要把遠(yuǎn)端回聲消除干凈,那么肯定會(huì)或多或少地?fù)p傷到近端語(yǔ)音。
另外,如果遠(yuǎn)端回聲比近端語(yǔ)音要高出 18dB 以上,比如說(shuō)揚(yáng)聲器離麥克風(fēng)太近,遠(yuǎn)端回聲把近端語(yǔ)音完全掩蓋掉了,那么回聲消除的效果肯定是不好的。這種情形下,可以采取比較激進(jìn)的策略,把遠(yuǎn)端回聲和近端語(yǔ)音一起干掉,然后適當(dāng)?shù)靥畛涫孢m噪音。
因此,回聲消除模塊要有能力區(qū)分這三種情形,才能針對(duì)各種情形采取不同的算法。通過(guò) VAD 可以區(qū)分非語(yǔ)音段和語(yǔ)音段。如何區(qū)分單講和雙講的方法將在下面討論。
AEC 的實(shí)現(xiàn)
回聲消除主要包含兩個(gè)步驟:線性自適應(yīng)濾波和非線性處理。
線性自適應(yīng)濾波就是對(duì) fe=f(fs) 求解,建立遠(yuǎn)端回聲的語(yǔ)音模型,進(jìn)行第一輪回聲消除。
非線性處理又分為兩個(gè)步驟:殘留回聲處理和非線性剪切處理。殘留回聲處理進(jìn)行第二輪回聲消除,處理殘留回聲;非線性剪切處理就是對(duì)衰減量達(dá)到閾值的語(yǔ)音信號(hào)進(jìn)行比較激進(jìn)的剪切處理。
線性自適應(yīng)濾波和非線性剪切處理在學(xué)術(shù)論文和開(kāi)源項(xiàng)目中能找到東西學(xué)習(xí)。殘留回聲處理就很難,一般都是要靠團(tuán)隊(duì)自行摸索、積累和創(chuàng)新。正是因?yàn)槿绱耍Z(yǔ)音技術(shù)的門(mén)檻才如此的高。
(點(diǎn)擊放大圖像)
回聲消除的原理與實(shí)現(xiàn)
線性自適應(yīng)濾波
以遠(yuǎn)端聲音信號(hào)和遠(yuǎn)端回聲的相關(guān)性為基礎(chǔ),建立遠(yuǎn)端回聲的語(yǔ)音模型,利用它對(duì)遠(yuǎn)端回聲進(jìn)行估計(jì),目的是獲得對(duì)遠(yuǎn)端回聲盡量逼近的估計(jì)。我們可以把回聲饋路 LRM 看作一個(gè)“環(huán)境濾波器”。
經(jīng)過(guò)它的處理,遠(yuǎn)端聲音信號(hào)被變成遠(yuǎn)端回聲。回聲消除就是要構(gòu)建一個(gè)“算法濾波器”,基于對(duì)遠(yuǎn)端回聲的語(yǔ)音模型,不斷地調(diào)整該濾波器的系數(shù),使得估計(jì)值更加逼近真實(shí)的回聲。估計(jì)值越逼近真實(shí)回聲,回聲消除效果就越好。
自適應(yīng)濾波器收斂后得到的就是需要求解的回聲饋路函數(shù) fe=f(fs)。當(dāng)濾波器收斂穩(wěn)定之后,輸入遠(yuǎn)端聲音信號(hào) fs,就可以輸出相對(duì)準(zhǔn)確的對(duì)遠(yuǎn)端回聲信號(hào)的估計(jì)值 fe。把采集到的信號(hào)減去遠(yuǎn)端回聲信號(hào)的估計(jì)值 fe,就得到實(shí)際要發(fā)送的語(yǔ)音信號(hào)。
實(shí)現(xiàn)線性自適應(yīng)濾波器有兩個(gè)難點(diǎn):
-
快速收斂
在收斂階段,采集到聲音信號(hào)要求只有遠(yuǎn)端的回聲信號(hào),不能混有近端的語(yǔ)音信號(hào)。近端的語(yǔ)音信號(hào)和遠(yuǎn)端的參考語(yǔ)音信號(hào)沒(méi)有相關(guān)性,會(huì)對(duì)自適應(yīng)濾波器的收斂過(guò)程造成擾亂。
因此,我們的策略是讓自適應(yīng)濾波器收斂的時(shí)間盡量地短,短到收斂過(guò)程的時(shí)間段里采集進(jìn)來(lái)的信號(hào)只有遠(yuǎn)端的回聲信號(hào),這樣自適應(yīng)濾波器收斂的效果就會(huì)很好。在收斂好之后,濾波器就穩(wěn)定下來(lái)了,就可以用來(lái)過(guò)濾遠(yuǎn)端的回聲信號(hào)了。
-
動(dòng)態(tài)自適應(yīng)
在收斂好穩(wěn)定下來(lái)以后,自適應(yīng)濾波器還要隨時(shí)自動(dòng)適應(yīng)回聲饋路的變化。自適應(yīng)濾波器要能夠判斷回聲饋路是否發(fā)生變化,并且能夠重新學(xué)習(xí)和對(duì)其進(jìn)行建模,不斷地調(diào)整該濾波器的系數(shù),進(jìn)入一個(gè)新的收斂過(guò)程,最后快速地逼近新的回聲饋路。
這種情況在手游的場(chǎng)景中是十分常見(jiàn)的,用戶拿著手機(jī)邊走邊玩游戲,游戲語(yǔ)音周遭的回聲饋路時(shí)刻發(fā)生著變化,自適應(yīng)濾波器就要時(shí)刻自動(dòng)重新收斂來(lái)適應(yīng)新的回聲饋路。
這兩個(gè)難點(diǎn)是一對(duì)矛盾的特征,要求自適應(yīng)濾波器一方面要能夠快速收斂后保持系數(shù)高度穩(wěn)定,另外一方面要能夠隨時(shí)保持更新?tīng)顟B(tài)跟蹤回聲饋路的變化。
非線性處理
殘留回聲處理
通過(guò)自適應(yīng)濾波器來(lái)消除回聲,并不能百分之一百把回聲消除干凈,還需要進(jìn)一步消除殘留的回聲。
一般來(lái)說(shuō),殘留回聲消除的策略是利用自適應(yīng)濾波器處理后的殘留回聲與遠(yuǎn)端參考語(yǔ)音信號(hào)的相關(guān)性,進(jìn)一步消除殘留回聲。相關(guān)性越大,說(shuō)明殘留回聲越多,需要對(duì)殘留回聲進(jìn)一步消除的程度越大;反之,相關(guān)性越小,說(shuō)明殘留回聲較少,需要對(duì)殘留回聲進(jìn)一步消除的程度越小。
因此,首先要通過(guò)計(jì)算殘留回聲與參考信號(hào)的相關(guān)矩陣,得到一個(gè)反映消除程度的衰減因子;然后將殘留回聲乘以衰減因子,從而進(jìn)一步消除殘留回聲。
在線性自適應(yīng)濾波做完了以后,可以利用殘留回聲和麥克風(fēng)采集到的遠(yuǎn)端回聲信號(hào)的相關(guān)性來(lái)檢測(cè)是處于單講還是雙講狀態(tài)。根據(jù)單講還是雙講狀態(tài),可以進(jìn)一步調(diào)整衰減因子。
如果處于遠(yuǎn)端單講狀態(tài),因?yàn)榻藳](méi)有聲音信號(hào)(沒(méi)人說(shuō)話),可以盡量多地抑制回聲,讓衰減因子盡量地小;如果處于雙講狀態(tài),因?yàn)榫€性自適應(yīng)濾波器是在盡量不損傷近端語(yǔ)音音質(zhì)的前提下消除回聲,回聲抑制量不會(huì)太大,所以衰減因子相對(duì)較大。
消除殘留回聲的算法難度甚高。在論文或者開(kāi)源項(xiàng)目中甚少有可參考的東西,各家廠商都是通過(guò)私有的算法來(lái)實(shí)現(xiàn)的,甚至很多廠商都選擇不實(shí)現(xiàn)。
非線性剪切處理
在完成了上述處理以后,其實(shí)剩下的回聲一般都比較小了,但不排除仍有一些殘留的可以感知的小回聲。為了進(jìn)一步消除這些小回聲,要根據(jù)前面處理得到的衰減量來(lái)做進(jìn)一步的抑制處理。
在這里要為衰減量設(shè)定一個(gè)閾值。一般來(lái)說(shuō),這個(gè)衰減量閾值要設(shè)定得比較保守(比較高)。
如果衰減量達(dá)到或者超過(guò)設(shè)定的閾值,就表明回聲消除量比較大,采集進(jìn)來(lái)的語(yǔ)音信號(hào)很可能全部都是回聲信號(hào),那么就直接將語(yǔ)音信號(hào)全部消除掉,并填充舒適噪聲,防止聲音聽(tīng)感起伏。能達(dá)到那么大的衰減量,一般是處于遠(yuǎn)端單講狀態(tài),或者遠(yuǎn)端回聲信號(hào)要遠(yuǎn)遠(yuǎn)大于近端語(yǔ)音信號(hào)的雙講狀態(tài)。
正常的雙講狀態(tài)下,為了保護(hù)近端語(yǔ)音的音質(zhì),自適應(yīng)濾波器是不會(huì)做大幅的回聲消除的。因此,只要衰減量達(dá)到或者超過(guò)設(shè)定閾值,把采集到的語(yǔ)音信號(hào)全部消除掉是不會(huì)影響正常聽(tīng)音效果的。
如果衰減量沒(méi)有超過(guò)設(shè)定的閾值,那么就不要進(jìn)一步做回聲消除了。這種情形可能是雙講狀態(tài),要保護(hù)本地語(yǔ)音的音質(zhì),避免本地語(yǔ)音被當(dāng)成回聲誤殺。
業(yè)界一般有兩種做法:一種是允許對(duì)近端聲音有些許損傷也要把遠(yuǎn)端回聲消除干凈,另外一種是允許保留些許遠(yuǎn)端回聲也不要對(duì)近端聲音造成損傷。如果過(guò)分消除回聲,就會(huì)造成斷續(xù)的聽(tīng)音感覺(jué)?;芈曄褪且谶@兩種做法之間找平衡點(diǎn)。
筆者在工作中的實(shí)踐表明,在音視頻社交行業(yè),回聲消除是客戶高度關(guān)注的一個(gè)技術(shù)特征。與此同時(shí),回聲消除也是音視頻社交中最有難度的技術(shù),沒(méi)有之一。即使是王者榮耀這種頂級(jí)的游戲,也十分重視回聲消除的效果。在以用戶體驗(yàn)為生命線的游戲行業(yè),特別在手游做得越來(lái)越重的今天,回聲消除技術(shù)做得好不好,往往決定了用戶是否繼續(xù)玩你的游戲。
作者
冼牛,即構(gòu)科技 Zego 技術(shù)專家,北京郵電大學(xué)計(jì)算機(jī)碩士,香港大學(xué)工商管理碩士,多年從事語(yǔ)音視頻云服務(wù)技術(shù)研究,專注互動(dòng)直播技術(shù)和實(shí)時(shí)游戲語(yǔ)音。
【特別推薦】
視頻直播一路走來(lái),經(jīng)歷了怎樣的變革?
在線抓娃娃、直播答題、小程序直播、AI等風(fēng)口又會(huì)怎樣推動(dòng)直播技術(shù)的發(fā)展?
3月17日,即構(gòu)科技主辦的ZEGO Meetup,將攜手直播行業(yè)的4位技術(shù)大咖,和大家一起暢談視頻直播的技術(shù)與未來(lái)。這里有:
《視頻直播的這十年》
《連麥互動(dòng)直播 X 微信小程序》
《秀色直播的技術(shù)實(shí)踐之路》
《AI賦能直播:反欺詐技術(shù)為直播平臺(tái)保駕護(hù)航》
干貨滿滿,就等你來(lái)!
活動(dòng)報(bào)名請(qǐng)戳:http://www.huodongxing.com/event/5429947400400