Mel頻率倒譜系數法函數使用及理論概述(MFCC)

目錄

 

MFCC簡介:

Python代碼說明

MFCC簡介:

  Mel頻率是基於人耳聽覺特性提出來的,它與Hz頻率成非線性對應關係 。Mel頻率倒譜系數(MFCC)則是利用它們之間的這種關係,計算得到的Hz頻譜特徵,MFCC已經廣泛地應用在聲紋識別和語音識別領域。由於Mel頻率與Hz頻率之間非線性的對應關係,使得MFCC隨着頻率的提高,其計算精度隨之下降。因此,在應用中常常只使用低頻MFCC,而丟棄中高頻MFCC,MFCC的提取主要包括以下幾個步驟:

1.預濾波:前端帶寬爲300-3400Hz的抗混疊濾波器。

2.A/D變換:8kHz的採樣頻率,12bit的線性量化精度。

3.預加重:通過一個一階有限激勵響應高通濾波器,使信號的頻譜變得平坦,不易受到有限字長效應的影響。

4.分幀:爲了方便對語音分析,可以將語音分成一個個小段,稱之爲:幀。先將N個採樣點集合成一個觀測單位,稱爲幀。通常情況下N的值爲256或512,涵蓋的時間約爲20~30ms左右。爲了避免相鄰兩幀的變化過大,因此會讓兩相鄰幀之間有一段重疊區域,此重疊區域包含了M個取樣點,通常M的值約爲N的1/2或1/3。通常語音識別所採用語音信號的採樣頻率爲8KHz或16KHz,以8KHz來說,若幀長度爲256個採樣點,則對應的時間長度是256/8000×1000=32ms。

5.加窗:採用哈明窗對一幀語音加窗,以減小吉布斯效應的影響。語音在長範圍內是不停變動的,沒有固定的特性無法做處理,所以將每一幀代入窗函數,窗外的值設定爲0,其目的是消除各個幀兩端可能會造成的信號不連續性。常用的窗函數有方窗、漢明窗和漢寧窗等,根據窗函數的頻域特性,常採用漢明窗。將每一幀乘以漢明窗,以增加幀左端和右端的連續性

6.快速傅立葉變換(Fast Fourier Transformation, FFT): 由於信號在時域上的變換通常很難看出信號的特性,所以通常將它轉換爲頻域上的能量分佈來觀察,不同的能量分佈,就能代表不同語音的特性。所以在乘上漢明窗後,每幀還必須再經過快速傅里葉變換以得到在頻譜上的能量分佈。對分幀加窗後的各幀信號進行快速傅里葉變換得到各幀的頻譜。並對語音信號的頻譜取模平方得到語音信號的功率譜。

7.三角窗濾波: 用一組Mel頻標上線性分佈的三角窗濾波器(共24個三角窗濾波器),對信號的功率譜濾波,每一個三角窗濾波器覆蓋的範圍都近似於人耳的一個臨界帶寬,以此來模擬人耳的掩蔽效應。

8.求對數:三角窗濾波器組的輸出求取對數,可以得到近似於同態變換的結果。

9.離散餘弦變換(Discrete Cosine Transformation, DCT): 去除各維信號之間的相關性,將信號映射到低維空間。

10.譜加權:由於倒譜的低階參數易受說話人特性、信道特性等的影響,而高階參數的分辨能力比較低,所以需要進行譜加權,抑制其低階和高階參數。 倒譜均值減(Cepstrum Mean Subtraction, CMS):CMS可以有效地減小語音輸入信道對特徵參數的影響。

11.差分參數: 實驗表明,在語音特徵中加入表徵語音動態特性的差分參數,能夠提高系統的識別性能。

12.短時能量:語音的短時能量也是重要的特徵參數,短時歸一化對數能量及其一階差分、二階差分參數

Python代碼說明

  該示例代碼調用的是 python_speech_features 包提取MFCC,MFCC基本維數是13維,將其與一階差分、二階差分組合,返回的是39維特徵的MFCC。
 

from python_speech_features import *
import numpy as np
import scipy.io.wavfile
from matplotlib import pyplot as plt


class WavtoMfcc(object):

    def __init__(self, ul, num_wav, numc=13):

        self.numc = numc
        self.ul = ul
        self.num_wav = num_wav

    def get_mfcc(self, data, fs):

        wav_feature = mfcc(data, fs, numcep=self.numc, winlen=0.025, winstep=0.01,
                           nfilt=26, nfft=512, lowfreq=0, highfreq=None, preemph=0.97)
        '''
        signal - 需要用來計算特徵的音頻信號,應該是一個N*1的數組
        samplerate - 我們用來工作的信號的採樣率
        winlen - 分析窗口的長度,按秒計,默認0.025s(25ms)
        winstep - 連續窗口之間的步長,按秒計,默認0.01s(10ms)
        numcep - 倒頻譜返回的數量,默認13
        nfilt - 濾波器組的濾波器數量,默認26
        nfft - FFT的大小,默認512
        lowfreq - 梅爾濾波器的最低邊緣,單位赫茲,默認爲0
        highfreq - 梅爾濾波器的最高邊緣,單位赫茲,默認爲採樣率/2
        preemph - 應用預加重過濾器和預加重過濾器的係數,0表示沒有過濾器,默認0.97
        ceplifter - 將升降器應用於最終的倒譜系數。 0沒有升降機。默認值爲22。
        appendEnergy - 如果是true,則將第0個倒譜系數替換爲總幀能量的對數。 
        '''
        d_mfcc_feat = delta(wav_feature, 1)
        d_mfcc_feat2 = delta(wav_feature, 2)
        feature = np.hstack((wav_feature, d_mfcc_feat, d_mfcc_feat2))
        return feature

    def readwav(self):
        total_mfcc = []
        total_num, numk = [], []
        m1 = 0
        for i in range(1, 31):
            sample_rate, signal = scipy.io.wavfile.read(self.ul + str(i) + '.wav')
            mfcck = self.get_mfcc(signal, sample_rate)
            m, n = mfcck.shape
            total_mfcc.extend(mfcck)
            m1 = m1 + m
            numk.append(m)
            total_num.append(m1)
        total_mfcc = np.array(total_mfcc)
        plt.figure()
        plt.plot(signal)
        plt.show()
        return total_mfcc, total_num


if __name__ == '__main__':

    ul = 'D:/PyWork/train_data/'
    k = 30  # 讀取音頻數量
    mfccdim = 13  # mfcc基本維數
    getmfcc = WavtoMfcc(ul, k, mfccdim)
    mfcc, numk = getmfcc.readwav()
    print(mfcc.shape)

信號可視化:

在這裏插入圖片描述

原文鏈接:

https://blog.csdn.net/qq_27847813/article/details/98869311

感謝博主!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章