Wizard Notes

音楽信号解析の技術録、音楽のレビューおよび分析、作曲活動に関する雑記です

LibROSA で MFCC(メル周波数ケプストラム係数)を算出して楽器の音色を分析

この記事をシェアする

f:id:Kurene:20191102230316p:plain
MFCC 算出の流れ

この記事では、 音に関するデータ分析や機械学習・深層学習で良く使われている MFCC*1 (メル周波数ケプストラム係数)という特徴量を使って、楽器の音色を分析できるかどうかを検証します。

MFCC とは?

MFCCは音声認識や音楽ジャンル分類などで使われる特徴量であり、人間の聴覚特性を考慮した周波数スペクトルの概形(包絡線)を表しています。MFCCは楽器音に対しては音色に対応しており、音色が異なるとMFCCの形状は異なることが期待されます。

MFCCの算出の流れとしては、

  1. 時間信号フーリエ変換して周波数信号を算出
  2. 周波数信号のパワー or 振幅成分を抽出し、対数をとる
    • 人間の音量(音圧)に対する知覚は対数的であるため
  3. ↑ をメル尺度(メル周波数) に変換し、メル周波数スペクトルを抽出
    • 人間の音高(周波数)に対する聴感特性を考慮
    • 各メル周波数に対応した三角窓を使って抽出(後述)
  4. メル周波数スペクトルケプストラム分析

となっています。

画像のJPEG圧縮などで使われる離散コサイン変換(DCT)変換して低次元成分のみ取り出すことで、メル周波数スペクトル全体の余分な細かい成分を無視することができます。

詳しい算出方法は以下のWebサイトなどをご参照ください。

LibROSAを使ったMFCCの算出方法

1. 時間信号から直接算出

n_mfcc = 20
y, sr = librosa.load(audiofilepath, sr=16000)
mfcc_tmp = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=n_mfcc, dct_type=3)

さくっとMFCC だけを抽出したいときには、librosa.feature.mfcc が便利です。

Numpy配列の時間信号を引数として渡すだけで、MFCCが算出できます。

チューニングするパラメタとして重要なのが、MFCCの次数(特徴ベクトルの次元数)n_mfccです。n_mfccを大きい値にすると、メル周波数スペクトル包絡のより細かい成分まで考慮することができます。ただし、特徴ベクトルとして次元数が増えてしまうこともあり、分析や機械学習で使う場合は12~24くらいの次元数がよく使われます。

2. メルスペクトログラムから抽出

もう少し各過程を追いたい場合や中間信号を算出したい(例:メルスペクトログラムも出力したい)場合、LibROSAの関数群を使った以下のようなスクリプトを書くことで、中間信号を出力しながらMFCCを算出することができます。

audiofilepath = ...
sr = ...
y, sr = librosa.load(audiofilepath, sr=sr)

# 振幅スペクトログラムを算出
D = np.abs(librosa.stft(y))
D_dB = librosa.amplitude_to_db(D, ref=np.max)

# メルスペクトログラムを算出
S = librosa.feature.melspectrogram(S=D, sr=sr)
S_dB = librosa.amplitude_to_db(S, ref=np.max)]

# MFCCを算出
mfcc = librosa.feature.mfcc(S=S_dB, n_mfcc=20, dct_type=3)

楽器音のデータ作成

自分の持っている作曲用音源を使って、4つの楽器音の信号を作りました。

4つとも同じ音高で、同じメロディを弾いています*2

使用した音源は以下の通りです。

  • ハープシコード: SONiVOX - Harpsichord
  • ハープ: Etherealwinds Harp II
  • チェロ: Embertone - Blakus Cello
  • ピアノ: NI - BERLIN CONCERT GRAND

MFCCの比較

MFCC-時間表現の比較

f:id:Kurene:20191102192041p:plain
MFCCー時間表現

上の図は、各時間ごとにMFCC(20次元)を算出した結果です。

となっています。

素のMFCCだと、低次元の成分の値の範囲が大きい為、目検ではあまり違いが分かりません。

そこで、各次元ごとに標準化を行ったのが下のプロットです*3

f:id:Kurene:20191102192121p:plain
MFCCー時間表現(標準化)

全く同じ音高・メロディですが、MFCCでは違いがあることが確認できます

時間平均したMFCC係数の比較

f:id:Kurene:20191102220237p:plain
MFCCの時間平均
f:id:Kurene:20191102220045p:plain
標準化したMFCCの時間平均

上の2つの図は、先ほどのプロットを時間方向に平均を取ったものです。

素のMFCCの時間平均は、やはり低次元の値の範囲が大きいため、違いが分かりにくいです。しかし、各次元ごとに標準化することで、音色の違いが分かりやすくなってます。また、ハープシコードとピアノのMFCCのベクトルが似ていることにも気づきます。

まとめ

各楽器のMFCC係数を比較することで、楽器音を識別・分類できる可能性があることを検証しました。

参考文献

en.wikipedia.org

補足(MFCCの闇?)

DCTのTypeについて

MFCC算出の際に使われるDCTには、いくつかのタイプがあります。DCTタイプは2と3が使われるようです。音声認識の開発ツールキットとして有名な HTK が type 3を利用しているらしいので、この記事でもtype 3を利用しました。

github.com

正規化などのデータ整形処理の闇

一般的にMFCCは(加法性)ノイズに弱いといわれています。なので、外れ値の除外と正規化が効いてくるのですが、ここらへんのノウハウは論文にはあまり書かれていない印象です。。

パワー or 振幅 ?

MFCの英語wikiを見ると、パワーで算出してます。が、振幅で算出されている実装もよく見かけます。アプリケーションや処理するデータに合わせてチューニングが必要だと思います。

その他のパラメタ

STFTやメルフィルタバンクの次元数など、中間処理にはいくつかチューニングできるパラメタがあります。

*1:Davis, S. Mermelstein, P. (1980) Comparison of Parametric Representations for Monosyllabic Word Recognition in Continuously Spoken Sentences. In IEEE Trans. ASSP, Vol. 28 No. 4, pp. 357-366

*2:全て単音

*3:各楽器ごとではなく、全データの平均・偏差を利用