はじめに
この記事では、Onset 検出や局所/大域のテンポ分析などリズム分析においてよく使われる、Novelty Curve についてPythonのコードとともに紹介します。実装と理解の助けになれば幸いです。
Novelty Curve/Function (Onset_envelope)
上記記事のBPM算出の際、拍(ビート)・発音タイミングが分かりやすい信号の周期性を分析するのが肝でした。リズム分析において、このような信号は Novelty Curve/Function と呼ばれています。よく使われている2種類の手法*1を紹介します。
- Energy based
- 時間領域で、ある時間区間範囲の振幅/パワー値の総和を算出
- それぞれ先の時間フレームとの差分を算出
- 半波整流波形化: 負の値(=エネルギー減衰)は0に置換する
- 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()
Spectral based Novelty function の方が、細かいリズムを捉えやすそうな信号となっていることが分かります。 従って、この信号はBPMの算出やビート/リズム/テンポ分析でよく使われています。
また、Novelty function 算出の前処理として、調波打楽器音分離(HPSS)と呼ばれる処理によってリズムに関係のある成分のみを予め抽出することで、よりリズム的な特徴を捉えやすい Novelty curve を得ることができます。
参考文献
https://www.audiolabs-erlangen.de/content/05-fau/professor/00-mueller/02-teaching/2019w_mpa/2019_Mueller_MP-BeatTracking_6.pdfwww.audiolabs-erlangen.de
*1:他にも、Phase based や Complex frequency based と呼ばれる手法もあります。