2019年時点の記事です。音楽(曲)を波形に変換して、それを画像ファイルにします。機械学習の学習データとして使えるようにする想定です。データはこれを使います。
この中にある「genres.tar.gz」です。約1.1GBほどある巨大なファイル群です。
解凍すると、以下のようなフォルダ構成になってます。

この各フォルダの中にAU形式(UNIX等で利用される音声ファイル形式)の曲データがあります。
音楽を波形(スペクトラム)に変換する
曲データを画像データにする前に波形データに変換する必要があります。音声や地震波などの周期性のある信号は、どれだけ複雑な信号であっても、単純な波に分解できるという「フーリエの定理」を使うと、波形(周波数成分と振幅成分を抽出した周波数スペクトラム)に変換できます。
音楽データを機械学習の学習データに使うためには、単純な波形(スペクトラム)にするだけではなく、対数をかけて、さらにフーリエ変換をかけて、ヒトの周波数知覚特性を考慮した重み付けをするなどの加工を施して「メル周波数ケプストラム係数(Mel-Frequency Cepstrum Coefficients)」を求めて、それをグラフで可視化したものを使うことになっています。
この「メル周波数ケプストラム係数」の詳しい説明は、僕にはできません。気になる方は、こちらをご覧ください。
pythonのlibrosa
pythonのlibrosaというモジュールを使うと、この難しい「メル周波数ケプストラム係数」を簡単にサクッと求めることができます。
librosaは
pip install librosa
でインストールします。あと、グラフ化するのに「matplotlib」も必要です。
はいってなければ。
pip install matplotlib
でインストールします。
曲ファイルを読み込んで「メル周波数ケプストラム係数」を求めて、matplotlibでグラフにしたものをPNG画像で保存するソースです。
import librosa
import librosa.display
import matplotlib.pyplot as plt
import os
def save_png(filename, soundpath, savepath):
# オーディオファイル(au)を読み込む
music, fs = librosa.audio.load(soundpath + filename)
# メルスペクトラム(MFCC)変換
mfccs = librosa.feature.mfcc(music, sr=fs)
# グラフに変換する
librosa.display.specshow(mfccs, sr=fs, x_axis='time')
# PNG形式画像で保存する
plt.savefig(savepath + filename + '.png', dpi=200)
soundpath = '.\\in\\au-data\\'
savepath = '.\\out\\au-img\\'
cnt = 0
for filename in os.listdir(soundpath):
cnt += 1
if((cnt % 10) == 0):
print(cnt, '件を処理しました')
save_png(filename, soundpath, savepath)
上記 は「.\in\au-data\」フォルダに、au形式データをおいて、「.\out\au-img\」に生成した画像を置きます。
生成された画像はこんな感じです。


確かに曲によって微妙な違いがあります。これを学習させれば音楽の分類ができる・・と、まあ、そういうことのようです。ちなみに。PNG画像で保存すると、αチャンネルがつき、RGBとあわせて4チャンネルになります。だから、JPEGにするかどうかとか、生成された画像が大きすぎたら後にリサイズをするかどうかとかを考えてやる必要はありそうですけどね。ではでは。
※この記事は機械学習の記事から前処理部分だけを抜粋してリライトしました。