今回はpythonを用いて音楽の拍子の認識を行います。
この技術はBeat Trackingと呼ばれています。
アルゴリズム
音声信号の節である音節はOnset(子音群)とRhyme(母音群)に分かれています。
このOnsetを用いて拍子認識を行います。
具体的には以下の手順の通りです。
- 音の始まりであるOnset部分の強さの時間変化を計算します。
- Onsetの相関関係からテンポを推定します。
- 推定したテンポと一致するOnsetピークを抽出します。
librosaを用いた実装
ライブラリはlibrosaを用います。pipでインストールできます。
librosa.onset.onset_strengthでOnsetの時間変化を計算します。
librosa.beat.beat_trackでテンポを計算し、拍子の検出も行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import librosa import matplotlib.pyplot as plt import numpy as np if __name__ == "__main__": wave, fs = wav_read(path_to_wavefile) hop_length = 512 onset_env = librosa.onset.onset_strength(wave, sr=fs, hop_length=hop_length, aggregate=np.median) times = librosa.times_like(onset_env, sr=fs, hop_length=hop_length) tempo, beats = librosa.beat.beat_track(onset_envelope=onset_env, sr=fs) plt.plot(times, librosa.util.normalize(onset_env), label='Onset strength') plt.vlines(times[beats], 0, 1, alpha=0.5, color='r', linestyle='--', label='Beats') plt.legend() plt.show() plt.close() print(tempo) |
嵐さんの「Love So Sweet」の音源で試してみました。
実行結果は下のグラフの通りです。
規則的に立つOnsetピーク部分で拍子の検出ができています。
推定されたテンポは139.67 BPMで、調べたところこちらも正しそうでした。
コメント