Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

LibROSA:Pythonで手軽に始める音楽信号・データ分析 [2022年20月更新]

LibROSA とは?

出典:https://librosa.github.io/

「自分の好きな音楽をパソコンで分析したい!」

「音楽データで機械学習ディープラーニングをやってみたい!」

「でも、音データの信号処理やデータの扱い方がよく分からない…

と悩んでいるエンジニアの方は結構いらっしゃると思います。

理由としては、音信号専用のアルゴリズムが多いため、技術を理解して実装するには時間がかかってしまうが挙げられると思います。


しかし、この記事で紹介する Pythonの音楽分析用モジュール LibROSAを使えば、

数行~数十行の実装で音楽信号の分析ができるため、

さくっと音楽信号分析をやってみよう!

くらいの軽い気持ちで音楽信号分析のプログラムを実装することができます。


librosa.github.io

また、LibROSA に実装されている短時間フーリエ変換(STFT)やメルフィルタバングのような信号処理は、

音楽以外の音信号処理でも非常によく利用するアルゴリズムであるため、

Pythonでデータ分析・機械学習を行うなら、扱いを覚えておいて損はないライブラリです。

それでは、LibROSAの概要と、実際にどんな音楽分析ができるのかを紹介したいと思います*1


LibROSAのメリット・デメリット

  • メリット
    • よく使う音楽信号処理が数行で書ける!
      • 短時間フーリエ変換、定Q変換、メルフィルタバンク、テンポグラム、オンセット検出、…
      • 最低限のパラメタチューニングだけすれば大丈夫
    • Numpy配列の扱いに慣れていればすぐ使える
    • 開発やWeb上での議論が活発、Userが多い
      • 安心してモジュールを利用できる
    • Web上に情報が多い
      • 公式ドキュメント が非常に充実
      • ↑ には、各モジュールをすぐ試せるサンプルコードがある
  • デメリット
    • 高水準の音楽情報処理は多くない
      • 例:メロディ抽出、コード進行の解析
      • 今後実装されるかも...?
    • LibROSAモジュールでのGPGPUの利用は想定されていない
      • 大規模な音データを処理するときは時間がかかる
    • リアルタイム信号処理向きではない
    • 日本語で書かれた解説記事は少ない

長年 LibROSA を使ってきましたが、デファクトスタンダードな信号処理の実装・テストでつまずくことなく、目的の音楽情報処理・信号処理をすぐプロトタイピングできるのは、研究開発において非常にありがたいことです。

それでは、LibROSAを使って具体的にどんなことができるのかを列挙していきます。

音楽信号分析の例

LibROSAで手軽に使える音のサンプルデータ

www.wizard-notes.com

周波数分析(短時間フーリエ変換

慣れていないと実装・テストに時間がかかってしまう短時間フーリエ変換(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を使って楽器の音色を分析しています。

www.wizard-notes.com

LPC(線形予測分析)

線形予測分析は音声の音素や声色を分析するのによく利用されています。

計算量が少ないこともメリットとして挙げられます。

www.wizard-notes.com

メロディー・和音の分析

基本周波数(歌声や楽器のピッチ)

LibROSAでは YIN, pYINという基本周波数(声の高さ)を推定するアルゴリズムが実装されています。

www.wizard-notes.com

音高・クロマ特徴

メロディやコードを分析するための前処理となる、音高や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)

以下の記事では、音高・クロマ特徴の算出技術について、もう少し細かくまとめています。

www.wizard-notes.com

www.wizard-notes.com

リズムの分析

オンセット(発音タイミング)検出

拍検出やリズム分析の前処理となる、オンセット(発音タイミング)の検出ができるモジュールが実装されています。

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 の詳細についてまとめています。

www.wizard-notes.com

テンポグラム分析

音高の分析と比較するとあまり知られていませんが、 テンポグラムと呼ばれるリズムに関する特徴表現があります。

テンポグラムを使うことで、BPMを算出したり、曲の局所的なテンポを分析したりすることができます。

www.wizard-notes.com

www.wizard-notes.com

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)

www.wizard-notes.com

楽曲構成・区間の分析

www.wizard-notes.com

オーディオ編集

時間伸縮・ピッチシフト

www.wizard-notes.com

www.wizard-notes.com

www.wizard-notes.com

楽器音分離

調波打楽器音分離(HPSS)

楽曲には様々な楽器音が含まれています。 そのため、例えば、音高の分析をしたいときには、音高が曖昧な信号(例:打楽器)はノイズとなってしまいます。

つまり、素の楽曲信号は分析のノイズとなる信号も含まれているため、所望の音楽的情報を分析するのがなかなか難しいという状況は多々あります。

そこで、そういった信号を除去する分析の前処理の一つとして、 打楽器の音と非打楽器(調波楽器)の音を分離する調波打楽器音分離 (HPSS: Hermonic/Percussive Source Seperation) をよく使います。

LibROSAには、簡単に調波打楽器音分離ができるモジュール librosa.effects.hpss() / librosa.decompose.hpss()があります。

www.wizard-notes.com

まとめ

Python ですぐに音楽の分析や機械学習を始めることのできる音楽分析ライブラリ "LibROSA" の紹介をしました。

音楽分析は独自のアルゴリズムやノウハウが多いため、全て実装しよう時間がかかってしまいます

なので、LibROSA は音楽に関するアプリケーション・実験のための高速プロトタイピングの強力な助けになると思います。

LibROSA によってPythonを使った音楽分析・音楽情報処理・機械学習(深層学習)の開発者が増えると嬉しいです。

https://librosa.github.io/librosa/index.htmllibrosa.github.io

*1:Version 0.9.1 時点