一直以來(lái),語(yǔ)音分離在音視頻領(lǐng)域都是一個(gè)重要的課題,近年來(lái)深度學(xué)習的快速發(fā)展為解決單通道語(yǔ)音分離提供了一個(gè)新的思路。在LiveVideoStackCon2019上海音視頻技術(shù)大會(huì )上,大象聲科高級音頻算法工程師閆永杰以降噪場(chǎng)景為例,詳細介紹了深度學(xué)習在單通道語(yǔ)音分離中的應用。
大家好,我是來(lái)自大象聲科的閆永杰,接下來(lái)我會(huì )從以下六個(gè)方面為大家介紹深度學(xué)習在單通道語(yǔ)音分離中的應用:
1、單通道語(yǔ)音分離問(wèn)題的引入
2、借助深度學(xué)習來(lái)解決單通道語(yǔ)音分離
3、工程實(shí)踐中的挑戰及解決方案
4、思考
5、總結
一、單通道語(yǔ)音分離問(wèn)題的引入
在第一部分,我會(huì )簡(jiǎn)單介紹單通道語(yǔ)音分離問(wèn)題的引入。首先,存在一個(gè)問(wèn)題就是到底什么是單通道語(yǔ)音分離呢?對于做與語(yǔ)音相關(guān)工作的工作者來(lái)說(shuō),單通道語(yǔ)音分離是大家比較熟悉的一個(gè)問(wèn)題,那么我就先從音頻采集的方式開(kāi)始來(lái)為大家介紹。
1)音頻采集的方式

目前主流的音頻采集方式主要包括兩種場(chǎng)景:近場(chǎng)拾音和遠場(chǎng)拾音。對于近場(chǎng)拾音,在我們生活中是很常見(jiàn)的,例如我們在使用手機打電話(huà)時(shí)手持或者開(kāi)啟免提。對于遠場(chǎng)拾音,我們同樣也不會(huì )陌生,像現在非常火的麥克風(fēng)陣列技術(shù)就是采用的遠程拾音,例如小愛(ài)同學(xué)、天貓精靈等,它們都可以做到在相隔三到五米的情況下實(shí)現遠距離拾音。那么,就近場(chǎng)拾音和遠場(chǎng)拾音的區別所在,首先是使用場(chǎng)景的不同,再就是麥克風(fēng)數量的不同。遠場(chǎng)拾音采用的麥克風(fēng)數量通常為多個(gè),有兩麥、四麥、六麥、七麥,甚至還包括更加非常復雜的情況。而對于近場(chǎng)拾音,以手機通話(huà)來(lái)舉例,通常情況下使用的是單麥或者雙麥。當我們手持手機時(shí),如果仔細觀(guān)察手機可以發(fā)現手機實(shí)際上是有兩個(gè)麥克風(fēng)的,其中位于底部的是主麥,位于頂部的是副麥,在業(yè)界副麥也常會(huì )被叫做降噪麥克風(fēng)。本次為大家介紹的單通道語(yǔ)音,主要討論的是單麥克風(fēng)近場(chǎng)拾音的場(chǎng)景。
2)語(yǔ)音分離

首先,我們需要來(lái)界定一下,到底什么是語(yǔ)音分離?實(shí)際上,我們經(jīng)常所講的降噪、去混響、多人聲分離等等的過(guò)程都屬于語(yǔ)音分離的過(guò)程。其中,降噪指的就是語(yǔ)音與噪音的分離,去混響指的就是語(yǔ)音與混響的分離,而多人聲分離的場(chǎng)景則相對復雜一些,在這里包含有目標人聲和其它的干擾人聲。其實(shí)對于以上幾種語(yǔ)音分離的場(chǎng)景,它們的最終目標是相同的,即將目標人聲與其它非目標人聲的語(yǔ)音進(jìn)行分離。下面就以降噪為例,為大家介紹語(yǔ)音分離的過(guò)程。
3)降噪

在我們的現實(shí)生活中,噪音的種類(lèi)是形形色色的。如上圖所示,例如在車(chē)水馬龍的街道、吵鬧的酒吧和KTV、人來(lái)人往的車(chē)站以及各種加工工廠(chǎng),這些場(chǎng)景都是典型的充滿(mǎn)嘈雜的噪音的地方。形形色色的噪音對通話(huà)質(zhì)量來(lái)說(shuō)是一個(gè)非常大的挑戰,特別是當下所流行的視頻通話(huà),視頻通話(huà)雙方所處的環(huán)境各有可能,那么在嘈雜的環(huán)境中對于視頻通話(huà)的良好體驗就會(huì )產(chǎn)生巨大的挑戰。因此,在語(yǔ)音通話(huà)中實(shí)現更好的降噪已經(jīng)成為了一個(gè)必不可少的課題。

那么,降噪的最終目標是什么呢?直白的說(shuō)就是將目標人聲從多種噪音源中分離出來(lái)。如上圖所示,在通話(huà)的過(guò)程中,實(shí)際輸入的語(yǔ)音是包含目標人聲、噪音源1、噪音源2以及其他噪音源的,其中噪音源的數量是一般都是多種,而降噪的目標就是將目標人聲從中提取出來(lái)。

現在已經(jīng)有了降噪的目標,那么該如何實(shí)現這個(gè)目標,解決目標人聲和噪音源分離的問(wèn)題呢?
二、借助深度學(xué)習來(lái)解決單通道語(yǔ)音分離
在第二部分,我將為大家詳細介紹解決單通道語(yǔ)音分離的方法,首先是傳統的單通道語(yǔ)音增強方法。
1)傳統的單通道語(yǔ)音增強

要想實(shí)現單通道語(yǔ)音分離可能存在以下難點(diǎn):?jiǎn)瓮ǖ勒Z(yǔ)音一般只包含一個(gè)麥克風(fēng),這很大程度上也限制了算法的能力。如果存在有多個(gè)麥克風(fēng)的話(huà),通過(guò)一些空間信息將與主講人方向不同的噪音去除掉即可達到語(yǔ)音分離的目的。而單通道語(yǔ)音只有一個(gè)麥克風(fēng),因此就只存在一路信號,沒(méi)有方位信息,這也就為實(shí)現語(yǔ)音分離帶來(lái)了挑戰。傳統的語(yǔ)音增強算法包括有譜減法、維納濾波、卡爾曼濾波以及其他算法。對于譜減法,其前提是先假設噪音是穩定的,穩態(tài)噪音在我們生活中也是很常見(jiàn)的,例如冰箱發(fā)出的聲音或者是航空發(fā)動(dòng)機發(fā)出的規律性噪音。譜減法先假設噪音是穩定的,然后估計噪音,估計噪音的方法是將人不說(shuō)話(huà)的時(shí)間段的噪音取平均值,估出噪音以后,當人說(shuō)話(huà)的時(shí)候減去對應噪音就可以認為剩余的為純凈的語(yǔ)音。但是這種方法存在很明顯的弊端,它的前提是假設噪音都是穩態(tài)的,而實(shí)際上在日常生活中,瞬態(tài)的噪音也是非常多的,例如敲擊聲、咳嗽聲、其他人播放音樂(lè )的聲音、汽笛聲等等。對于這些非穩態(tài)的噪音,譜減法基本上是無(wú)能為力的。此外,還有一點(diǎn)缺陷就是譜減法假設的穩態(tài)噪音實(shí)際上取的是平均值,這就有可能導致在做減法時(shí)出現負值。而當出現負值時(shí),譜減法只是將負數直接用0替代了,這種做法實(shí)際上會(huì )在降噪的過(guò)程中額外帶來(lái)新的噪音。
最后,總結一下傳統語(yǔ)音增強算法的特點(diǎn):1)傳統方法是基于對信號的理解,采用人工編制的一些規則;2)由于規則是人工編制的,這就導致存在規則很難編制詳盡的問(wèn)題;3)存在很多需要估計的算法,通過(guò)對噪音調參得到適配的參數的調參過(guò)程十分考驗人對于信號的理解以及自身經(jīng)驗的豐富程度;4)最后一個(gè)也是最重要的問(wèn)題就是瞬態(tài)噪音,瞬態(tài)噪音不符合算法假設,傳統方法對它的處理結果基本上都是不盡如人意的。
下面將為大家介紹我們解決單通道語(yǔ)音分離的方法。
2)計算聽(tīng)覺(jué)場(chǎng)景分析

對于這一部分,首先為大家分享一個(gè)概念——計算聽(tīng)覺(jué)場(chǎng)景分析,這套理論的主要貢獻者之一是我們的首席科學(xué)家汪德亮教授,他于2001年提出理想二值掩膜(Ideal Binary Mask,IBM),并將預測IBM作為計算聽(tīng)覺(jué)場(chǎng)景分析解決語(yǔ)音分離問(wèn)題的計算目標。上圖是IBM的相關(guān)計算公式,為了方便講解,我們先拋開(kāi)公式,看下面的四張語(yǔ)音的圖。

如圖所示,可以看出與圖像信號不同的是語(yǔ)音信號是一維的信號,而圖像信號是二維的信號。對于語(yǔ)音信號利用一維的信息直接處理的難度是非常大的,因此我們將原始語(yǔ)音信號經(jīng)過(guò)時(shí)頻變換,如:短時(shí)傅里葉變換(STFT),就會(huì )得到左上的這張圖——原始信號的幅度譜。幅度譜的顏色越深代表著(zhù)能量越大,其中左上圖中的紅色部分就是語(yǔ)音的部分,看起來(lái)有一道一道的梳狀條紋,是語(yǔ)音的諧波結構,這就是語(yǔ)音的元音成分。左上圖是純凈語(yǔ)音對應的幅度譜,而右上圖則是對應帶噪語(yǔ)音的幅度譜,看起來(lái)有一些雜亂,語(yǔ)音成分被破話(huà)。右下圖就是我剛才提到的IBM,IBM的含義是理想二值掩膜。右下圖對應的是將IBM(左下圖)覆蓋到帶噪語(yǔ)音譜(右上圖),形成了降噪后的語(yǔ)音譜。而從圖中可以看出,降噪后的語(yǔ)音譜(右下圖)比噪聲語(yǔ)音譜干凈(右上圖)了許多,但與純凈語(yǔ)音譜相比,存在部分過(guò)壓的現象,聽(tīng)起來(lái)實(shí)際效果就是噪音基本消除,但是會(huì )有些許失真。

接下來(lái),我們再來(lái)看IBM的計算公式,公式里面的IBM其實(shí)就是深度學(xué)習最終預測的目標,IBM計算所得的值為0和1,即可認為把最終結果分類(lèi)成0和1,那么如何去界定0和1呢?界定條件如下:如果語(yǔ)音的能量s減去噪音的能量n大于一個(gè)θ值,θ一般取值為0,此時(shí)IBM的值為1,即我們認為語(yǔ)音比噪音大的地方,IBM是1;同樣地,我們認為語(yǔ)音比噪音小的地方,IBM是0,即認為是噪音。這解釋了為何將在之前圖中第二層從左到右的第一張圖譜覆蓋到第一層從左到右的第二張圖譜上所得的信號與純凈語(yǔ)音是有差距的。而這樣做的好處就是成功將一個(gè)回歸問(wèn)題改變?yōu)榉诸?lèi)問(wèn)題,只需要預測它是0或者1就可以了,這就使得學(xué)習難度變小,更容易預測。但不好的地方就是聽(tīng)上去語(yǔ)音會(huì )有些許失真。但在2013年,當時(shí)這個(gè)方法所取得的效果已經(jīng)算是非常好的。在此之后,陸續又有人提出了其他的一些計算目標,如TBM、IRM等,而這些目標其實(shí)都與IBM是相似的,只是進(jìn)行了一些修正改進(jìn),例如IRM的值不僅僅只是0和1了,當我們認為它有一半的部分是語(yǔ)音,那么我們的目標值就是0.5.當前我們所采用的計算目標大多數是IRM。
3)深度學(xué)習

首先,大家可能也曾思考過(guò)深度學(xué)習方法到底是什么或者深度學(xué)習方法到底要做什么事情。簡(jiǎn)單來(lái)講,深度學(xué)習方法的本質(zhì)就是通過(guò)構建模型,來(lái)擬合一個(gè)函數映射,即我們提供一個(gè)輸入并告訴應該輸出什么,然后通過(guò)輸入大量數據,不斷學(xué)習數據之間的潛在對應關(guān)系,找到一個(gè)模型去模擬這個(gè)函數映射關(guān)系。構建模型有很多方法,例如高斯混合模型、支持向量機、多層感知機以及深度神經(jīng)網(wǎng)絡(luò )(DNN),它們的目的就是去找到一個(gè)模型能夠通過(guò)輸入來(lái)預測出一個(gè)目標值。在上面的函數中,剛才講到的IBM就是對應里面的y,也就是說(shuō)我們要預測的目標就是IBM,而我們輸入就是前面所講的右上圖——帶噪語(yǔ)音的幅度譜。這是因為我們在部署的時(shí)候,實(shí)際上只能拿到這個(gè)信息。輸入是帶噪語(yǔ)音的幅度譜,目標是IBM,那么這樣函數映射就建立好了。接下來(lái)就是網(wǎng)絡(luò )的構建了,網(wǎng)絡(luò )的構建可以用簡(jiǎn)單一些的,例如全連接,卷積或者是后面發(fā)展比較好的RNN、LSTM一類(lèi)的結構去構建模型。

下面,總結一下深度學(xué)習方法實(shí)現語(yǔ)音分離:1)首先要確定目標——IBM,當然我們在這里是以IBM為例來(lái)講的,如果你采用IRM;2)特征輸入——短時(shí)傅里葉變換后的幅度譜;3)訓練工具現在都已經(jīng)十分成熟了,Tensorflow、Pytorch都很好用;4)數據驅動(dòng),最后就是需要不斷喂數據,這個(gè)喂的數據就是語(yǔ)音。在這里,需要講一下的就是大部分環(huán)境中的噪音都是加性噪聲,因此我們可以仿真得到混合后的聲音,只需將裁好的噪音與語(yǔ)音加在一起即可。這樣一來(lái),我們有了訓練的目標,純凈語(yǔ)音、噪聲都是已知的,只需要把這些數據喂給網(wǎng)絡(luò ),讓它不斷的調整參數,就會(huì )得到一個(gè)比較不錯的效果。
下面將為大家介紹在工程實(shí)踐中部署時(shí)的挑戰和解決方案。
三、工程實(shí)踐中的挑戰及解決方案
在這一部分,我將為大家介紹工程實(shí)踐中遇到的問(wèn)題以及我們提出的解決方案。
1)工程實(shí)踐中的挑戰

前面所講的原理其實(shí)都是非常簡(jiǎn)單的,但僅僅只是學(xué)術(shù)的,而深度學(xué)習講究的是落地,而在落地的時(shí)候,深度學(xué)習所面臨的最大挑戰就是部署。對于A(yíng)SR或者NLP來(lái)說(shuō)都是可以部署在云端上的,因此可以對模型有一些容忍度,可發(fā)揮的空間也更大一點(diǎn)。但是,對于實(shí)現降噪效果的,如果運行在服務(wù)器上,它的延時(shí)、實(shí)時(shí)性都是不切實(shí)際地,所以部署的終端大多數是移動(dòng)設備,例如手機、iPad,甚至是在耳機中非常弱的M4芯片上。因此,對于這些設備來(lái)說(shuō),1)功耗必須得控制好,那么計算量就不能太大;2)由于這些芯片的內存非常小,例如M4可能只有幾百K的空間,因此模型參數不能太大,否則無(wú)法部署。此外,給大家講一下我們公司最初是如何演示最終效果的,別人提供給我們一個(gè)帶噪的語(yǔ)音,我們在服務(wù)器上跑一下再發(fā)給人家,這樣一來(lái)的體驗效果是很差的,后來(lái)感覺(jué)太復雜了就寫(xiě)了一個(gè)MATLAB的,但效果也不是實(shí)時(shí)的,這是我們當時(shí)遇到的最大的挑戰。
為了解決這些問(wèn)題,我們做了一些相關(guān)的優(yōu)化。
2)模型優(yōu)化

針對上述問(wèn)題,我們對模型進(jìn)行了優(yōu)化,優(yōu)化的方向包括控制模型參數規模和替換計算代價(jià)高昂的激活函數。首先,模型參數規模一定要降下來(lái),模型參數最先影響的是帶寬。如果模型參數大于所要部署的嵌入式設備的內存,則不可能實(shí)現部署,這是一個(gè)裁模性的考量。其次,要減少計算量,參數減少以后,乘加指令自然會(huì )減少。控制模型的大小是一個(gè)非常重要的方向,例如全連接層的經(jīng)典模型,我們輸入1024個(gè)節點(diǎn),則輸出1024個(gè)節點(diǎn),僅僅一層網(wǎng)絡(luò )就已經(jīng)占用了4M的空間,然而設備卻只有幾百K的內存。因此,對于全連接層的使用一定要慎重,盡量選用其他結構如RNN或CNN來(lái)替代,尤其是CNN的參數共享可以帶來(lái)非常大的提升。
我們在設計網(wǎng)絡(luò )的時(shí)候,一定要考量DNN的輸入與輸出的大小規模,這是一個(gè)非常重要的點(diǎn),盡量使用CNN或者RNN的結構去替代DNN。然后,還有最重要的一點(diǎn)就是選取一個(gè)好的Feature,剛才前面講的我們用的Feature選擇的是Mix語(yǔ)音、經(jīng)過(guò)STFT后的幅度圖,這雖然是最直觀(guān)、最簡(jiǎn)單的,但是學(xué)起來(lái)難度較大。我們也在這方面做了很多的嘗試和工作,例如將輸入Feature從幅度譜改為mel譜就可以將輸入規模大大減小。就像我在前面所講的深度學(xué)習要學(xué)的是個(gè)函數映射,可能大家會(huì )有疑問(wèn),為什么在輸入特征時(shí)不直接把時(shí)域的信號送進(jìn)去,然后目標就是純凈語(yǔ)音的信號?其實(shí)如果這么做能成功的話(huà),那肯定是最好的,但是如果你告訴網(wǎng)絡(luò )的是一個(gè)完整、沒(méi)有丟失的信息,這在它學(xué)習規律的過(guò)程中,對于深度學(xué)習來(lái)說(shuō),學(xué)習難度太大,參數量是降不下來(lái)的。因此,我們折中選取了頻域的信號,選取頻域信號以后,學(xué)習難度就會(huì )下降很多,不僅可以比較容易的能學(xué)到它的模式,而且參數量也會(huì )大大下降。所以,在裁模型的時(shí)候,一定要注意選取一個(gè)好的Feature。
最后一點(diǎn)也是來(lái)自工程實(shí)踐中的一個(gè)問(wèn)題,例如當我們訓練好模型交給同事部署時(shí),同事會(huì )反饋說(shuō),你用的ELU函數,一個(gè)EXP指令直接占用了600個(gè)cycle。后來(lái)我們發(fā)現問(wèn)題,工程師在訓練模型的時(shí)候,一定要與最終部署的同事溝通好,要了解到哪些函數對他們來(lái)說(shuō)是很有挑戰的。例如將ELU換成一個(gè)簡(jiǎn)單一些的RELU,部署所需指令可能就只有一個(gè)兩個(gè)cycle,而如果用ELU,在性能上對實(shí)驗結果來(lái)說(shuō)差距是不大的,但是在部署時(shí)差距就會(huì )放大幾百倍,所以一些代價(jià)高的函數一定要慎重使用。
3)算法優(yōu)化

在做好模型優(yōu)化后,一個(gè)比較小且合理的模型給到工程團隊,工程團隊在落地的時(shí)候還要做一些算法優(yōu)化。1)定點(diǎn)化。大家都知道,如果做圖像的話(huà),一般會(huì )用int8去量化,這樣帶來(lái)的好處就是學(xué)習時(shí)用的float32,部署時(shí)用int8可以節省4倍的內存,這是一個(gè)很好的優(yōu)化。但是,對于語(yǔ)音還不能用int8,我們嘗試過(guò),使用int8最終會(huì )導致精度太差,部署的模型預測出來(lái)的值與float32的值差距太大。這主要是因為對于語(yǔ)音,我們一般采樣的是16bit,在后面量化時(shí)會(huì )使用Int16去替代float32,會(huì )帶來(lái)1倍的內存帶寬的下降。2)合理排布流水線(xiàn),注意不要因為頻繁地數據訪(fǎng)存缺頁(yè),導致打斷了流水線(xiàn)使cycle數急劇增加,一定要在匯編層流程上排布好流水線(xiàn)。3)利用平臺并行計算指令。大多數平臺都是有這個(gè)并行指令計算的,例如ARM上的NEON或者是SIMD,在可用的情況下一定要用起來(lái),一般會(huì )有2到4倍的加速。經(jīng)過(guò)這些優(yōu)化以后,基本上就可以得到一個(gè)部署在手機上的模型。
四、思考

在這一部分,我想帶著(zhù)大家一起思考,為什么深度學(xué)習會(huì )有這么好的效果呢?因為深度學(xué)習具有以下優(yōu)勢:
1)數據驅動(dòng),一定條件下,數據越多性能越好。我們只需要采集足夠多的噪音、足夠多的語(yǔ)音,源源不斷地喂給網(wǎng)絡(luò ),就能夠從中學(xué)習到語(yǔ)音的模式,所得的模型更加精確。為什么在這里要說(shuō)一定條件下呢?一方面如果是同類(lèi)噪音,采集的再多也沒(méi)什么用,這就要求我們要保證數據的豐富性。另一方面,大家可能有一個(gè)疑慮,既然說(shuō)是數據驅動(dòng)的,如果某種噪音并未采集過(guò)或見(jiàn)過(guò),那該怎么辦呢?此時(shí)就要考量算法的泛化能力。深度學(xué)習中有一個(gè)概念就是過(guò)擬合,如果見(jiàn)過(guò)的數據都能擬合的非常好,而沒(méi)見(jiàn)過(guò)的數據就會(huì )突然表現非常差,說(shuō)明模型過(guò)擬合了,這是不可接受的。所以,在做音頻降噪的時(shí)候,一定要考慮模型的泛化能力,同等條件下,如果模型越小,學(xué)習過(guò)程中最后的loss值跟大模型基本一致,那就說(shuō)明模型泛化能力強。也就是說(shuō)參數越少,泛化能力一定程度上越好,所以前面所講的我們做的裁減模型的工作對泛化能力也是有很大的提高的。這樣一來(lái),在部署的時(shí)候,對于沒(méi)見(jiàn)過(guò)噪聲,預測的結果也不會(huì )太差。
2)相比傳統算法手工統計的模式,深度學(xué)習可以學(xué)到更加魯棒的模式。對于傳統算法的調參是十分麻煩的,例如我們看過(guò)的有一些競品算法公司調參,參數大概有幾百個(gè),在對接廠(chǎng)商的時(shí)候需要將參數逐一調整,以實(shí)現不錯的效果,這中間的工作量非常大。但是,這幾百個(gè)參數跟深度學(xué)習相比就太少了,深度學(xué)習的參數量基本上是百萬(wàn)規模的,甚至是千萬(wàn)規模的。因此,手工統計的那些參數所包含的信息,它所擬合的模型的建模能力跟深度學(xué)習是不可比擬的,因此深度學(xué)習相比于傳統算法,它學(xué)到的模式更加魯棒。3)深度學(xué)習有記憶的能力。對于深度學(xué)習來(lái)說(shuō),一定程度上,見(jiàn)過(guò)的數據越豐富,效果越好。

在這里,說(shuō)一個(gè)我們的首席科學(xué)家汪老師給我們講的故事,他在俄亥俄州作教授,有一個(gè)老同事得了海默森綜合癥,記憶力會(huì )減退。有一天,這個(gè)老同事回到學(xué)校去看望汪老師,他知道汪老師是做人工智能研究,根據自己的親身感受,當時(shí)就說(shuō)了一句話(huà),No Intelligence Without Memory!這句話(huà)的意思是沒(méi)有記憶就沒(méi)有智能。所以說(shuō),記憶對于智能來(lái)說(shuō)非常重要,深度學(xué)習有非常多的參數,它會(huì )通過(guò)記憶非常多的模式來(lái)記住語(yǔ)音的分布以及噪音是長(cháng)什么樣子的。當然,對于降噪來(lái)說(shuō),更多記憶的是語(yǔ)音的一種模式,因為噪音實(shí)在是太復雜了,記錄噪音的難度太大了。
五、總結

最后,就是本次的總結部分了。本次演講內容首先是介紹了單通道語(yǔ)音分離的定義,其中語(yǔ)音分離方法我們介紹了三種,主要是以降噪為例去講的,因為降噪是比較關(guān)鍵的,再就是介紹了在單通道語(yǔ)音分離里面遇到的一些挑戰,以及我們是如何去解決所遇到的困難的。