利用函数wavread对语音信号进行采样_语音识别第4讲:语音特征参数MFCC
一、MFCC概述[1]
在語音識(shí)別(SpeechRecognition)和話者識(shí)別(SpeakerRecognition)方面,最常用到的語音特征就是梅爾倒譜系數(shù)(Mel-scaleFrequency Cepstral Coefficients,簡(jiǎn)稱MFCC)。根據(jù)人耳聽覺機(jī)理的研究發(fā)現(xiàn),人耳對(duì)不同頻率的聲波有不同的聽覺敏感度。從200Hz到5000Hz的語音信號(hào)對(duì)語音的清晰度影響對(duì)大。兩個(gè)響度不等的聲音作用于人耳時(shí),則響度較高的頻率成分的存在會(huì)影響到對(duì)響度較低的頻率成分的感受,使其變得不易察覺,這種現(xiàn)象稱為掩蔽效應(yīng)。由于頻率較低的聲音在內(nèi)耳蝸基底膜上行波傳遞的距離(速度)大于頻率較高的聲音,故一般來說,低音容易掩蔽高音,而高音掩蔽低音較困難。在低頻處的聲音掩蔽的臨界帶寬較高頻要小。所以,人們從低頻到高頻這一段頻帶內(nèi)按臨界帶寬的大小由密到疏安排一組帶通濾波器,對(duì)輸入信號(hào)進(jìn)行濾波。將每個(gè)帶通濾波器輸出的信號(hào)能量作為信號(hào)的基本特征,對(duì)此特征經(jīng)過進(jìn)一步處理后就可以作為語音的輸入特征。由于這種特征不依賴于信號(hào)的性質(zhì),對(duì)輸入信號(hào)不做任何的假設(shè)和限制,又利用了聽覺模型的研究成果。因此,這種參數(shù)比基于聲道模型的LPCC相比具有更好的魯邦性,更符合人耳的聽覺特性,而且當(dāng)信噪比降低時(shí)仍然具有較好的識(shí)別性能。
MFCC是在Mel標(biāo)度頻率域提取出來的倒譜參數(shù),Mel標(biāo)度描述了人耳頻率的非線性特性,它與頻率的關(guān)系可用下式近似表示:
其中
為頻率,單位Hz。下圖展示了Mel頻率與線性頻率之間的關(guān)系:附:
import二、MFCC提取過程[2]
基本流程:
連續(xù)語音 預(yù)加重 分幀 加窗 FFT Mel濾波器組 對(duì)數(shù)運(yùn)算 DCT0. 連續(xù)語音
我們這里截取了3.5s的原始聲音數(shù)據(jù)
import numpy as np import scipy.io.wavfile from matplotlib import pyplot as plt from scipy.fftpack import dct# 原始數(shù)據(jù),讀取前3.5s 的數(shù)據(jù) sample_rate, signal = scipy.io.wavfile.read('OSR_us_000_0010_8k.wav') original_signal = signal[0:int(3.5*sample_rate)]signal_num = np.arange(len(signal)) sample_num = np.arange(len(original_signal))# 繪圖 01 plt.figure(figsize=(11,7), dpi=500)plt.subplot(211) plt.plot(signal_num/sample_rate, signal, color='black') plt.plot(sample_num/sample_rate, original_signal, color='blue') plt.ylabel("Amplitude") plt.title("signal of Voice")plt.subplot(212) plt.plot(sample_num/sample_rate, original_signal, color='blue') plt.xlabel("Time (sec)") plt.ylabel("Amplitude") plt.title("3.5s signal of Voice ")plt.savefig('mfcc_01.png')其中 ,我們通常取為0.97。預(yù)加重的目的是提升高頻部分,使信號(hào)的頻譜變得平坦,保持在低頻到高頻的整個(gè)頻帶中,能用同樣的信噪比求頻譜。同時(shí),也是為了消除發(fā)生過程中聲帶和嘴唇的效應(yīng),來補(bǔ)償語音信號(hào)受到發(fā)音系統(tǒng)所抑制的高頻部分,也為了突出高頻的共振峰。# 預(yù)加重
2. 分幀
先將N個(gè)采樣點(diǎn)集合成一個(gè)觀測(cè)單位,稱為幀。通常情況下N的值為256或512,涵蓋的時(shí)間約為20~30ms左右。為了避免相鄰兩幀的變化過大,因此會(huì)讓兩相鄰幀之間有一段重疊區(qū)域,此重疊區(qū)域包含了M個(gè)取樣點(diǎn),通常M的值約為N的1/2或1/3。通常語音識(shí)別所采用語音信號(hào)的采樣頻率為8KHz或16KHz,以8KHz來說,若幀長(zhǎng)度為256個(gè)采樣點(diǎn),則對(duì)應(yīng)的時(shí)間長(zhǎng)度是256/8000 1000=32ms。預(yù)加重后,我們需要將信號(hào)分成短時(shí)幀。這一步背后的基本原理是信號(hào)中的頻率隨時(shí)間而變化,所以在大多數(shù)情況下,對(duì)整個(gè)信號(hào)進(jìn)行傅立葉變換是沒有意義的,因?yàn)槲覀儠?huì)隨著時(shí)間的推移丟失信號(hào)的頻率輪廓。為了避免這種情況,我們可以安全地假設(shè)信號(hào)中的頻率在很短的時(shí)間內(nèi)是平穩(wěn)的。因此,通過在這個(gè)短時(shí)間幀內(nèi)進(jìn)行傅里葉變換,我們可以通過連接相鄰幀來獲得信號(hào)的頻率輪廓的良好近似。
語音處理范圍內(nèi)的典型幀大小范圍為20毫秒到40毫秒,連續(xù)幀之間重疊50%(+/- 10%)。流行設(shè)置25毫秒的幀大小,frame_size = 0.025和-10毫秒的步幅(15毫秒重疊), frame_stride = 0.01。
# 分幀3. 加窗
將每一幀乘以漢明窗,以增加幀左端和右端的連續(xù)性。假設(shè)分幀后的信號(hào)為S(n), n=0,1,…,N-1, N為幀的大小,那么乘上漢明窗后 形式如下:不同的 值會(huì)產(chǎn)生不同的漢明窗,一般情況下取為0.46。# 漢明窗
在將信號(hào)切分為幀后,我們將一個(gè)窗口函數(shù)(如Hamming窗口)應(yīng)用于每個(gè)幀。有幾個(gè)原因需要對(duì)窗框應(yīng)用窗函數(shù),特別是為了抵消FFT所假設(shè)的數(shù)據(jù)是無限的,并減少頻譜泄漏。
# 加漢明窗4. 快速傅里葉變換 FFT
由于信號(hào)在時(shí)域上的變換通常很難看出信號(hào)的特性,所以通常將它轉(zhuǎn)換為頻域上的能量分布來觀察,不同的能量分布,就能代表不同語音的特性。所以在乘上漢明窗后,每幀還必須再經(jīng)過快速傅里葉變換以得到在頻譜上的能量分布。對(duì)分幀加窗后的各幀信號(hào)進(jìn)行快速傅里葉變換得到各幀的頻譜。并對(duì)語音信號(hào)的頻譜取模平方得到語音信號(hào)的功率譜。設(shè)語音信號(hào)的DFT為: ,式中 為輸入的語音信號(hào), 表示傅里葉變換的點(diǎn)數(shù)。# 傅里葉變換和功率譜 NFFT = 512 mag_frames = np.absolute(np.fft.rfft(frames, NFFT)) # Magnitude of the FFT pow_frames = (1.0 / NFFT) * (mag_frames ** 2)
5. 三角帶通濾波器 (Mel濾波)
將能量譜通過一組Mel尺度的三角形濾波器組,定義一個(gè)有M個(gè)濾波器的濾波器組(濾波器的個(gè)數(shù)和臨界帶的個(gè)數(shù)相近),采用的濾波器為三角濾波器,中心頻率為 。M通常取22-26。各f(m)之間的間隔隨著m值的減小而縮小,隨著m值的增大而增寬,如圖所示三角濾波器的頻率響應(yīng)定義為:式中,
三角帶通濾波器有兩個(gè)主要目的:對(duì)頻譜進(jìn)行平滑化,并消除諧波的作用,突顯原先語音的共振峰。(因此一段語音的音調(diào)或音高,是不會(huì)呈現(xiàn)在MFCC 參數(shù)內(nèi),換句話說,以MFCC 為特征的語音辨識(shí)系統(tǒng),并不會(huì)受到輸入語音的音調(diào)不同而有所影響)此外,還可以降低運(yùn)算量。
6. 計(jì)算每個(gè)濾波器組輸出的對(duì)數(shù)能量為
, # 將頻率轉(zhuǎn)換為Mel頻率 low_freq_mel = 0nfilt = 40 high_freq_mel = (2595 * np.log10(1 + (sample_rate / 2) / 700)) mel_points = np.linspace(low_freq_mel, high_freq_mel, nfilt + 2) # Equally spaced in Mel scale hz_points = (700 * (10**(mel_points / 2595) - 1)) # Convert Mel to Hzbin = np.floor((NFFT + 1) * hz_points / sample_rate)fbank = np.zeros((nfilt, int(np.floor(NFFT / 2 + 1))))for m in range(1, nfilt + 1):f_m_minus = int(bin[m - 1]) # leftf_m = int(bin[m]) # centerf_m_plus = int(bin[m + 1]) # rightfor k in range(f_m_minus, f_m):fbank[m - 1, k] = (k - bin[m - 1]) / (bin[m] - bin[m - 1])for k in range(f_m, f_m_plus):fbank[m - 1, k] = (bin[m + 1] - k) / (bin[m + 1] - bin[m]) filter_banks = np.dot(pow_frames, fbank.T) filter_banks = np.where(filter_banks == 0, np.finfo(float).eps, filter_banks) # Numerical Stability filter_banks = 20 * np.log10(filter_banks) # dB7. 經(jīng)離散余弦變換(DCT)得到MFCC系數(shù)
,將上述的對(duì)數(shù)能量帶入離散余弦變換,求出L階的Mel-scale Cepstrum參數(shù)。L階指MFCC系數(shù)階數(shù),通常取12-16。這里M是三角濾波器個(gè)數(shù)。
事實(shí)證明,前一步計(jì)算出的濾波器組系數(shù)高度相關(guān),這在某些機(jī)器學(xué)習(xí)算法中可能存在問題。因此,我們可以應(yīng)用離散余弦變換(DCT)去相關(guān)濾波器組系數(shù)并產(chǎn)生濾波器組的壓縮表示。通常,對(duì)于自動(dòng)語音識(shí)別(ASR),所得到的倒譜系數(shù)2-13被保留,其余的被丟棄; num_ceps = 12。丟棄其他系數(shù)的原因是它們表示濾波器組系數(shù)的快速變化,并且這些細(xì)節(jié)不會(huì)有助于自動(dòng)語音識(shí)別(ASR)。
num_ceps可以將正弦升降1應(yīng)用于MFCC以降低已被聲稱在噪聲信號(hào)中改善語音識(shí)別的較高M(jìn)FCC.
n = np.arange(ncoeff) cep_lifter =22 lift = 1 + (cep_lifter / 2) * np.sin(np.pi * n / cep_lifter) mfcc *= lift如前所述,為了平衡頻譜并改善信噪比(SNR),我們可以簡(jiǎn)單地從所有幀中減去每個(gè)系數(shù)的平均值。平均歸一化濾波器組:
filter_banks對(duì)于MFCC也是如此,平均歸一化MFCC:
mfcc最后結(jié)果為
# 繪圖 04 plt.figure(figsize=(11,7), dpi=500)plt.subplot(211) plt.imshow(np.flipud(filter_banks.T), cmap=plt.cm.jet, aspect=0.2, extent=[0,filter_banks.shape[1],0,filter_banks.shape[0]]) #畫熱力圖 plt.title("MFCC")plt.subplot(212) plt.imshow(np.flipud(mfcc.T), cmap=plt.cm.jet, aspect=0.2, extent=[0,mfcc.shape[0],0,mfcc.shape[1]])#熱力圖 plt.title("MFCC")plt.savefig('mfcc_04.png')8. 對(duì)數(shù)能量
此外,一幀的音量(即能量),也是語音的重要特征,而且非常容易計(jì)算。因此,通常再加上一幀的對(duì)數(shù)能量(定義:一幀內(nèi)信號(hào)的平方和,再取以10為底的對(duì)數(shù)值,再乘以10)使得每一幀基本的語音特征就多了一維,包括一個(gè)對(duì)數(shù)能量和剩下的倒頻譜參數(shù)。注:若要加入其它語音特征以測(cè)試識(shí)別率,也可以在此階段加入,這些常用的其它語音特征包含音高、過零率以及共振峰等。
9.動(dòng)態(tài)查分參數(shù)的提取(包括一階差分和二階差分)
標(biāo)準(zhǔn)的倒譜參數(shù)MFCC只反映了語音參數(shù)的靜態(tài)特性,語音的動(dòng)態(tài)特性可以用這些靜態(tài)特征的差分譜來描述。實(shí)驗(yàn)證明:把動(dòng)、靜態(tài)特征結(jié)合起來才能有效提高系統(tǒng)的識(shí)別性能。差分參數(shù)的計(jì)算可以采用下面的公式:式中,dt表示第t個(gè)一階差分;Ct表示第t個(gè)倒譜系數(shù);Q表示倒譜系數(shù)的階數(shù);K表示一階導(dǎo)數(shù)的時(shí)間差,可取1或2。將上式中結(jié)果再代入就可以得到二階差分的參數(shù)。總結(jié):因此,MFCC的全部組成其實(shí)是由:N維MFCC參數(shù)(N/3MFCC系數(shù)+ N/3一階差分參數(shù)+ N/3二階差分參數(shù))+幀能量(此項(xiàng)可根據(jù)需求替換)。
參考
總結(jié)
以上是生活随笔為你收集整理的利用函数wavread对语音信号进行采样_语音识别第4讲:语音特征参数MFCC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 100内奇数之和流程图_Python进阶
 - 下一篇: 如何将瀑布流里的图片加链接_「魔幻瀑布」