TensorFlow と高速フーリエ変換で音楽ジャンル分類(基本編)
TensorFlow による音楽ジャンル分類を行なってみました。
題材は定番の GTZAN ジャンル・コレクションです。10 のジャンル(ブルース、クラシック、カントリー、ディスコ、ヒップホップ、ジャズ、メタル、ポップ、レゲエ、ロック)に分けられた wav ファイルを分類します。各ジャンルは約 30 秒間の wav ファイルを 100 個ずつ保持しています。
ジャンル分けに微妙感がありますが、データセットは 2002 年のものなのでそこは目をつぶります。
この問題は必ずしも易しくありませんので、今回は基本編として簡単なアプローチのみを取ります。生データで確認後、FFT(高速フーリエ変換)を利用して PSD(パワースペクトル密度)を計算して特徴ベクトルとします。また精度は Top-N で計測します。
生データでトレーニング
最初に生データ入力でのトレーニングを考えます。
sox(音声処理汎用ツール)で wav ファイルの情報を確認しておきますと、サンプリング周波数 22.05 khz のモノラルです :
Input File : 'blues.00000.wav' Channels : 1 Sample Rate : 22050 Precision : 16-bit Duration : 00:00:30.01 = 661794 samples ~ 2251 CDDA sectors File Size : 1.32M Bit Rate : 353k Sample Encoding: 16-bit Signed Integer PCM
そして生データをそのままプロットして視覚的に確認しておきます。最初にジャズ wav ファイル :
他のジャンルについても確認しておきます :
上図の波形を局所的に観察しても分類が可能か判断がつきにくいので、スペクトログラムを表示してみます。
スペクトログラムは時間・周波数とその強さを示す三次元グラフですが、ここでは色相を利用して二次元で表しています :
少しは判別しやすくなりましたが、判別しやすいジャンルとそうでないジャンルがあることも分かります。メタル音楽が識別しやすい一方で、例えばロック・レゲエ・ブルースやディスコ・ポップの組み合わせなどは識別しにくいことが分かります。(人間の聴覚的にも納得できるでしょう)
よって Top-N で精度を判断することにしますが、本来はよりよい検証尺度を先に考慮するべきかもしれません。少なくともジャンル毎、あるいはジャンル vs another ジャンルごとの精度を出すべきでしょう。
ちなみに生データを入力として単純な MLP で試したところ、結果は Top-1 で約 25 %、Top-3 で約 60 % でした。サイコロを振るよりはだいぶマシですが、改良を考えざるを得ない数字でもあります。
FFT (高速フーリエ変換)を利用したトレーニング
定石としては MFCC(メル周波数ケプストラム係数)を用いますが、今回は分かりやすさを優先して FFT(高速フーリエ変換)で PSD(パワースペクトル密度)を計算してこれを特徴ベクトルとしてトレーニングしてみます。
以下はパワースペクトル密度をジャンルのサンプル wav ファイルを元にプロットしたグラフです。
2種類あるのは PSD 軸の指数を変えて描画しているためです :
![]() | ![]() |
そしてやはり単純な MLP でトレーニングしてみます。下左図は損失でまだトレーニング不足感がありますが、下右図の validation 精度を見ると汎化性能は頭打ちになっています :
![]() | ![]() |
別のテスト用データセットで試した結果は、Top-1 で 38.7 %、Top-3 で 75.7 % でした。
生データに比べれば悪くはない数字ですが、もちろん先端技術による精度には遠く及ばないので改良の余地は多々あります。
これについてはまたいずれ。
以上