想像一下,你正在機(jī)場候機(jī),突然來了一通重要的商務(wù)電話,而你身處的背景有嘈雜的交談聲、飛機(jī)起飛的噪音、甚至還有機(jī)場廣播。這個時候打電話就很尷尬,生怕對方聽不清自己的聲音。
現(xiàn)在,英偉達(dá)推出了一款名為2Hz的產(chǎn)品,讓你接起電話并開始講話時,噪聲突然消失,電話那頭的人聽不到任何干擾聲音。接下來論智將對這一技術(shù)詳細(xì)介紹,首先通過下面的視頻了解下這款產(chǎn)品的效果吧:
兩年前,我們決定創(chuàng)建一種技術(shù),當(dāng)人與人溝通交流時,能完全屏蔽背景噪聲,讓溝通的過程更愉悅、智能。從那時開始,這個問題就一直成為我們關(guān)注的重點(diǎn)。
在這篇文章中,我們會了解,為什么噪聲抑制這么難、想創(chuàng)建實(shí)時的低延遲噪聲抑制系統(tǒng)都需要些什么、以及深度學(xué)習(xí)是如何幫助我們提高噪聲消除的質(zhì)量的。
目前的噪聲抑制技術(shù)
首先,我們要知道什么是噪聲抑制。在這篇文章中,噪聲抑制表示,當(dāng)你與他人通話時,消除來自你所處背景中的噪聲,同時也會消除對方背景中的噪聲,如下圖所示:
噪聲抑制是雙向的
傳統(tǒng)的噪聲抑制方法
傳統(tǒng)的噪聲抑制技術(shù)通常用于一些設(shè)備的邊緣,例如手機(jī)、筆記本電腦、會議系統(tǒng)等等。這種方法看起來很直接,因?yàn)樵O(shè)備的邊緣是最先捕捉到用戶聲音的位置。一旦捕捉到聲音,設(shè)備會將雜音過濾掉,傳遞到對話的另一端。
十年前,手機(jī)通話的體驗(yàn)還非常差。但現(xiàn)在,越來越多的手機(jī)會配有多個麥克風(fēng),可以幫助抑制環(huán)境噪聲。
如下圖所示,現(xiàn)在的手機(jī)通常有兩個甚至多個麥克風(fēng),最新一代的iPhone有4個。第一個麥克風(fēng)在手機(jī)前面下部,最靠近用戶的嘴巴,可以直接捕捉用戶聲音。手機(jī)設(shè)計(jì)師將第二個麥克風(fēng)設(shè)計(jì)得盡量遠(yuǎn)離第一個麥克風(fēng),通常在手機(jī)背部的下方。
pixel 2016,黃色區(qū)域是麥克風(fēng)的位置
這兩個麥克風(fēng)都能捕捉到背景聲音,不過第一個能捕捉到更多人類聲音,第二個收到的人類聲音更少。之后通過軟件處理,生成一種接近清晰的人聲。
這種方法聽起來很簡單,但事實(shí)上失敗的次數(shù)也很多。例如,當(dāng)通話者沒有說話時,麥克風(fēng)接收到的全是噪音。或者說話者在打電話過程中會不斷晃動手機(jī)等等,這種情況就難以處理了。
此外,兩個或兩個以上的麥克風(fēng)設(shè)計(jì)會給生產(chǎn)廠商增加難度,音頻/硬件/軟件工程師們必須在工業(yè)設(shè)計(jì)和語音質(zhì)量上做取舍。
目前,手機(jī)已經(jīng)能在嘈雜的環(huán)境中表現(xiàn)得不錯了,雖然現(xiàn)在的噪聲抑制技術(shù)還不夠完美,但是的確在用戶體驗(yàn)上有了極大提升。
當(dāng)使用分離的麥克風(fēng)時,尺寸因素又成為了一大問題,如圖所示,第一個和第二個麥克風(fēng)之間的距離必須符合最小距離要求,只有這樣才能既讓用戶聽得清,也能讓手機(jī)捕捉到清晰的人聲。
但是,直板似的手機(jī)不是唯一的通訊設(shè)備。可穿戴設(shè)備(智能手表、附著在胸部的麥克風(fēng)等)、筆記本電腦、平板電腦和智能語音助手等都和手機(jī)的設(shè)計(jì)有所不同。用戶會從設(shè)備的任意角度、距離進(jìn)行通話。在大多數(shù)情況下,很難有通用的噪聲抑制技術(shù)。
從多麥克風(fēng)設(shè)計(jì)轉(zhuǎn)移到單一麥克風(fēng)設(shè)計(jì)
多麥克風(fēng)的設(shè)計(jì)有幾點(diǎn)重要的缺點(diǎn):
它對尺寸有一定要求,只能用于手機(jī)或頭戴設(shè)備上;
多麥克風(fēng)的設(shè)計(jì)會導(dǎo)致音頻路徑非常復(fù)雜,需要更多硬件和代碼的支持。除此之外,第二個麥克風(fēng)打孔的位置也對工業(yè)生成有較高要求;
音頻只能在設(shè)備邊緣處理,所以算法可能無法支持過于復(fù)雜的計(jì)算。
那么是否有一種方法,可以將多個麥克風(fēng)合成一個,將所有的后期處理都交給軟件?從而硬件設(shè)計(jì)更簡單,也更高效。
傳統(tǒng)的數(shù)字信號處理(DSP)算法嘗試持續(xù)尋找噪聲模式,逐幀處理音頻。這些算法在特定案例中表現(xiàn)得很好,但是無法擴(kuò)展到日常場景中。
基礎(chǔ)噪聲的類型有兩類:靜止和非靜止的,如下圖所示:
白噪聲(靜止)和Chirp噪聲(非靜止)的聲譜圖
我們可以將靜止的噪聲想象成一直重復(fù)、但和人類語音不同的聲音。傳統(tǒng)的DSP算法(自適應(yīng)過濾)在消除這類噪聲時很有效。
而非靜止噪聲的模式非常復(fù)雜,和人類聲音的模型很相似,難以區(qū)分。它們的信號很短,并且出現(xiàn)的速度很快(類似在鍵盤上打字)。
如果想同時解決以上兩種噪聲,可能就要突破傳統(tǒng)數(shù)字信號處理技術(shù)了。我們認(rèn)為,深度學(xué)習(xí)是解決這一問題的重要方式,所以提出了2Hz。
用深度學(xué)習(xí)分離背景中的噪聲
2015年,Yong Xu等人曾發(fā)表論文,提出用深度學(xué)習(xí)進(jìn)行噪聲抑制。Yong提出一種回歸方法,通過學(xué)習(xí)為每個音頻率生成比例掩碼。生成的比例掩碼完全與人聲分離,并且可以刪除外部噪聲。雖然這種方法還不夠完美,也算一個很好的基礎(chǔ)了。
在接下來的幾年時間里,很多不同方法相繼出現(xiàn),高級別的方法幾乎相同,它們常常分為三步:
數(shù)據(jù)收集:將純凈的語音和噪音混合,生成大量合成的嘈雜數(shù)據(jù)集;
訓(xùn)練:將數(shù)據(jù)集輸入到DNN中,得出清晰的語音輸出。
推理:創(chuàng)建掩碼,將人聲與噪聲分離開。
在2Hz中,我們嘗試了多種DNN,最終得出了唯一的DNN架構(gòu),可以在多種場景下得出可靠的結(jié)果。平均MOS分?jǐn)?shù)上升了1.4,是目前最佳成績。
能否實(shí)現(xiàn)實(shí)時DNN?
延遲是實(shí)時對話中的重要問題。人類可以忍受的上限為200毫秒的延遲,否則的話就會影響通話效果。
影響端到端延遲的因素有三個:網(wǎng)絡(luò)、計(jì)算和編解碼器。通常網(wǎng)絡(luò)延遲是主要因素。編解碼器的延遲根據(jù)不同模式可能會有5—80毫秒的延遲,但是目前所用的編解碼器已經(jīng)非常高效了。而計(jì)算的延遲則有多方面因素。
計(jì)算延遲讓DNN更具挑戰(zhàn)性。如果你想用DNN處理每一幀,結(jié)果很可能會造成嚴(yán)重的延遲。計(jì)算延遲取決于以下幾點(diǎn)因素:
計(jì)算平臺的能力
我們不可能在一臺頭戴設(shè)備中運(yùn)行大型DNN,因?yàn)橛?a target="_blank">CPU和電源的限制。所以想做到實(shí)時處理非常困難,除非平臺有一臺加速器,可以快速進(jìn)行矩陣相乘,并且還不那么費(fèi)電。
DNN架構(gòu)
DNN的速度取決于有多少個超參數(shù)、DNN的層數(shù),以及節(jié)點(diǎn)進(jìn)行的什么操作。如果你想生成高質(zhì)量結(jié)果,那么DNN就不能太小。
音頻采樣率
DNN的表現(xiàn)取決于音頻采樣率,采樣率越高,得到的超參數(shù)就越多。
如何測試噪聲抑制算法?
測試聲音是否得到改善也是一個難題,因?yàn)槿硕茈y分辨細(xì)微的差別。可是,目前也沒有公開的針對噪聲抑制效果的基準(zhǔn),所以對結(jié)果進(jìn)行比較比較有挑戰(zhàn)性。
大多數(shù)論文采用PESQ、MOS和STOI衡量結(jié)果。你提供一個原始聲音音頻和經(jīng)過處理的音頻,算法會生成一個分?jǐn)?shù)。
ETSI Room
另一種更專業(yè)的發(fā)方法是進(jìn)行主觀音頻測試,在不同標(biāo)準(zhǔn)體上測試看它們能否符合標(biāo)準(zhǔn)。
EGPP通訊組織創(chuàng)建了ETSI Room,如果你想將算法應(yīng)用到實(shí)際中,就必須在設(shè)備中安裝這一裝置。
這一設(shè)置能完美地將噪聲分離。它其中有一個智能機(jī)器人,內(nèi)置的揚(yáng)聲器會模擬聲音,另外在一定距離之外還有麥克風(fēng)。
這一設(shè)備能讓測試者用周圍的揚(yáng)聲器模擬不同噪聲,從機(jī)器人的揚(yáng)聲器里發(fā)出人聲,最終用算法處理捕捉到的音頻。這一切都能自動進(jìn)行。
輸出噪聲和輸入噪聲
假設(shè)現(xiàn)在你正在和團(tuán)隊(duì)參加電話會議,總共有4人。所以潛在的噪聲就有4種,每個人都有可能制造背景噪聲。
傳統(tǒng)來說,噪聲抑制都在邊緣設(shè)備上,也就是僅限于麥克風(fēng)。你從麥克風(fēng)中得到信號,一直噪聲,然后對信號進(jìn)行上采樣。
由于單一麥克風(fēng)的DNN方法只需要一個源流,你可以將它放置在任意地方。假設(shè)現(xiàn)在你想過濾掉麥克風(fēng)的信號(輸出噪聲)和聽到的揚(yáng)聲器中的信號(輸入噪聲)。我們創(chuàng)建了APP——Krisp,它可以處理兩種噪聲:
以下視頻演示了非靜止噪聲是如何被DNN過濾掉的:
對輸入噪聲抑制來說,問題變得越來越復(fù)雜了。你需要處理算法不常見的聲音和人聲變體。例如,你的團(tuán)隊(duì)可能會用到會議設(shè)備,或者離設(shè)備距離較遠(yuǎn)。或者遠(yuǎn)程的人是從車?yán)锎虻碾娫挘瑤砀喹h(huán)境噪聲。另外,可能會有幾個人同事說話的情況,這樣又該怎樣判定哪些是噪聲呢?
有時聽到手機(jī)鈴聲響起,他應(yīng)該算是噪聲還是鈴聲?
轉(zhuǎn)向云計(jì)算
了解了噪聲抑制技術(shù)所需要的條件,而算法又是完全基于軟件的,那么它可以遷移到云上嗎?如下圖所示:
在云上進(jìn)行噪聲抑制有多種優(yōu)點(diǎn)
答案是肯定的。首先,基于云的噪聲抑制技術(shù)能在多種設(shè)備上運(yùn)行,另外,它能進(jìn)行雙向甚至多向工作。在過去,這是不可能的事,因?yàn)閭鹘y(tǒng)方法需要多個麥克風(fēng)。然而,深度學(xué)習(xí)技能支持單個麥克風(fēng),也能用云進(jìn)行計(jì)算。
現(xiàn)在,最大的問題就是算法的可擴(kuò)展性了。
GPU vs CPU
如果我們想讓算法足夠服務(wù)真實(shí)的因特網(wǎng)語音(VoIP)負(fù)載,我們就需要了解算法是如何工作的。
目前的大型VoIP設(shè)備可以支持10K—100K的流。有很多因素會影響媒體服務(wù)器可以支持的音頻流,其中最主要的因素就是服務(wù)器平臺。如下圖所示,基于云的媒體服務(wù)器和經(jīng)過優(yōu)化的裸機(jī)服務(wù)器相比,裸機(jī)服務(wù)器明顯勝出:
服務(wù)器必須價格實(shí)惠,才能讓消費(fèi)者看到優(yōu)勢。我們首先用CPU對2Hz做了實(shí)驗(yàn),單個CPU核可以處理最多10個平行流。
之后,我們在GPU上做了實(shí)驗(yàn),結(jié)果非常驚人。一個英偉達(dá)1080ti在沒有優(yōu)化的情況下可以擴(kuò)展到1000個流,經(jīng)過優(yōu)化最大可以達(dá)到3000個流。
用CUDA進(jìn)行批處理
讓我們來研究下,為什么GPU能比CPU強(qiáng)這么多。
CPU供應(yīng)商們一直以來將大量的時間和精力用于優(yōu)化和加速單線程架構(gòu),用算法和各種技術(shù)盡可能縮短單線程的時間。因?yàn)榇蠖鄶?shù)應(yīng)用都只需要一個線程,所以CPU制造者只需要發(fā)展結(jié)構(gòu)即可讓應(yīng)用發(fā)揮最大性能。
而GPU供應(yīng)商需要對很多平行任務(wù)進(jìn)行優(yōu)化,大量平行都需要3D圖形處理。
批處理(Batching)就是在GPU中平行處理的意思,你講一批數(shù)據(jù)輸入進(jìn)GPU中,經(jīng)過平行處理后再返回,這是音頻流處理的理想工具:
這里,我們用英偉達(dá)的CUDA庫直接在英偉達(dá)GPU上運(yùn)行這一過程。下方的代碼表示CUDA的矩陣相乘過程。
void kernelVectorMul(RealPtr dst, ConstRealPtr src1, ConstRealPtr src2, constsize_t n)
{
constsize_t i = threadIdx.x + blockIdx.x * blockDim.x;
if (i < n)
dst[i] = src1[i] * src2[i];
}
voidUtils::vectorMul(RealPtr dst, ConstRealPtr src1, ConstRealPtr src2, constsize_t n)
{
dim3 gridSize(n / getDeviceMaxThreadsX() + 1, 1, 1);
dim3 blockSize(getDeviceMaxThreadsX(), 1, 1);
kernelVectorMul <<< gridSize, blockSize >>> (dst, src1, src2, n);
}
voidUtils::vectorMul(Vector& dst, constVector& src1, constVector& src2)
{
vectorMul(dst.getData(), src1.getData(), src2.getData(), dst.getSize());
}
voidUtils::matrixMulRowByRow(Matrix& dst, constMatrix& src1, constMatrix& src2)
{
vectorMul(dst.getData(), src1.getData(), src2.getData(), dst.getSize());
}
下面是用CUDA進(jìn)行快速傅里葉變換的過程。
FFT::StatusType FFT::computeBackwardBatched(ComplexTypePtr src, RealTypePtr dst)
{
StatusType s = cufftExecC2R(backward_handle_, reinterpret_cast
dim3 gridSize((getBatchSize() * getForwardDataSize()) / thr_max_ + 1, 1, 1);
dim3 blockSize(thr_max_, 1, 1);
float val = getForwardDataSize();
kernelDivide <<< gridSize, blockSize >>> (dst, val, getBatchSize() * getForwardDataSize());
return s;
}
FFT::StatusType FFT::computeBackwardBatched(ComplexVector& src, Vector& dst)
{
return computeBackwardBatched(src.getData(), dst.getData());
}
-
英偉達(dá)
+關(guān)注
關(guān)注
22文章
3848瀏覽量
91991 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5516瀏覽量
121556
原文標(biāo)題:英偉達(dá)用深度學(xué)習(xí)消除背景噪聲
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論