LibROSA とは?
「自分の好きな音楽をパソコンで分析したい!」
「音楽データで機械学習・ディープラーニングをやってみたい!」
「でも、音データの信号処理やデータの扱い方がよく分からない…」
と悩んでいるエンジニアの方は結構いらっしゃると思います。
理由としては、音信号専用のアルゴリズムが多いため、技術を理解して実装するには時間がかかってしまうが挙げられると思います。
しかし、この記事で紹介する Pythonの音楽分析用モジュール LibROSAを使えば、
数行~数十行の実装で音楽信号の分析ができるため、
「さくっと音楽信号分析をやってみよう!」
くらいの軽い気持ちで音楽信号分析のプログラムを実装することができます。
また、LibROSA に実装されている短時間フーリエ変換(STFT)やメルフィルタバングのような信号処理は、
音楽以外の音信号処理でも非常によく利用するアルゴリズムであるため、
Pythonでデータ分析・機械学習を行うなら、扱いを覚えておいて損はないライブラリです。
それでは、LibROSAの概要と、実際にどんな音楽分析ができるのかを紹介したいと思います*1。
LibROSAのメリット・デメリット
- メリット
- デメリット
- 高水準の音楽情報処理は多くない
- 例:メロディ抽出、コード進行の解析
- 今後実装されるかも...?
- LibROSAモジュールでのGPGPUの利用は想定されていない
- 大規模な音データを処理するときは時間がかかる
- リアルタイム信号処理向きではない
- 日本語で書かれた解説記事は少ない
- 高水準の音楽情報処理は多くない
長年 LibROSA を使ってきましたが、デファクトスタンダードな信号処理の実装・テストでつまずくことなく、目的の音楽情報処理・信号処理をすぐプロトタイピングできるのは、研究開発において非常にありがたいことです。
それでは、LibROSAを使って具体的にどんなことができるのかを列挙していきます。
音楽信号分析の例
LibROSAで手軽に使える音のサンプルデータ
周波数分析(短時間フーリエ変換)
慣れていないと実装・テストに時間がかかってしまう短時間フーリエ変換(STFT)ですが、
LibROSAでは librosa.stft()
を呼び出せばOKです!
import numpy as np import librosa y, sr = librosa.load("_input.wav", mono=True) # STFT n_fft = 2048 hop_length = 512 spec = librosa.stft(y, n_fft=n_fft, hop_length=hop_length) #短時間フーリエ変換 mag, phase = librosa.magphase(spec) #振幅スペクトログラム、位相スペクトログラムを抽出 phase_rad = np.angle(phase) mag, phase = your_processing(mag, phase) # 時間周波数領域の処理を記述 # Inv. STFT spec_rec = mag * phase #spec_rec = mag * np.exp(1j * phase_rad) y_rec = librosa.istft(spec_rec, hop_length=hop_length) #逆短時間フーリエ変換 # Dump .wav file librosa.output.write_wav("_output.wav", y_rec, sr)
音色の分析
MFCC(メル周波数ケプストラム係数)
音楽ジャンルの分類・クラスタ分析や楽器の音色分析に使われるMFCCですが、
LibROSAでは、MFCC算出すら僅か数行で書くことができます。
import librosa n_mfcc = 20 y, sr = librosa.load("input.wav", mono=True) mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc)
以下の記事では、MFCCを使って楽器の音色を分析しています。
LPC(線形予測分析)
線形予測分析は音声の音素や声色を分析するのによく利用されています。
計算量が少ないこともメリットとして挙げられます。
メロディー・和音の分析
基本周波数(歌声や楽器のピッチ)
LibROSAでは YIN, pYINという基本周波数(声の高さ)を推定するアルゴリズムが実装されています。
音高・クロマ特徴
メロディやコードを分析するための前処理となる、音高や12音階の強さ (クロマ特徴) を簡単に算出することができます。
import librosa y, sr = librosa.load("input.wav", mono=True) # 音高スペクトログラム C = np.abs(librosa.cqt(y, sr=sr, hop_length=hop_length)) # 12音階の強さ (クロマ特徴) chroma_cq = librosa.feature.chroma_cqt(y=y, sr=sr)
以下の記事では、音高・クロマ特徴の算出技術について、もう少し細かくまとめています。
リズムの分析
オンセット(発音タイミング)検出
拍検出やリズム分析の前処理となる、オンセット(発音タイミング)の検出ができるモジュールが実装されています。
import librosa import librosa.display import matplotlib as mpl import matplotlib.pyplot as plt mpl.rcParams['axes.xmargin'] = 0 mpl.rcParams['axes.ymargin'] = 0 y, sr = librosa.load("input.wav", sr=16000, mono=True) o_env = librosa.onset.onset_strength(y, sr=sr)**2 times = librosa.times_like(o_env, sr=sr) onset_frames = librosa.onset.onset_detect(onset_envelope=o_env, sr=sr) plt.figure() plt.subplot(2, 1, 1) librosa.display.waveplot(y, sr=sr, alpha=0.25) plt.title('Sectrogram') plt.subplot(2, 1, 2) plt.plot(times, o_env, label='Onset strength') plt.vlines(times[onset_frames], 0, o_env.max(), color='r', alpha=0.9, linestyle='--', label='Onsets') plt.legend(frameon=True, framealpha=0.75) plt.tight_layout() plt.show()
以下の記事では、上記オンセット検出やリズム分析に使われる、Novelty Function の詳細についてまとめています。
テンポグラム分析
音高の分析と比較するとあまり知られていませんが、 テンポグラムと呼ばれるリズムに関する特徴表現があります。
テンポグラムを使うことで、BPMを算出したり、曲の局所的なテンポを分析したりすることができます。
BPM 算出
LibROSAでは自己相関テンポグラムを使ったBPM算出アルゴリズムが実装されており、数行書くだけでBPMを算出できます。
import librosa y, sr = librosa.load("input.wav", mono=True) onset_env = librosa.onset.onset_strength(y, sr=sr) tempo = librosa.beat.tempo(onset_envelope=onset_env, sr=sr)
楽曲構成・区間の分析
オーディオ編集
時間伸縮・ピッチシフト
楽器音分離
調波打楽器音分離(HPSS)
楽曲には様々な楽器音が含まれています。 そのため、例えば、音高の分析をしたいときには、音高が曖昧な信号(例:打楽器)はノイズとなってしまいます。
つまり、素の楽曲信号は分析のノイズとなる信号も含まれているため、所望の音楽的情報を分析するのがなかなか難しいという状況は多々あります。
そこで、そういった信号を除去する分析の前処理の一つとして、 打楽器の音と非打楽器(調波楽器)の音を分離する調波打楽器音分離 (HPSS: Hermonic/Percussive Source Seperation) をよく使います。
LibROSAには、簡単に調波打楽器音分離ができるモジュール librosa.effects.hpss()
/ librosa.decompose.hpss()
があります。
まとめ
Python ですぐに音楽の分析や機械学習を始めることのできる音楽分析ライブラリ "LibROSA" の紹介をしました。
音楽分析は独自のアルゴリズムやノウハウが多いため、全て実装しよう時間がかかってしまいます。
なので、LibROSA は音楽に関するアプリケーション・実験のための高速プロトタイピングの強力な助けになると思います。
LibROSA によってPythonを使った音楽分析・音楽情報処理・機械学習(深層学習)の開発者が増えると嬉しいです。
https://librosa.github.io/librosa/index.htmllibrosa.github.io
*1:Version 0.9.1 時点