この記事では、 音に関するデータ分析や機械学習・深層学習で良く使われている MFCC*1 (メル周波数ケプストラム係数)という特徴量を使って、楽器の音色を分析できるかどうかを検証します。
MFCC とは?
MFCCは音声認識や音楽ジャンル分類などで使われる特徴量であり、人間の聴覚特性を考慮した周波数スペクトルの概形(包絡線)を表しています。MFCCは楽器音に対しては音色に対応しており、音色が異なるとMFCCの形状は異なることが期待されます。
MFCCの算出の流れとしては、
- 時間信号をフーリエ変換して周波数信号を算出
- 周波数信号のパワー or 振幅成分を抽出し、対数をとる
- 人間の音量(音圧)に対する知覚は対数的であるため
- ↑ をメル尺度(メル周波数) に変換し、メル周波数スペクトルを抽出
- 人間の音高(周波数)に対する聴感特性を考慮
- 各メル周波数に対応した三角窓を使って抽出(後述)
- メル周波数スペクトルをケプストラム分析
となっています。
画像の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-時間表現の比較
上の図は、各時間ごとにMFCC(20次元)を算出した結果です。
- 左上:ハープシコード
- 右上:ハープ
- 左下:チェロ
- 右下:ピアノ
となっています。
素のMFCCだと、低次元の成分の値の範囲が大きい為、目検ではあまり違いが分かりません。
そこで、各次元ごとに標準化を行ったのが下のプロットです*3。
全く同じ音高・メロディですが、MFCCでは違いがあることが確認できます。
時間平均したMFCC係数の比較
上の2つの図は、先ほどのプロットを時間方向に平均を取ったものです。
素のMFCCの時間平均は、やはり低次元の値の範囲が大きいため、違いが分かりにくいです。しかし、各次元ごとに標準化することで、音色の違いが分かりやすくなってます。また、ハープシコードとピアノのMFCCのベクトルが似ていることにも気づきます。
まとめ
各楽器のMFCC係数を比較することで、楽器音を識別・分類できる可能性があることを検証しました。
参考文献
補足(MFCCの闇?)
DCTのTypeについて
MFCC算出の際に使われるDCTには、いくつかのタイプがあります。DCTタイプは2と3が使われるようです。音声認識の開発ツールキットとして有名な HTK が type 3を利用しているらしいので、この記事でもtype 3を利用しました。
正規化などのデータ整形処理の闇
一般的にMFCCは(加法性)ノイズに弱いといわれています。なので、外れ値の除外と正規化が効いてくるのですが、ここらへんのノウハウは論文にはあまり書かれていない印象です。。
パワー or 振幅 ?
MFCの英語wikiを見ると、パワーで算出してます。が、振幅で算出されている実装もよく見かけます。アプリケーションや処理するデータに合わせてチューニングが必要だと思います。
その他のパラメタ
STFTやメルフィルタバンクの次元数など、中間処理にはいくつかチューニングできるパラメタがあります。