目錄
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
感謝博主!