Wizard Notes

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

Pythonで楽曲のリズム・テンポ分析: Novelty Curve (楽曲変化検知曲線)

はじめに

この記事では、Onset 検出局所/大域のテンポ分析などリズム分析においてよく使われる、Novelty Curve についてPythonのコードとともに紹介します。実装と理解の助けになれば幸いです。


Novelty Curve/Function (Onset_envelope)

www.wizard-notes.com

上記記事のBPM算出の際、拍(ビート)・発音タイミングが分かりやすい信号の周期性を分析するのが肝でした。リズム分析において、このような信号は Novelty Curve/Function と呼ばれています。よく使われている2種類の手法*1を紹介します。

  1. Energy based
    • 時間領域で、ある時間区間範囲の振幅/パワー値の総和を算出
    • それぞれ先の時間フレームとの差分を算出
    • 半波整流波形化: 負の値(=エネルギー減衰)は0に置換する
  2. Spectral based
    • 時間周波数領域に変換
    • 周波数ごとに、ある時間区間範囲の振幅/パワー値の総和を算出
    • それぞれ先の時間フレームとの差分を算出
    • 半波整流波形化: 負の値(=エネルギー減衰)は0に置換する
    • 周波数で合算(例:平均)

LibROSAでも採用されている 2. は Spectral Fluxの算出と似ています。(ただし、負の値を0にしており、つまり音の立ち下がりについては無視しています。)周波数ごとに差分をとることで、各楽器の立ち上げりが捉えやすくなるのだと思います。

LibROSAなど、いくつかWeb上の実装を見てみると、

  • エネルギー総和を算出する時間区間の長さ
  • log を取る(=人間の聴感に合わせる)
  • (Spectral based) 周波数重み付け(=人間の聴感に合わせる)

といった工夫がみられます。

実装と適用例

import numpy as np
import librosa
import matplotlib.pyplot as plt

# Load music singal
filepath = librosa.util.example_audio_file()
y, sr = librosa.load(filepath, offset=30)

# Energy based novelty curve
mean_square = librosa.feature.rms(y=y)[0]
energy_novelty = np.log( mean_square[1:]/ (mean_square[:-1] + 1e-9) )
energy_novelty[energy_novelty<0.0] = 0
energy_novelty /= np.max(energy_novelty)

# Spectral based novelty curve
Y = np.log(np.abs(librosa.stft(y))+1e-9)
spectral_novelty = None
n_freq, n_tf = Y.shape
spectral_novelty = np.zeros(n_tf-1)
for f in range(0, n_freq):
    tmp = Y[f,1:] - Y[f,:-1]
    tmp[tmp<0.0] = 0.0
    spectral_novelty += tmp
spectral_novelty /= np.max(spectral_novelty)

plt.subplot(4,1,1)
plt.plot(y)
plt.title("Original music signal")
plt.subplot(4,1,2)
plt.plot(mean_square)
plt.title("RMS")
plt.subplot(4,1,3)
plt.plot(energy_novelty)
plt.title("Energy based novelty function (Onset Envelope)")
plt.subplot(4,1,4)
plt.plot(spectral_novelty)
plt.title("Spectral based novelty function (Onset Envelope)")

plt.tight_layout()
plt.show()

f:id:Kurene:20191015231603p:plain
図1: Novelty Function

Spectral based Novelty function の方が、細かいリズムを捉えやすそうな信号となっていることが分かります。 従って、この信号はBPMの算出ビート/リズム/テンポ分析でよく使われています。

また、Novelty function 算出の前処理として、調波打楽器音分離(HPSS)と呼ばれる処理によってリズムに関係のある成分のみを予め抽出することで、よりリズム的な特徴を捉えやすい Novelty curve を得ることができます。

www.wizard-notes.com

参考文献

https://www.audiolabs-erlangen.de/content/05-fau/professor/00-mueller/02-teaching/2019w_mpa/2019_Mueller_MP-BeatTracking_6.pdfwww.audiolabs-erlangen.de

www.audiolabs-erlangen.de

musicinformationretrieval.com

*1:他にも、Phase based や Complex frequency based と呼ばれる手法もあります。