Mel Frequency Cepstral Coefficients (MFCCs)
wiki里說
在聲音處理中,梅爾頻率倒譜( MFC ) 是聲音的短期功率譜的表示,基于非線性梅爾頻率標度上的對數功率譜的線性余弦變換。
倒譜和MFC 之間的區別在于,在 MFC 中,頻帶在梅爾尺度上等距分布,這比正常頻譜中使用的線性間隔頻帶更接近人類聽覺系統的響應。這種頻率扭曲可以更好地表示聲音,例如,在可能會降低傳輸帶寬的音頻壓縮中以及音頻信號的存儲要求。
梅爾頻率倒譜系數( MFCC ) 是共同構成 MFC 的系數。它們源自音頻剪輯的一種倒譜表示。
信號的梅爾頻率倒譜系數 (MFCC) 是一小組特征(通常為 10-20),它們簡明地描述了 spectral envelope 的??整體形狀。在MIR中,它常被用來描述音色。在應用 Hamming window、 Mel-filterbank、log conversion和離散傅里葉變換 (DCT) 之后,我們通常會得到大小為 12 的特征向量 x i。通常情況下,第零倒譜系數被排除在外即使用1-13個倒譜系數,需要將原始能量的度量添加到特征向量中。
本文參考了Gender identification of a speaker using MFCC and GMM論文中描述的MFCC把語音轉換為參數方法
將一個語音信號轉換為MFCC要以下幾個步驟:
讓采樣后的信號通過一個濾波器,并調整高低頻率的強度。濁音區域的頻譜通過預加重進行補償,預加重會放大高頻區域并執行濾波。簡單描述實現就是:
α是濾波器的系數,常為0.95-0.97
但是這是很多年前因為有限的計算資源迫使開發人員創建的方法。
對于信號消歧而言,較高的頻率比較低的頻率更為重要。
在古早的時間里,應用模擬預加重濾波器會更容易獲得好結果,因此大家都用了預加重。
預加重的另一個好特性是它有助于處理錄音中經常出現的 DC offset 直流偏移,因此它可以改進基于能量的語音活動檢測。
而現代語音識別不需要預加重。預加重在后期通過 channel normalization(如倒譜均值歸一化)進行補償,因此可能沒有影響。
預加重的好處:
- 平衡頻譜
- 避免 Fourier transform 操作期間的數值問題
- 改善信號噪聲比 Signal-to-Noise Ratio (SNR)
與所有語音分析方法一樣,MFCC 方法也適用于語音具有固定聲學特征的短部分。即進行分幀framing,一幀有N個采樣點,分幀主要是為了簡化處理,假設在短時間范圍內音頻信號變化不大。如果幀很短,就沒有足夠的樣本來獲得可靠的頻譜估計,如果幀很長,則信號在整個幀中變化太大,因此通常選擇的參數為 20-30 毫秒,沿信號偏移 10-15 毫秒。
在大多數情況下,對整個信號進行傅里葉變換沒有意義,因為會隨著時間的推移丟失信號的頻率輪廓(時序信息?)。通過對這個短時間幀進行傅立葉變換,我們可以通過連接相鄰幀來獲得信號頻率輪廓的良好近似(這句話沒怎么理解這個良好近似)。每一幀都包含其前一幀的一部分。
語音處理中的典型幀大小范圍為 20 到 40 毫秒,連續幀之間有 50% (+/-10%) 的重疊。
通常的設置是:
幀大小為 25 ms,frame_size = 0.025 和 10 ms stride(15ms overlap ),frame_stride = 0.01。
在語音應用中,漢明窗通常是首選。應用漢明窗是這里說可以減少頻譜泄露,同時能夠平滑信號的邊緣,并在對信號進行 DFT 時減少邊緣效應,其公式為:
可以用np.hamming
功率譜是由人類耳蝸啟發的,它根據傳入聲音的頻率在不同的位置振動。根據振動的耳蝸位置,不同的神經會發出信號,通知大腦存在某些頻率。周期頻譜圖估計執行類似的操作,用來識別幀中存在哪些頻率。
語音信號被劃分成分析窗口,通過FFT從時域變換到頻域。這種表示語音信號頻率分布的符號稱為幅度譜。
amplitude spectrum / magnitude spectrum
我們現在可以做一個 N- 對每一幀進行點FFT計算頻譜,也稱為短時傅立葉變換(STFT),其中 N通常為 256 或 512,NFFT = 512;然后使用以下公式計算功率譜
也就是對每一幀進行FFT變換,這是為了padding
為了將獲得的振幅譜轉換為 mel-scale,使用相對于 mel-scale 線性放置的濾波器組。該組由重疊 50% 的三角形帶通濾波器組成。一般濾波系數取值在20~30之間。
mel filter的公式:
濾波組的公式:
band filter頻帶分析以模擬耳朵的掩蔽效應以及非線性頻率和帶寬分配,使用 DFT 計算每個頻帶中的能量
關于mel scale:mel scale將純音的感知頻率或音調與其實際測量頻率相關聯。與高頻相比,人類更善于辨別低頻音高的微小變化。結合這個尺度使音頻的特征更接近人類聽到的。
先把hz轉成mel單位
def freq2mel(freq):"""Convert Frequency in Hertz to MelsArgs:freq: A value in Hertz. This can also be a numpy array.ReturnsA value in Mels."""return 2595 * np.log10(1 + freq / 700.0)再轉回去
def mel2freq(mel):"""Convert a value in Mels to HertzArgs:mel: A value in Mels. This can also be a numpy array.ReturnsA value in Hertz."""return 700 * (10 ** (mel / 2595.0) - 1)計算濾波器組和頻率頻譜圖的內積,對每個濾波器中的能量求和,再進行log計算。
一旦算出了濾波器組的能量,就取它們的對數。這也是受人類聽覺的啟發,人類聽不到線性尺度的響度。通常要將聲音的感知音量加倍,需要投入將近 8 倍的能量。這意味著如果聲音一開始就很大,那么能量的巨大變化聽起來可能并沒有什么不同。這種壓縮操作使濾波器組的特征更接近于人類實際聽到的聲音。
為什么用對數而不是立方根?對數允許使用倒譜均值減法,這是一種通道歸一化技術
有點不懂的是他算的公式是20 * np.log10(fbank),有點不太清楚這個公式是哪里來的。感覺用librosa庫的會多一些
濾波器組都是重疊的,DCT 對頻譜系數去相關,并允許使用對角高斯分布對它們進行建模,同時表示語音幀所需的參數數量減少了。這反過來又減少了內存和計算需求。26 個 DCT 系數中只保留了 12 個是因為較高的 DCT 系數表示濾波器組能量的快速變化,但這些快速變化實際上會降低 ASR 性能,因此通過舍棄這些DCT系數讓性能小幅增加。DCT 的一個特性是去相關并將大部分信息保留在前幾個系數中。
主要作用是對濾波器組進行去相關操作,舍棄除了自己設定的num_ceps以外的值,這些值代表濾波器組系數的快速變化,而這些細節對自動語音識別 (ASR) 沒有什么幫助,然后將lift與mfcc相乘計算外積,以弱化較高的 MFCC,據稱可以改善噪聲信號中的語音識別
cep_lifter 是 Cepstral liftering order
num_ceps 是 number of cepstral coefficients (C1-C12, omitting C0)
lift = 1 + (cep_lifter / 2.0) * np.sin(np.pi * np.arange(num_ceps) / cep_lifter)
mfcc = dct(fbank,norm=‘ortho’)[1:num_ceps+1]
mfcc *= lift
通常在自動語音識別的時候,并不關心信號的音調信息(聲帶),更感興趣的是與音素相關的信息或由于產生聲音的聲道形狀而產生的信息。音高值通常有一個低周期,當移動到倒譜域(使用 DCT 或 IDFT)時,會在mid到end范圍。這就是為什么大多數只選擇前 12 或 13 個 MFCC,而不包括音高信息的原因。
如果正在構建一個音調信息很重要的系統,應該增加 MFCC 的數量(人聲識別)
總結
以上是生活随笔為你收集整理的Mel Frequency Cepstral Coefficients (MFCCs)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java license 开源_MinI
- 下一篇: 滴滴估值5000亿?准备今年上市?女孩遇