詳解語音處理檢測技術中的熱點——端點檢測、降噪和壓縮

轉載於:https://blog.csdn.net/ffmpeg4976/article/details/52349007

對方也是轉載的,不知道原創是誰。。。


作爲一種人機交互的手段,語音的端點檢測在解放人類雙手方面意義重大。同時,工作環境存在着各種各樣的背景噪聲,這些噪聲會嚴重降低語音的質量從而影響語音應用的效果,比如會降低識別率。未經壓縮的語音數據,網絡交互應用中的網絡流量偏大,從而降低語音應用的成功率。因此,音頻的端點檢測、降噪和音頻壓縮始終是終端語音處理關注的重點,目前仍是活躍的研究主題。

爲了能和您一起了解端點檢測和降噪的基本原理,帶您一起一窺音頻壓縮的奧祕,本次硬創公開課的嘉賓科大訊飛資深研發工程師李洪亮,將爲我們帶來主題演講:詳解語音處理檢測技術中的熱點——端點檢測、降噪和壓縮 。 
嘉賓介紹

李洪亮,畢業於中國科學技術大學。科大訊飛資深研發工程師,長期從事語音引擎和語音類雲計算相關開發,科大訊飛語音雲的締造者之一,主導研發的用於訊飛語音雲平臺上的語音編解碼庫,日使用量超過二十億。主導語音類國家標準體系的建設,主導、參與多個語音類國家標準的制定。 他今天的分享將分爲兩大部分,第一部分是端點檢測和降噪,第二部分是音頻壓縮。

端點檢測

首先來看端點檢測(Voice Activity Detection, VAD)。音頻端點檢測就是從連續的語音流中檢測出有效的語音段。它包括兩個方面,檢測出有效語音的起始點即前端點,檢測出有效語音的結束點即後端點

在語音應用中進行語音的端點檢測是很必要的,首先很簡單的一點,就是在存儲或傳輸語音的場景下,從連續的語音流中分離出有效語音,可以降低存儲或傳輸的數據量。其次是在有些應用場景中,使用端點檢測可以簡化人機交互,比如在錄音的場景中,語音後端點檢測可以省略結束錄音的操作。

這裏寫圖片描述

爲了能更清楚說明端點檢測的原理,先來分析一段音頻。上圖是一段只有兩個字的簡單音頻,從圖上可以很直觀的看出,首尾的靜音部分聲波的振幅很小,而有效語音部分的振幅比較大,一個信號的振幅從直觀上表示了信號能量的大小:靜音部分能量值較小,有效語音部分的能量值較大。語音信號是一個以時間爲自變量的一維連續函數,計算機處理的語音數據是語音信號按時間排序的採樣值序列,這些採樣值的大小同樣表示了語音信號在採樣點處的能量。 
這裏寫圖片描述 
採樣值中有正值和負值,計算能量值時不需要考慮正負號,從這個意義上看,使用採樣值的絕對值來表示能量值是自然而然的想法,由於絕對值符號在數學處理上不方便,所以採樣點的能量值通常使用採樣值的平方,一段包含N個採樣點的語音的能量值可以定義爲其中各採樣值的平方和。

這樣,一段語音的能量值既與其中的採樣值大小有關,又與其中包含的採樣點數量有關。爲了考察語音能量值的變化,需要先將語音信號按照固定時長比如20毫秒進行分割,每個分割單元稱爲幀,每幀中包含數量相同的採樣點,然後計算每幀語音的能量值。

如果音頻前面部分連續M0幀的能量值低於一個事先指定的能量值閾值E0,接下來的連續M0幀能量值大於E0,則在語音能量值增大的地方就是語音的前端點。同樣的,如果連續的若干幀語音能量值較大,隨後的幀能量值變小,並且持續一定的時長,可以認爲在能量值減小的地方即是語音的後端點。

現在的問題是,能量值閾值E0怎麼取?M0又是多少?理想的靜音能量值爲0,故上面算法中的E0理想狀態下取0。不幸的是,採集音頻的場景中往往有一定強度的背景音,這種單純的背景音當然算靜音,但其能量值顯然不爲0,因此,實際採集到的音頻其背景音通常有一定的基礎能量值

我們總是假設採集到的音頻在起始處有一小段靜音,長度一般爲幾百毫秒,這一小段靜音是我們估計閾值E0的基礎。對,總是假設音頻起始處的一小段語音是靜音,這一點假設非常重要!!!!在隨後的降噪介紹中也要用到這一假設。在估計E0時,選取一定數量的幀比如前100幀語音數據(這些是「靜音」),計算其平均能量值,然後加上一個經驗值或乘以一個大於1的係數,由此得到E0。這個E0就是我們判斷一幀語音是否是靜音的基準,大於這個值就是有效語音,小於這個值就是靜音。

至於M0,比較容易理解,其大小決定了端點檢測的靈敏度,M0越小,端點檢測的靈敏度越高,反之越低。語音應用的場景不同,端點檢測的靈敏度也應該被設置爲不同的值。例如,在聲控遙控器的應用中,由於語音指令一般都是簡單的控制指令,中間出現逗號或句號等較長停頓的可能性很小,所以提高端點檢測的靈敏度是合理的,M0設置爲較小值,對應的音頻時長一般爲200-400毫秒左右。在大段的語音聽寫應用中,由於中間會出現逗號或句號等較長時間的停頓,宜將端點檢測的靈敏度降低,此時M0值設置爲較大值,對應的音頻時長一般爲1500-3000毫秒。所以M0的值,也就是端點檢測的靈敏度,在實際中應該做成可調整的,它的取值要根據語音應用的場景來選擇。

以上只是語音端點檢測的很簡單的一般原理,實際應用中的算法遠比上面講的要複雜。作爲一個應用較廣的語音處理技術,音頻端點檢測仍然是一個較爲活躍的研究方向。科大訊飛已經使用循環神經網絡(Recurrent Neural Networks, RNN)技術來進行語音的端點檢測,實際的效果可以關注訊飛的產品。

降噪

降噪又稱噪聲抑制(Noise Reduction),前文提到,實際採集到的音頻通常會有一定強度的背景音,這些背景音一般是背景噪音,當背景噪音強度較大時,會對語音應用的效果產生明顯的影響,比如語音識別率降低,端點檢測靈敏度下降等,因此,在語音的前端處理中,進行噪聲抑制是很有必要的。

噪聲有很多種,既有頻譜穩定的白噪聲,又有不穩定的脈衝噪聲和起伏噪聲,在語音應用中,穩定的背景噪音最爲常見,技術也最成熟,效果也最好。本課程只討論穩定的白噪聲,即總是假設背景噪聲的頻譜是穩定或者是準穩定的。

前面講的語音端點檢測是在時域上進行的,降噪的過程則是在頻域上進行的,爲此,我們先來簡單介紹或者說複習一下用於時域-頻域相互轉換的重要工具——傅里葉變換。

爲了更容易理解,先看高等數學中學過的傅里葉級數,高等數學理論指出,一個滿足Dirichlet條件的週期爲2T的函數f(t),可以展開成傅里葉級數: 
這裏寫圖片描述 
這裏寫圖片描述 
對於一般的連續時域信號f(t),設其定義域爲[0,T],對其進行奇延拓後,其傅里葉級數如下式: 
這裏寫圖片描述 
bn的計算同上,由上式可知,任何一個連續的時域信號f(t),都可以由一組三角函數線性疊加而成。或者說, f(t)都可以由一個三角函數線性組合組成的序列來無限的逼近。信號的傅里葉級數展示的是構成信號的頻率以及各個頻率處的振幅,因此,式子的右端又可以看做是信號f(t)的頻譜,說的更直白一點,信號的頻譜就是指這個信號有哪些頻率成分,各個頻率的振幅如何。上式從左到右的過程是一個求已知信號的頻譜的過程,從右到左的過程是一個由信號的頻譜重構該信號的過程。

雖然由信號的傅里葉級數很容易理解頻譜的概念,但在實際中求取信號的頻譜時,使用的是傅里葉級數的一種推廣形式——傅里葉變換。

傅里葉變換是一個大的家族,在不同的應用領域,有不同的形式,在這裏我們只給出兩種形式——連續形式的傅里葉變換和離散傅里葉變換: 
這裏寫圖片描述 
其中的j是虛數單位,也就是j*j=-1,其對應的傅里葉逆變換分別爲: 
這裏寫圖片描述 
在實際應用中,將數字採樣信號進行傅里葉變換後,可以得到信號的頻譜。頻域上的處理完成後,可以使用傅里葉逆變換將信號由頻域轉換到時域中。對,傅里葉變換是一個可以完成由時域向頻域轉換的重要工具,一個信號經傅里葉變換後,可以得到信號的頻譜。

以上是傅里葉變換的簡單介紹,數學功底不太好的朋友看不大懂也沒關係,只要明白,一個時域信號進行傅里葉變換後,可以得到這個信號的頻譜,即完成如下轉換: 
這裏寫圖片描述 
左面的是時域信號,右面的是對應的頻譜,時域信號一般關注的是什麼時間取什麼值,頻域信號關心的是頻率分佈和振幅。

有了以上的理論作爲基礎,理解降噪的原理就容易多了,噪音抑制的關鍵是提取出噪聲的頻譜,然後將含噪語音根據噪聲的頻譜做一個反向的補償運算,從而得到降噪後的語音。這句話很重要,後面的內容都是圍繞這句話展開的。

噪聲抑制的一般流程如下圖所示: 
這裏寫圖片描述 
同端點檢測類似,假設音頻起始處的一小段語音是背景音,這一假設非常重要,因爲這一小段背景音也是背景噪聲,是提取噪聲頻譜的基礎。

降噪過程:首先將這一小段背景音進行分幀,並按照幀的先後順序進行分組,每組的幀數可以爲10或其他值,組的數量一般不少於5,隨後對每組背景噪聲數據幀使用傅里葉變換得到其頻譜,再將各頻譜求平均後得到背景噪聲的頻譜。 
得到噪聲的頻譜後,降噪的過程就非常簡單了,上圖下面左側的圖中紅色部分即爲噪聲的頻譜,黑色的線爲有效語音信號的頻譜,兩者共同構成含噪語音的頻譜,用含噪語音的頻譜減去噪音頻譜後得到降噪後語音的頻譜,再使用傅里葉逆變換轉回到時域中,從而得到降噪後的語音數據。

下圖展示了降噪的效果 
這裏寫圖片描述 
左右兩幅圖是降噪前後時域中的對比,左面的是含噪語音信號,從圖中可以看到噪聲還是很明顯的。右側的是降噪後的語音信號,可以看出,背景噪聲被大大的抑制了。

下面兩幅圖是頻域中的對比 
這裏寫圖片描述 
其中橫軸表示時間軸,縱軸表示頻率,左面的是含噪語音,其中的亮紅色部分是有效語音,而那些像沙子一樣的紫色的部分則是噪聲。從圖中可以看出,噪聲不僅是「無時不在」,而且還是「無處不在」,也就是在各種頻率處都有分佈,右側的是降噪後的語音,可以很明顯的看出,降噪前那些像沙子一樣的紫色的部分淡了很多,就是噪聲被有效的抑制了。

在實際應用中,降噪使用的噪聲頻譜通常不是一成不變的,而是隨着降噪過程的進行被持續修正的,即降噪的過程是自適應的。這樣做的原因 
1. 一方面是語音數據前部的靜音長度有時不夠長,背景噪聲數據不足導致得到的噪聲頻譜往往不夠準確, 
2. 另一方面,背景噪聲往往不是絕對穩定的,而是漸變的甚至會突變到另一種穩定的背景噪聲。

這些原因都要求在降噪的過程中對使用的噪聲頻譜做及時修正,以得到較好的降噪效果。修正噪聲頻譜的方法是使用後繼音頻中的靜音,重複噪聲頻譜提取算法,得到新的噪聲頻譜,並將之用於修正降噪所用的噪聲頻譜,所以降噪的過程中仍然要使用端點檢測中用到的如何判斷靜音。噪聲頻譜修正的方法或者是新舊頻譜進行加權平均,或者使用新的噪聲頻譜完全替換使用中的噪聲頻譜。

以上介紹的是降噪的非常簡單的原理。實際應用中的降噪算法遠比上面介紹的要複雜,現實中的噪聲源多種多樣,其產生的機理和特性也較爲複雜,所以噪聲抑制在現今仍然是一個較爲活躍的研究領域,各種新技術也層出不窮,比如在實際應用中已經使用了多麥克風陣列來進行噪聲抑制。

音頻壓縮

音頻壓縮的必要性衆所周知,不再贅述。所有的音頻壓縮系統都要求有兩種對應的算法,一種是運行於源端上的編碼算法(encoding),另一種是運行於接收端或用戶終端的解碼算法(decoding)。

編碼算法和解碼算法表現出一定的不對稱性。這種不對稱性一是表現在編碼算法和解碼算法的效率可以不同。音頻或視頻數據在存儲時,通常只被編碼一次,但將被解碼成千上萬次,所以編碼算法較複雜、效率降低、費用昂貴是可以被接受的,但解碼算法一定要快速、簡單而且廉價。編碼算法和解碼算法的不對稱性還表現在編碼和解碼的過程通常是不可逆的,也就是說,解碼後得到的數據和編碼之前的原始數據可以是不同的,只要它們聽起來或看起來是一樣的即可,這種編解碼算法通常稱爲有損的,與此對應的是,如果解碼後得到和原始數據一致的數據,這種編碼和解碼稱爲無損的。

音視頻編解碼算法大多是有損的,因爲忍受一些少量信息的丟失,往往可以換來壓縮率的大幅提升,音頻信號的壓縮編碼採用了數據編碼中的一些技術,如熵編碼、波形編碼、參數編碼、混合編碼、感知編碼等。

本次課重點介紹感知編碼,相對於其他的編碼算法,感知編碼基於人耳聽覺的一些特性(心理聲學),去除音頻信號中的冗餘,從而達到音頻壓縮的目的。相對於其他的音頻編碼算法(無損的),在人耳沒有感覺到明顯失真的條件下,可以達到10倍以上的較大壓縮率。

首先來介紹感知編碼的心理聲學基礎。音頻壓縮的核心是去除冗餘。所謂冗餘就是語音信號中包含的不能爲人耳所感知的信息,它對人類確定音色、音調等信息沒有任何幫助,比如,人耳能聽到的聲音頻率範圍爲20-20KHz,無法感知頻率低於20Hz的次聲波和頻率高於20KHz的超聲波。再比如,人耳也無法聽到一段「不夠響」的聲音。感知編碼就是利用了人類聽覺系統的這類特性,達到去除音頻冗餘信息的目的。

感知編碼中的心理聲學主要有:頻率屏蔽、時域屏蔽、可聽度閾值等。

頻率屏蔽

頻率屏蔽在生活中處處可見,比如你在家中坐在沙發上安靜的看電視,突然,正在裝修的鄰居家一陣很刺耳的電鑽鑽牆的聲音傳來,這時你所能聽到的只有手提電鑽發出的很強的噪聲,儘管此時電視所發出的聲音仍然在刺激着你的耳膜,但你卻充耳不聞,也就是說,一段強度很高的聲音可以完全屏蔽一段強度較低的聲音,這種現象稱爲頻率屏蔽。 
這裏寫圖片描述

時域屏蔽

承接前一個例子,不僅在電鑽發出聲音的時間內人耳聽不到電視機的聲音,就是在電鑽的聲音剛停下來的一小段時間內,人耳也聽不到電視機的聲音,這種現象稱爲時域屏蔽。產生時域屏蔽的原因是人類的聽覺系統是一個增益可調的系統,聽強度較大的聲音時,增益較低,聽強度較小的聲音時,增益較高。有時人類甚至藉助外部手段來改變聽覺系統的增益,比如,捂耳朵以避免強度很大的聲音損傷耳膜,而屏住呼吸、側耳、以手放耳廓後更是聽較弱聲音時的常見行爲。在上例中,強度很大的聲音剛消失時,聽覺系統需要一小段時間來調高增益,正是在這一小段時間內產生了時域屏蔽。 
這裏寫圖片描述 
下面來說可聽度閾值,它對於音頻壓縮灰常重要。

設想在一個安靜的房間中,一臺由計算機控制的揚聲器可以發出某一頻率的聲音,剛開始時揚聲器功率較小,處於一定距離上的聽覺正常的人聽不到揚聲器發出的聲音。然後開始逐漸增大揚聲器的功率,當功率增大到剛好可以被聽見的時候,記錄下此時揚聲器的功率(聲強級,單位分貝),這個功率就是這個頻率下的可聽度閾值。

然後改變揚聲器所發音頻的頻率,重複以上實驗,最終獲得的可聽度閾值隨頻率變化的曲線如下圖所示: 
這裏寫圖片描述 
由圖中可以很明顯的看出,人類的聽覺系統對頻率在1000-5000Hz範圍的聲音最敏感,頻率越接近兩側,人類聽覺反應越遲鈍。

回過頭來再看頻率屏蔽的情形,這次實驗在房間中增加一個頻率爲150Hz,強度爲60dB的信號,然後重複實驗,實驗得出的可聽度閾值曲線如下圖所示: 
這裏寫圖片描述 
從圖中很明顯的看出,可聽度閾值曲線在150Hz附近被強烈的扭曲了,被向上提高了很多。這意味着,本來位於可聽度閾值之上的150Hz附近的某個頻率的聲音,有可能由於150Hz的更強的信號的存在而變得不可聞了,也就是被屏蔽了。

感知編碼的基本規則就是,永遠不需要對人耳聽不到的信號進行編碼,簡單來說就是,聽不到的信號不需要編碼,這句廢話恰恰是語音壓縮研究的重點之一。廢話的另外一種含義就是非常容易理解的正確的話。言歸正傳,哪些東西聽不見呢?功率低於可聽度閾值的信號或者說分量,被屏蔽的信號或者說分量,這些人耳都聽不見,都是上文提到的「冗餘」。

以上是心裏聲學的一些東西。要想很好的理解音頻壓縮,還需要理解一個更重要的概念:子帶。子帶(subband)是指這樣的一種頻率範圍,當兩個音調的頻率位於一個子帶內時,人就會把兩個音調聽成一個。更一般的情況是,如果一個複雜信號的頻率分佈位於一個子帶內時,人耳的感覺是該信號等價於一個頻率位於該子帶中心頻率處的簡單信號,這是子帶的核心內涵。簡單說,子帶是指一個頻率範圍,頻譜位於這個範圍內的信號可以用一個單一頻率的分量來代替。 
這裏寫圖片描述 
一般等價的頻率取子帶的中心頻率,振幅取子帶內個頻率分量振幅的加權和,更簡單的方法則是將各頻率分量的振幅直接相加,作爲等價信號的振幅,這樣一個範圍內的頻率分量用一個分量就可以代替了。

設一個信號的頻譜頻率最低值爲w0,最大值爲w1。子帶編碼就是將w0-w1之間的頻率範圍劃分成若干子帶,然後每個子帶範圍內的分量用一個等價的頻率分量來替換。這樣,一個具有複雜頻譜的信號可以等價爲一個頻譜構成灰常簡單的信號——頻譜被大大簡化了,需要存儲的東西就非常少了。

從以上過程不難知道,子帶如何劃分對壓縮後音頻的質量影響很大(畢竟是近似等價)。子帶的劃分方法是子帶編碼的一個很重要的研究主題,大致可以分爲等寬子帶編碼和變寬子帶編碼,見名知意,不解釋。

子帶劃分後子帶數量的不同導致了壓縮算法的不同等級。容易知道,碼率越低壓縮率越高時,子帶數量少,同時音質較差。相反的情況也容易理解。

理解了子帶編碼,音頻壓縮就很容易理解了,一個信號經過一組三角濾波器(等同於一組子帶)後,被精簡爲數量很少的頻率分量。然後考察這些頻率分量,能量或者說振幅位於可聽度閾值曲線之下的直接無視(刪除該分量,因爲聽不到)。再考察餘下的兩兩相鄰的頻率分量,如果其中一個被旁邊的頻率屏蔽,也刪除掉。經過以上的處理,一個複雜信號的頻譜所含有的頻率分量就很簡單了,使用很少的數據就可以存儲或者傳輸這些信息。

解碼的時候使用傅里葉逆變換將上面得到的簡單頻譜重構到時域上,得到解碼後的語音。

以上就是音頻壓縮的簡單原理,下面談談音頻編解碼庫。

可以公開獲取的音頻編解碼開源庫很多,其特點和能力也有所不同,如下圖: 
這裏寫圖片描述

由圖中可以看到,AAC和MP3等走的是「高端路線」,用來對高採樣率的音樂進行編碼,而AMR和SPEEX等走的是中低端路線,可以處理16K採樣率以下的語音信號,這對於語音合成、語音識別、聲紋識別等語音應用足夠了。

科大訊飛語音雲使用的是SPEEX系列,算法相關信息如下圖所示:

這裏寫圖片描述

Speex編解碼庫壓縮率變換範圍較廣,壓縮等級可供選擇的範圍較寬,所以應用在網絡狀況較爲複雜的移動終端應用中甚爲合適。

好了,以上就是本次課分享的全部內容。

小結:

音頻端點檢測、降噪和語音壓縮,很多人覺得神祕、難於理解和難以把握。但經李老師娓娓道來,平時感覺高大上的語音處理技術也被講的深入淺出。原來,不需要很高深的理論功底也可以理解這些技術的關鍵:音頻端點檢測的關鍵是根據前面的靜音確定用來分辨靜音和有效語音的標尺,降噪的關鍵是使用前面的一小段背景噪音提取出噪聲的頻譜,音頻壓縮方法之一是充分利用人類的心裏聲學,劃分子帶,去除冗餘等。

讓我們一起關注語音處理技術在以上幾個方面的最新發展吧。