python-speech-featuresとlibrosaの相違点


python-speech-featuresのfbankとlibrosa.feature.melspectrogramの処理の違いを軽くまとめてみる。

プリエンファシスフィルタの有無

プリエンファシスフィルタは波形の広域成分を強調する効果を有している。python-speech-featuresではプリエンファシスフィルタを入力波形に適用させているのに対し、librosaはプリエンファシスフィルタを適用していない。

窓関数・FFTsize

FFTを波形に適用するときに、波形を切り出し、切り出された波形の末端成分を滑らかにするために窓関数をかけるのが一般的である。一般的には、窓関数の幅は、FFTの幅と一致させる。librosaのstft内では、窓関数の幅はデフォルトではFFTsizeと一致し、波形同士で重複する幅は、FFTsize/4のサイズとなる。窓関数の幅をFFTsizeと一致させなかった場合、窓はFFTsizeに合うようにパディングされる(pad_mode='reflect')。対してpython-speech-featuresでは、引数であるwinlen・winstep・サンプリングレートから、窓幅=winlen×samplerate、窓の重複幅=winstep×samplerate、でそれぞれ算出する上、FFTsizeはデフォルトで512となっているため、デフォルトのままだと窓幅とFFTsizeが一致しない。なお、librosaの窓関数はデフォルトではハン窓であるのに対し、python-speech-featuresでは矩形窓である。

fftに用いているライブラリ

python-speech-features:numpy.fft.rfft
librosa:scipy.fftpack.fft
それぞれデフォルトだと、出力される次元が異なる

delta特徴量

python-speech-features.base.deltaでは、データの個数が3に対しての移動平均を算出したものであり単純な行列処理である。一方で、librosaでは、librosa.feature.utils.deltaの内部でscipy.signal.savgol_filterが用いられている。Savitzky-Golayフィルタは最小二乗法による多項式近似により信号を平準化し、信号の高周波数成分を維持しつつ平準化したい時に有効なフィルタである。savgol_filter関数は引数として、対象の信号、フィルタ窓の長さ(近似に使うデータ数)、多項式の次数をとるので、フィルタ窓を3、多項式の次数を1とすれば、python-speech-featuresでのdelta特徴量と同じ結果が返ってくる。