"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

Python3で音楽データ(au)の特徴量をグラフ化して画像ファイルに保存する/librosa

f:id:arakan_no_boku:20210505173728p:plain

目次

元になる音楽データはAU形式 

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

www.marsyas.info

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

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

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

f:id:arakan_no_boku:20190108010048j:plain

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

f:id:arakan_no_boku:20190108010314j:plain

これらの音源に収められた曲を学習させて、曲を上記の10ジャンルに分類する機械学習の練習用データになっているわけです。

でも、AU形式の音声ファイルをそのまま学習・評価用データにはできないので、なんらかの使える形に変換してやる必要があります。

今回は、それを画像データにしてやろう・・ということです。  

前処理:音楽データを画像データに変換する 

曲データを画像データにする方法は、曲の音声特性を特徴量としてとらえる「メル周波数ケプストラム係数(Mel-Frequency Cepstrum Coefficients)」を求めて、それをグラフで可視化したものを画像ファイルとして保存して学習・評価に利用できるデータにしてやるというのが、定番っぽいのでそれをやってみます。

とはいえ。

メル周波数ケプストラム係数について、ちゃんと理解しようとすると相当難しいです。

なので、解説はしません(できません・・笑)。

詳しく知りたい場合は「メル周波数ケプストラム係数」で調べてください。

こちらでも説明されてます。

speechresearch.fiw-web.net 

pythonのlibrosaを使ってメル周波数ケプトストラムを計算

有難いことに。

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

librosa.org

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\」に生成した画像を置きます。

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

f:id:arakan_no_boku:20210505181533p:plain

f:id:arakan_no_boku:20210505181620p:plain

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

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

ちなみに。

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

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

ではでは。

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