在語音識別領域,比較常用的兩個模塊就是librosa和python_speech_features了。
最近也是在做音樂方向的項目,借此做一下筆記,并記錄一些兩者的差別。下面是兩模塊的官方文檔
LibROSA - librosa 0.6.3 documentation?librosa.github.ioWelcome to python_speech_features’s documentation!?python-speech-features.readthedocs.io直接對比兩文檔就可以看出librosa功能十分強大,涉及到了音頻的特征提取、譜圖分解、譜圖顯示、順序建模、創建音頻等功能,而python_speech_features只涉及了音頻特征提取。就特征提取的實現方法和種類來看,兩者也有所不同。
python_speech_features的特征
支持的特征:
- python_speech_features.mfcc() - 梅爾倒譜系數
- python_speech_features.fbank() - 濾波器組能量
- python_speech_features.logfbank() - 對數濾波器組能量
- python_speech_features.ssc() - 子帶頻譜質心特征
提取mfcc、logfbank特征的方法
from python_speech_features import mfcc
from python_speech_features import logfbank
import scipy.io.wavfile as wav(rate,sig) = wav.read("file.wav") # 返回信號的采樣率以及信號數組ndarray
mfcc_feat = mfcc(sig,rate) # 返回一個二維ndarray數組
fbank_feat = logfbank(sig,rate) # 返回一個二維ndarray數組print(fbank_feat[1:3,:])
python_speech_features的比較好用的地方就是自帶預加重參數,只需要設定preemph的值,就可以對語音信號進行預加重,增強高頻信號。
python_speech_features模塊提供的函數
python_speech_features.base.mfcc(signal, samplerate=16000, winlen=0.025, winstep=0.01, numcep=13, nfilt=26, nfft=512, lowfreq=0, highfreq=None, preemph=0.97, ceplifter=22, appendEnergy=True, winfunc=<function <lambda>>)
計算一個音頻信號的MFCC特征
返回: 一個大小為numcep的numpy數組,包含著特征,每一行都包含一個特征向量。
參數:
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個倒譜系數替換為總幀能量的對數。
winfunc - 分析窗口應用于每個框架。 默認情況下不應用任何窗口。 你可以在這里使用numpy窗口函數 例如:winfunc=numpy.hamming
python_speech_features.base.fbank(signal, samplerate=16000, winlen=0.025, winstep=0.01, nfilt=26, nfft=512, lowfreq=0, highfreq=None, preemph=0.97, winfunc=<function <lambda>>)
從一個音頻信號中計算梅爾濾波器能量特征
返回:2個值。第一個是一個包含著特征的大小為nfilt的numpy數組,每一行都有一個特征向量。第二個返回值是每一幀的能量
python_speech_features.base.logfbank(signal, samplerate=16000, winlen=0.025, winstep=0.01, nfilt=26, nfft=512, lowfreq=0, highfreq=None, preemph=0.97)
從一個音頻信號中計算梅爾濾波器能量特征的對數
返回: 一個包含特征的大小為nfilt的numpy數組,每一行都有一個特征向量
python_speech_features.base.ssc(signal, samplerate=16000, winlen=0.025, winstep=0.01, nfilt=26, nfft=512, lowfreq=0, highfreq=None, preemph=0.97, winfunc=<function <lambda>>)
從一個音頻信號中計算子帶頻譜質心特征
返回:一個包含特征的大小為nfilt的numpy數組,每一行都有一個特征向量
librosa的特征提取
librosa的可以提取的特征種類十分豐富

篇幅原因不多介紹
librosa.features.mfcc(y=None,sr=22050,S=None,n_mfcc=20,dct_type=2,norm='ortho',**kwargs)
y, sr = librosa.load('test.wav',offset=30, duration=5)
librosa.feature.mfcc(y=y, sr=sr, n_mfcc=40) # 返回shape=(n_mfcc, timestep)的二維矩陣
librosa.feature.spectral_centroid(y=None,sr=22050,S=None,n_fft=2048,hop_length=512,freq=None)
計算頻譜質心
>>> y, sr = librosa.load('test.wav')
>>> cent = librosa.feature.spectral_centroid(y=y, sr=sr)
>>> cent
array([[ 4382.894, 626.588, ..., 5037.07 , 5413.398]])
藍調音樂的頻譜質心在頻譜偏中心的位置,金屬音樂在靠后的位置
librosa.feature.zero_crossing_rate(y,frame_length=2048,hop_length=512,center=True,**kwargs)
計算過零率
>>> y, sr = librosa.load('test.wav')
>>> librosa.feature.zero_crossing_rate(y)
array([[ 0.134, 0.139, ..., 0.387, 0.322]])
相對于python_speech_features來說,librosa沒有預加重的處理。或者說librosa提供自定義預加重功能。
預加重的一般傳遞函數為
差分方程實現預加重的方程為