音色
MFCC
MFCCはメル周波数ケプストラム係数の略で、この分野でよく使われる特徴量です。本来は人の声の特徴などに使われているそうですが、楽曲でもうまく加工することで良い特徴になります。数式で説明するのが面倒ですが日本語の文献もたくさんあるので、参考文献などを参考にしてください。
MFCCを抽出する
今回はlibrosaというライブラリを使って抽出します。MFCCの計算はnumpyとか使えばそんな大変でもないので自分で書いてもいいと思います。
pip install librosa
- 少なくともこの作業をやったときはWin10+python3系列だとlibrosaの依存ライブラリであるresampyのビルドがPyPyでのトラブルのため通りませんでした。Linuxの環境でやるかpython2系列を使うのが早いと思います。
でlibrosaをインストールします。librosaのドキュメントはこれで、基本的な操作がすべて一つの関数でできるようになっています。
これを使えばMFCCの抽出は簡単で
import librosa
def extractMFCC(filepath):
y,sr = librosa.load(filepath)
mfcc = librosa.feature.mfcc(y=y,sr=sr)
こんな感じです。デフォルトではmfccは512フレームごとに抽出されるため、120秒の曲なら(20,120*44100//512)のMFCCのベクトルが抽出されます。これでもまだ多いので、時間軸方向のMFCCのメルバンクごとの統計量を取ります。なので、
import librosa
def extractMFCC(filepath,savepath):
y,sr = librosa.load(filepath)
mfcc = librosa.feature.mfcc(y=y,sr=sr)
result = np.zeros((mfcc.shape[0],2))
result[:,0] = np.mean(mfcc,axis=1)
result[:,1] = np.var(mfcc,axis=1)
np.savetxt(savepath,result.flatten(),delimiter=",")
こんな感じにできます。上記は平均値と分散ですが、適当に最小値とか最大値とか足して、(20,[統計量の種類])の行列ができるので、これをflattenして特徴ベクトルとして使います。統計量としては後述のリズムパターンを参考に最小値や最大値、尖度や歪度など片っ端から入れました。
HPSS
librosaではhpssの関数で楽曲の調波打楽器音分離ができます。コード進行の判定など、一部の抽出については打楽器音が分離されていた方が性能が良くなる場合もあるらしいです。
y,sr = librosa.load(filepath)
marmonic_margin = 3.0
percussive_margin = 3.0
h,p = librosa.effects.hpss(y,margin=(harmonic_margin,percussive_margin)
みたいな感じです。注意点は二点で、一点目はおそらくジャンルに依存してmarginを調整しないとあまり良い感じに分離されないという点です。二点目は、長い楽曲を分離するとメモリにy,h,pという3個の波形を置くことになるので、例えば8並列して変換を行うと、24個のwavファイルをメモリ上に置くことになり、場合によってはMemoryErrorを吐いてPythonが死にます。
上記の要因から、wavにデコードしたときに重すぎる楽曲は最初にID振るときにはじいています。