語音處理中MFCC(Mel頻率倒譜係數)對應的物理含義是什麼?它計算出的那幾個係數能反映什麼樣特徵?

我想用MFCC作為語音的特徵,但是不清楚它的實際含義


MFCC有多種實現,各種實現細節上會略有不同,但總的思路是一致的。

以識別中常用的39維MFCC為例,分為: 13靜態係數 + 13一階差分係數 + 13 二階差分係數

其中差分係數用來描述動態特徵,也即聲學特徵在相鄰幀間的變化情況。

靜態mfcc假設幀與幀之間相互獨立,這與實際情況未必符合,比如濁音時相鄰幀之間相關程度很高,對應的靜態mfcc可能也有較大相關,而動態係數描述了相鄰幀的聯繫,解決了靜態mfcc不合理假設可能帶來的問題。(極限情況下假設濁音時相鄰幀靜態mfcc完全相等,則差分係數為零,而清音時差分係數則和靜態mfcc幅度相當。這種相鄰幀特徵的關係通過差分特徵得以獲取)

13維靜態係數由 1 log Energy 係數 + 12 dct 係數 構成, log Energy 可以用來區分語音幀和非語音幀, 下面分析12 dct係數的含義:

N -&> 24

首先對一幀信號做短時傅里葉變換,得到能量譜(幅度譜平方),直接將所有頻點 (N維)能量作為特徵有非常大的冗餘,因為聽覺掩蔽效應許多相鄰頻率對人耳作用結果相似,因此通常用少量filterbank將頻域劃分成少量子帶(比如24個filterbank,這些子帶在mel頻域是均勻劃分的,相鄰子帶有一半重疊,在自然頻域則是低頻窄高頻寬), 每個子帶輸出子帶能量和作為特徵表徵該頻率段的能量水平,這樣就得到24個特徵。

24 -&> 12

這裡首先要對24個子帶能量求對數,這也是叫它倒譜係數的原因,我理解這裡求對數只是壓縮一下動態範圍,也可能是模仿人耳對數式感知聲強的特點。由於子帶有重疊,所以相鄰子帶能量有一定冗餘,可以採用 Karhunen-Loeve變換去相關並選擇主成分進行降維,也就是主成分分析。這個變換比較複雜,DCT變換是K-L變換的一個很好近似。通過DCT變換對24個子帶能量特徵進行去相關並降到13維, 包括C0~C12。 C0其實就是各個子帶的總能量水平,我覺得和 log Energy想要表達的東西是一致的,因此有的實現保留C0不要log Energy,有的實現則相反,應該差別不大。但主流方式是捨棄C0, 保留C1~C12共12維特徵。 另外也有文獻認為低階和高階dct係數都很容易受雜訊影響,而中階係數則相對穩定許多,因此也有一些實現中帶有倒譜提升環節,其目的就是抑制C1 C12這類兩端的係數,加強C6 C7這類中間的係數。

大致就是這樣了,各種實現細節可能有些差別,性能上應該相差不大,自己實現時也沒必要太在意是否一定要和HTK等工具提取的特徵完全匹配。

若理解有誤,懇請指正,謝謝~ 希望對大家有幫助!

隨附黃學東的spoken language processing書中關於MFCC選擇的圖表:


一般把各個MFCC係數整體作為一個向量來看待,很難解釋其中每一個係數的含義。


兩個關鍵點,時域變頻域、音調線性化。

時域變頻域好理解吧,因為我們採到的是電壓變化值(時域),而實際表徵我們聲音的主要是頻率(高低音)在時域上的變化。所以要把一截一截的信號轉到頻域上來。

音調線性化是因為人的聽覺是對音調線性而不是對頻率線性的,音調和頻率是對數關係。


廢話不多說,直接上圖

MFCC的物理含義,簡單地說可以理解為語言信號的能量在不同頻率範圍的分布。如果把計算出的係數的低位部分(一般是前12個)作反傅立葉變換(IFFT),就可以得到上圖中虛線表示的信號的頻譜包絡,也就是表示聲帶特徵的那一部分低頻信息。

要理解為什麼可以這麼做,我們先看看倒譜的定義:一種信號的傅里葉變換譜經對數運算後再進行的傅里葉反變換(IFFT)。(IFFT其實就是對頻譜再作一次FFT)

人的發聲過程可以看作是肺里的氣流通過聲帶這個線性系統。如果用e(t)表示聲音的輸入激勵(音高),h(t)表示聲帶的響應(也即我們需要獲取的特徵),那麼聽到的語音信號為 x(t) = e(t) *h(t) ,即兩者的卷積。在頻域內則可以表示為兩者的乘積 X(w) = E(w) cdot H(w) 。通常在頻域分析中我們只關注頻譜的能量,忽略其相位信息,即 left | {X(w)}
ight | = left | {E(w)}
ight |left | {H(w)}
ight |

接下來對頻譜作對數運算, logleft | {X(w)}
ight | = logleft | {E(w)}
ight | +logleft | {H(w)}
ight |

最後再作傅里葉反變換便可以得到倒譜係數: c(n) = IDFT (logleft | {X(w)}
ight | )= IDFT(logleft | {E(w)}
ight | +logleft | {H(w)}
ight |)

下面兩幅圖很好地解釋了這個過程,語音信號的頻譜可以看作是低頻的包絡和高頻的細節相加,在得到倒譜係數後,我們只需要取低位的係數便可以得到包絡信息。(這裡的x[k]即為倒譜係數)

注意整個過程中我們並沒有明確計算 e(t) 和 h(t) ,而是通過直接對語音信號x(t)作倒譜分析,再提取低位的倒譜係數,就可以獲取我們想要的聲道特徵。

有意思的是,對數頻譜作傅里葉反變換後的域被稱為quefrency domain(對應頻域frequency domain),quefrency domain和時域time domain類似但不完全一樣。提取低位係數的操作稱為low-time liftering(對應濾波操作filtering)。同樣地,我們可以通過high-time liftering來獲取激勵特徵。

當然在MFCC的實際計算中我們並沒有作傅里葉反變換,而是先將頻譜通過一組三角濾波器,再作離散餘弦變換(DCT)得到MFCC係數。但其物理意義是一樣的,即表示信號頻譜的能量在不同頻率區間的分布。每一個濾波器的作用就是得到對應頻率區間的頻譜能量,如果我們有26個三角濾波器,就會得到26個MFCC係數,這時候再取低位的係數就可以代表聲道的特徵。

參考 Cepstral Analysis of Speech 和CMU的課件 http://www.speech.cs.cmu.edu/15-492/slides/03_mfcc.pdf


查耳蝸


推薦閱讀:

計算機專業課外書?
mathμ(計算機代數系統)項目還在繼續嗎?
如何將Matlab R2015b語言修改成英文?
matlab 散點圖 部分點坐標連線?

TAG:語音識別 | 計算機科學 |