SE_BOKUのITな日常

SE_BOKUが知ってること・勉強したこと・考えたことetc

Python3で音楽(曲)を機械学習データに使える画像データにする/librosa

f:id:arakan_no_boku:20210505173728p:plain

目次

音楽(曲)を機械学習データに使える画像データにする

音楽(曲)を波形に変換して、それを画像ファイルにします。

そうすることで、機械学習の学習データとして使えるようになります。

 

音楽データの入手

音楽データはこれを使います。

github.com 

この中にある「genres.tar.gz」です。

約1.1GBほどある巨大なファイル群です。

解凍すると、以下のようなフォルダ構成になってます。

f:id:arakan_no_boku:20190108010048j:plain

この各フォルダの中にAU形式(UNIX等で利用される音声ファイル形式)の曲データがあります。

f:id:arakan_no_boku:20190108010314j:plain

 

音楽を波形(スペクトラム)に変換する 

曲データを画像データにする前に波形データにしてやる必要があります。

音声や地震波などの周期性のある信号は、どれだけ複雑な信号であっても、単純な波に分解できるという「フーリエの定理」を使うと、波形(周波数成分と振幅成分を抽出した周波数スペクトラム)に変換できます。

実際に、音楽データを機械学習の学習データに使うためには、単純な波形(スペクトラム)にするだけではなく、対数をかけて、さらにフーリエ変換をかけて、ヒトの周波数知覚特性を考慮した重み付けをするなどの加工を施して「メル周波数ケプストラム係数(Mel-Frequency Cepstrum Coefficients)」を求めて、それをグラフで可視化したものを使うことになっています。

この「メル周波数ケプストラム係数」の詳しい説明は、僕にはできません。

気になる方は、こちらをご覧ください。

speechresearch.fiw-web.net 

とりあえず、そういうもんだ・・ですすめます。

 

pythonのlibrosaを使う

有難いことに。

pythonのlibrosaというモジュールを使うと、この難しい「メル周波数ケプストラム係数」を簡単にサクッと求めることができます。

librosa.org

librosaは

pip install librosa

でインストールしておく必要があります。

あと、グラフ化するのに「matplotlib」も必要です。

はいってなければ。

pip install matplotlib

でインストールします。

 

Pythonで音楽データを画像ファイルに保存するソース

曲ファイルを読み込んで「メル周波数ケプストラム係数」を求めて、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\」に生成した画像を置きます。

 

生成された画像サンプル

生成された画像はこんな感じです。

f:id:arakan_no_boku:20210505181533p:plain

f:id:arakan_no_boku:20210505181620p:plain

確かに曲によって微妙な違いがあります。

これを学習させれば音楽の分類ができる・・と、まあ、そういうことのようです。

ちなみに。

PNG画像で保存すると、αチャンネルがつき、RGBとあわせて4チャンネルになります。

だから、JPEGにするかどうかとか、生成された画像が大きすぎたら後にリサイズをするかどうかとかを考えてやる必要はありそうですけどね。

ではでは。

※この記事は機械学習の記事から前処理部分だけを抜粋してリライトしました。