陳若非,現(xiàn)在任職聲網(wǎng)Agora.io的音頻技術(shù),負(fù)責(zé)整個(gè)音頻技術(shù)架構(gòu)。在香港城市大學(xué)讀博士期間是音頻方面的諸多重要會(huì)議和期刊的主編。這位同學(xué)在以前的工作經(jīng)驗(yàn)里積累了大量關(guān)于音頻的降噪、混合、雙麥等等這方面的工作經(jīng)。
大家下午好,很高興今天有機(jī)會(huì)和大家分享一下:讓我們的APP實(shí)現(xiàn)實(shí)時(shí)語音功能時(shí),我們需要做哪些測(cè)試?要怎么樣做這些測(cè)試才能保證上線后是穩(wěn)定沒有問題的。
有的開發(fā)者說,他們自己做了實(shí)時(shí)語音的功能,在自己的測(cè)試中覺得沒有問題,在公司測(cè)得都很好,也通過了。上線后,收到很多用戶反饋:為什么你的語音這么卡,為什么有回聲,為什么會(huì)有雜音?。他們才發(fā)現(xiàn)這些問題其實(shí)并不是這么容易定位的,也不能像平時(shí)我們解BUG那樣快速修復(fù)這樣的問題。再追溯回來他們發(fā)現(xiàn)這背后跟很多網(wǎng)絡(luò)相關(guān)的優(yōu)化、音頻底層的算法都有很大的關(guān)系,這一塊他們自己也解決不了,所以就會(huì)出現(xiàn)比較尷尬的局面。所以,希望在今天的演講之后可以給大家一些更豐富的手段,幫助大家去評(píng)估一下自己手里的音頻引擎效果是怎么樣的。
首先,我們來講講實(shí)時(shí)語音的發(fā)展。我相信大家對(duì)實(shí)時(shí)語音這樣的功能應(yīng)該比較了解。實(shí)時(shí)語音發(fā)展已經(jīng)有幾十年的歷史,近幾年越來越多的APP提供了這個(gè)功能,包括微信、陌陌。越來越多的用戶愿意使用實(shí)時(shí)語音功能,從側(cè)面說明一個(gè)問題,實(shí)時(shí)語音這個(gè)功能已經(jīng)達(dá)到可以商業(yè)化的地步了。
這背后,我們這兩年網(wǎng)絡(luò)基礎(chǔ)設(shè)施的升級(jí),智能終端設(shè)備的更新?lián)Q代,包括現(xiàn)在流行的WebRTC技術(shù)的快速發(fā)展,都為實(shí)時(shí)語音野蠻省長(zhǎng)提供非常肥沃的土壤。我們非常高興地看到,除了社交之外,游戲、直播、在線醫(yī)療、在線教育這些行業(yè)對(duì)實(shí)時(shí)語音需求都是非常強(qiáng)烈。
那么問題來了,當(dāng)我們有一個(gè)語音引擎在手里,我們已經(jīng)調(diào)通了,出聲了,到上線究竟還有多遠(yuǎn)?這個(gè)問題其實(shí)是見仁見智的。我們跟一些開發(fā)者打交道下來,聽到比較多的兩種聲音是:我現(xiàn)在就想做視頻應(yīng)用,看臉的世界,出聲就可以;還有一種,我覺得音頻很重要,但是我不知道怎么測(cè)?我要如何來做測(cè)試才能保證上線后的穩(wěn)定?要回答這兩個(gè)問題我們首先來看一下我們實(shí)時(shí)語音到底有哪些特征?
實(shí)時(shí)語音到底有哪些特征?
首先,實(shí)時(shí)語音的完備性要求非常高。我們不可否認(rèn)語音是溝通的本質(zhì),是信息的載體。如果我們?cè)谕ㄔ捴姓Z音信息丟失了,這個(gè)對(duì)話是根本不能繼續(xù)下去的。這實(shí)際上說明了,我們首先對(duì)實(shí)時(shí)語音的完備性要求是非常高的,而且用戶對(duì)這部分的音頻問題容忍度是非常低的。
第二,實(shí)時(shí)語音其實(shí)是隨機(jī)性很大。我們要做基于互聯(lián)網(wǎng)的實(shí)時(shí)語音,也決定了我們繞不開網(wǎng)絡(luò)的丟包、延時(shí)的問題,所以這部分又決定了實(shí)時(shí)語音其實(shí)是隨機(jī)性很大的。
第三,問題的多元性。這個(gè)問題怎么解釋?舉個(gè)例子,大家平時(shí)有人會(huì)給你報(bào)你的語音卡頓,到底是什么原因?你首先想到的肯定是網(wǎng)絡(luò),網(wǎng)絡(luò)會(huì)卡頓。其實(shí)還有別的原因會(huì)引起卡頓,比如設(shè)備CPU負(fù)荷很高時(shí),錄放音調(diào)度有問題,也會(huì)導(dǎo)致聲音的卡頓。更隱性的問題,比如回聲消除,兩個(gè)人同時(shí)說話時(shí),這邊開著外放,收回去的時(shí)候兩個(gè)聲音混在一起,過程中會(huì)有損傷,造成斷續(xù)。通過這些例子,可以想見,實(shí)時(shí)語音的問題很難去定位。
最后,對(duì)錄放音設(shè)備的依賴。我們每個(gè)人都有自己的嘴和耳朵,設(shè)備也一樣,有揚(yáng)聲器和麥克風(fēng),而且它還有更多的外設(shè)。所以,其實(shí)最后的聽感體驗(yàn)很大程度受到錄放音設(shè)備的制約,這也決定了音頻的問題其實(shí)是碎片化的。
我們可以看到,這四個(gè)問題其實(shí)都是很難搞的問題,這也決定了用喂喂喂或者簡(jiǎn)單幾次測(cè)試不可能很好覆蓋整個(gè)音頻測(cè)試。
來總結(jié)一下,我們這里把影響語音質(zhì)量的因素分為三類:
網(wǎng)絡(luò)問題:丟包,或者抖動(dòng),都會(huì)導(dǎo)致聽感滯后或者斷續(xù);
設(shè)備問題:很突出,在一些低端的安卓機(jī)上,聲學(xué)設(shè)計(jì)并不理想。揚(yáng)聲器之間的耦合很大,或者揚(yáng)聲器的非線性很大,導(dǎo)致你的算法不能很好貫通在上面,導(dǎo)致聽感上有一些卡頓、毛刺的問題。
物理環(huán)境:比如我在一個(gè)很吵的環(huán)境和你打電話,或者我在很小的房間跟你打電話感覺是不一樣的;還有遠(yuǎn)場(chǎng)拾音,比如做電視應(yīng)用,必須要在2米以外收音,這個(gè)時(shí)候麥克風(fēng)的拾音效果決定了音頻聽到的體驗(yàn)。
這么多復(fù)雜的問題,業(yè)界一般怎么處理?
手機(jī)公司會(huì)有很大的消聲室,是用來規(guī)避一些不確定外界聲源的影響。還需要有人工頭、人工嘴和人工耳做高保真的放音和收音,四周有高保真的音響放出自由場(chǎng)的噪聲源,模擬不同網(wǎng)絡(luò)狀況。會(huì)測(cè)試回聲,語音在干凈或噪聲環(huán)境下的得分,雙降的性能。每個(gè)手機(jī)出場(chǎng)之前都會(huì)做這樣的測(cè)試。
但這一般開發(fā)者來說門檻很高,這樣一套設(shè)備很貴,我們有沒有更經(jīng)濟(jì)合理的方法做測(cè)試?
我們也總結(jié)了一下,聲網(wǎng)在實(shí)踐中覺得比較適合開發(fā)者自己去做,在上線前自測(cè)的一些方法,這里也按我們之前提到的三個(gè)歸類,網(wǎng)絡(luò)、設(shè)備和物理環(huán)境講一下。
首先,網(wǎng)絡(luò)部分。有TC跟NetEM,都可以模擬,如果具體步驟不清楚的同學(xué),可以查看這個(gè)教程。
你還在靠“喂喂喂”來測(cè)語音通話質(zhì)量嗎,看完這篇文章你就能掌握正確姿勢(shì)
這里面可能不能涵蓋所有的丟包,但是基本上也能測(cè)到語音在不同丟包下的表現(xiàn),可以測(cè)到引擎的極限在哪里。聲網(wǎng)的引擎基本現(xiàn)在做到在TC下,30%的丟包是無感的,70%的丟包可以正常的通話。
還有一個(gè)比較重要的是:跨運(yùn)營(yíng)商的測(cè)試。這一點(diǎn)很多客戶是不重視的,自己在公司內(nèi)用P2P測(cè)覺得很好,一上線就有很多問題。在中國(guó),跨運(yùn)營(yíng)商的丟包,或者2G、3G、4G移動(dòng)網(wǎng)絡(luò)下會(huì)有很多問題,建議大家在這方面做足夠測(cè)試再上線。
其次,設(shè)備的問題。大家在一些平板電腦測(cè)試覺得聲學(xué)很好,調(diào)的也很好,底層也有算法。但是,到安卓之后就變得非常的麻煩。很多低端的安卓機(jī),底層錄音的通路沒有調(diào)好,底噪很大。而且,聲學(xué)設(shè)計(jì)不夠好,有很多非線性的問題需要適配。而這些問題如果只是在一個(gè)比較高端的機(jī)器上測(cè),可能是不會(huì)體現(xiàn)的。所以,如果你的目標(biāo)用戶中有很多這樣的機(jī)型,那么一定要在測(cè)試中把這一塊覆蓋好。同時(shí),在聽筒、耳機(jī)、外放、藍(lán)牙,也需要去測(cè),這些都是會(huì)影響用戶的體驗(yàn)的細(xì)節(jié)。
第三,物理場(chǎng)景。我們其實(shí)沒有辦法覆蓋非常多的場(chǎng)景,建議去下載一些語音降噪的序列、噪聲的序列,是免費(fèi)的,可以在不同的信噪比情況下用來測(cè)試。遠(yuǎn)場(chǎng)拾音,只要測(cè)一下不同的說話距離就能感覺到不同的體驗(yàn)。
我相信通過這三步的測(cè)試,你的語音引擎是基本可用的。
另外,稍微講一下一些技術(shù)細(xì)節(jié)。
我們常說的3A引擎是指:回聲消除、降噪和自動(dòng)增益控制,這是所有音頻引擎中必須有的模塊。在測(cè)回聲時(shí),需要留意降完回聲之后殘留的程度;雙講透明度,就是兩個(gè)人同時(shí)說話的時(shí)候會(huì)有多少聲音可以透過去;穩(wěn)定性是指在安卓上這些CPU比較高的情況之下可以穩(wěn)定運(yùn)行的一個(gè)時(shí)間,收斂時(shí)間。 降噪,我降噪完聲音的殘留噪聲的程度和收斂時(shí)間。自動(dòng)增益控制關(guān)注兩個(gè)點(diǎn),第一收音距離多遠(yuǎn),第二,你把聲音推大,雜音也會(huì)推大,這個(gè)部分有沒有做特殊的處理?不然有人會(huì)說,你的這個(gè)聲音是很大,但是背景音一起推起來了,這時(shí)需要一些算法來做的更好。如果在1米、2米情況下不用AGC聲音已經(jīng)非常小,這里面必須有算法支持它。
上圖的三個(gè)算法也是比較特殊場(chǎng)景下的算法,聲網(wǎng)在這三塊也做了比較多的工作。
可懂度增強(qiáng):如果我在很噪雜的環(huán)境,對(duì)方傳過來的聲音是不吵的,但是我聽著還是很累,因?yàn)槲遗赃呌泻芏嘧屛曳中牡穆曇。這個(gè)時(shí)候,我們需要去評(píng)估現(xiàn)在的環(huán)境下的有多噪雜,從而調(diào)整下行的信號(hào)讓你聽得更清楚。
盲源分離:指的是我們剛才的降噪說得是平穩(wěn)噪聲,對(duì)應(yīng)在數(shù)學(xué)上也是用統(tǒng)計(jì)模型來做。但是在非平穩(wěn)信號(hào)下,可能需要有多麥技術(shù)來定位主講人聲源在哪,主要收主講人的聲音,其他的聲音屏蔽。
嘯叫抑制:真實(shí)環(huán)境中并不是很多。在做音頻測(cè)試時(shí),如果兩個(gè)手機(jī)開著外放,你就會(huì)聽到很尖銳的雜音一直響。這怎么辦?其實(shí)很簡(jiǎn)單,只要把一臺(tái)插上耳機(jī),把回環(huán)的通路打斷就不會(huì)叫。聲網(wǎng)自己做了嘯叫抑制的模塊,兩個(gè)手機(jī)都外放,即使不插耳機(jī),我們也會(huì)把檢測(cè)到的尖銳雜音自動(dòng)壓下來。
如果做的應(yīng)用是比較特殊的場(chǎng)景,比如直播、游戲,我們還有特殊的點(diǎn)需要注意。
做直播,推流基本用44.1K,但聲音有效采樣取到多少才是真正重要的。左圖是32K的采樣,右圖那個(gè)雖然是44.1K的聲源,但其實(shí)有效頻率是8K,實(shí)際聽到的聲音會(huì)變悶的。
ASMR,就是用立體聲錄音去給聽眾聽到空間感的音頻。那聲網(wǎng)在手機(jī)平臺(tái)上,第一個(gè)做到立體聲錄音和播放。這意味著,主播可以現(xiàn)在拿著這個(gè)立體聲的設(shè)備走到街上,一輛車開過去,其實(shí)直播的聽眾戴了耳機(jī)就能感覺到從左到右的效果。
再講一下游戲,很特殊的場(chǎng)景。拿一個(gè)槍戰(zhàn)類的游戲舉例,在3D環(huán)境里可以聽到周圍有隊(duì)友開槍,可以聽到哪邊交火。如果玩家開了實(shí)時(shí)語音,自己開著外放。那么玩家開槍的聲音通過他的外放再被收回去,這部分回聲消除由于沒有參考信號(hào)就做不了。這個(gè)聲音傳過去會(huì)影響對(duì)方的判斷,直接降低玩家的游戲體驗(yàn)。
上線只是一個(gè)開始,上線之后,語音的碎片化問題還會(huì)不斷出現(xiàn)。那么就需要做兩方面的統(tǒng)計(jì)。
全局監(jiān)控。來反饋全局質(zhì)量,是不是大部分用戶都比較好?上圖是聲網(wǎng)做的一個(gè)統(tǒng)計(jì),反應(yīng)每天使用用戶大概比例,用什么網(wǎng)絡(luò)什么系統(tǒng),音頻視頻打分如何,丟包率如何?如果你不是使用聲網(wǎng)的服務(wù),你自己也需要做這樣一套系統(tǒng),來改進(jìn)服質(zhì)量 。
個(gè)例分析。全局反饋良好,但依然有用戶報(bào)問題,我的聲音聽不到怎么辦?聲網(wǎng)在實(shí)踐當(dāng)中做了這樣一套系統(tǒng),可以根據(jù)用戶ID去查詳細(xì)的通話信息:包括一些碼率、CPU的情、音頻錄音大小可以自己看得到,這樣子就能定位問題。
以下是現(xiàn)場(chǎng)提問
提問:我問一個(gè)關(guān)于降噪的問題,你剛才的演示PPT里面沒有很清楚,降噪之后背景噪聲是消除越干凈越好?還是應(yīng)該是有一定的率?
陳若非:降噪有一個(gè)很大的問題,你壓得越多噪聲越低,語音失真也越大,這是必然的。如果你有一個(gè)噪音,失真率很小,如果壓得很多,非常干凈,這個(gè)聲音頻率上會(huì)特別高,聽起來尖尖的,不是很舒服。所以這需要你在實(shí)踐中自己去調(diào)到一個(gè)你認(rèn)為最好的點(diǎn),沒有絕對(duì),我不知道這樣回答有沒有回答你的問題?