目的
これまでにonset envelopeを求め.音の開始点であるonsetを検出する方法を学んだ.ここでは,onset envelopeからテンポを推定し,推定したテンポからビートを検出する方法を学ぶ.
説明
テンポの推定
楽曲にはテンポがあり,一定のテンポにしたがって様々な楽器が演奏される.そのため一定の周期で様々な楽器音が鳴り始める.音の開始点を表すonset envelopeにおける周期を求めることでテンポを推定することができる.テンポを表す量としてよく使用されるのがBPM(Beats Per Minute)であり,1分間に何拍打たれるかを表す量である.
自己相関関数
信号の周期を求める方法に自己相関関数を使用した方法がある.ここでは自己相関関数によりonset envelopeの周期を求め,楽曲のテンポを推定してみよう.
10,11行目でフレーム周期を指定してonset envelopeを求め,13,14行目でフレーム長を指定してonset envelopeの自己相関関数を求め,15行目で自己相関関数の値が0から1の間となるように正規化している.17行目で求められるBPMの値からなる配列を求めている.18行目から21行目で推定するテンポの範囲を70BPMから180BPMとし,その範囲内で自己相関関数が最大となるインデックス番号を求めている.22行目でそのインデックス番号に対応するテンポを求めている.31行目から40行目で横軸をラグ[s]として自己相関関数を描画し,42行目から50行目で横軸をBPMとして自己相関関数を描画している.また,それぞれのグラフ中にテンポの範囲と推定されたテンポ(またはそれらに対応するラグ)を表示している.実行すると以下のように表示され,テンポが103.36BPMと推定されていることがわかる.
局所自己相関テンポグラム
以上の方法では,全ての時間を用いて自己相関関数を求め,テンポを推定した.librosaモジュールを用いると,フレーム処理を行いフレーム毎に局所自己相関関数を求めることができる.これを局所自己相関テンポグラムと呼び,局所自己相関テンポグラムの時間平均からテンポを推定することができる.
10,11行目でonset envelopeを求め,13,14行目で局所自己相関テンポグラムを求め,31行目から37行目で局所自己相関テンポグラムを描画している.15行目でその時間平均を求め,17行目から22行目でテンポを推定している.実行すると以下のように表示され,局所自己相関テンポグラムからテンポが129.20BPMと推定されていることがわかる.
フーリエテンポグラム
librosaモジュールを使用すると,onset envelopeに短時間離散フーリエ変換をかけ,フーリエテンポグラムを求めることができる.フーリエテンポグラムからテンポを推定するには,以下のように記述すればよい.
13行目から15行目でonset envelopeからフーリエテンポグラムの振幅を求め,34行目から39行目でフーリエテンポグラムを描画している.16行目でその時間平均を求め,18行目から23行目でテンポを推定している.実行すると以下のように表示され,フーリエテンポグラムからテンポが89.10BPMと推定されていることがわかる.
librosaモジュールによるテンポの推定
以上では,onset envelopeから自己相関関数・局所自己相関テンポグラム・フーリエテンポグラムを求め,テンポを推定した.テンポを推定するだけなら,librosaモジュールを用いて以下のように記述すればよい.
8,9行目でonset envelopeを求め,11行目でonset envelopeからテンポを推定し,12行目で推定したテンポを表示している.実行すると以下のように表示され,テンポが129.20BPMと推定されていることがわかる.これは以上の局所自己相関テンポグラムから推定したテンポと一致していることから,局所自己相関テンポグラムによりテンポを推定していることがわかる.
テンポの動的推定
楽曲によっては一定のテンポで拍が進むのではなく,曲の途中でテンポが変化することがある.librosaモジュールを使用すれば動的にテンポを推定することができる.
12行目のように,キーワード引数aggregateにNoneを指定すると,各フレームに対してテンポを推定することができる.24行目から28行目でフレーム毎に推定したテンポを表示している.実行すると以下のように表示され,動的にテンポが推定されていることが確認できる.
librosaモジュールによるビート位置の検出
楽曲のテンポを求めることができれば,テンポに相当する間隔でonset envelopeのピークを推定することによりビートの位置を検出することができる.librosaモジュールを使用すれば,テンポとビート位置を同時に検出できる.
9,10行目でonset envelopeを求め,12行目でonset envelopeからテンポを推定し,ビートの位置を検出している.18行目で検出したビート位置の一部を描画している.実行すると以下のように表示され,ビートが検出されていることがわかる.
Predominant Local Pulse(PLP)によるビート位置の検出
librosaモジュールには,以上のようにonset envelopeの局所自己相関テンポグラムからテンポとビート位置を検出する方法の他に,Predominant Local Pulseと呼ばれる方法でonset envelopeからビート位置を検出する方法がある.
13,14行目でPLPを求め,24行目から28行目でPLPを描画している.実行すると以下のように表示され,onset envelopeからPLPと呼ばれる波形が推定されていることがわかる.
PLPからビート位置を検出するには以下のようにすればよい.
16行目でPLPのローカルマックスの位置を求めることでビート位置を検出し,30行目で検出したビート位置を描画している.実行すると以下のように表示され,PLPからビート位置が検出されていることがわかる.
課題
課題0
librosaのサンプルオーディオデータからlibrosaモジュールによりテンポを推定せよ.
課題1
自分で用意した音楽データからlibrosaモジュールによりテンポを推定せよ.
課題2
librosaのサンプルオーディオデータからlibrosaモジュールによりテンポ推定し,ビート位置を検出せよ.
課題3
自分で用意した音楽データからlibrosaモジュールによりテンポを推定し,ビート位置を検出せよ.
課題4
librosaのサンプルオーディオデータからlibrosaモジュールによりテンポを動的に推定せよ.
課題5
自分で用意した音楽データからlibrosaモジュールによりテンポを動的に推定せよ.
課題6
librosaのサンプルオーディオデータからlibrosaモジュールによりPLPを求め,PLPからビート位置を検出せよ.
課題7
自分で用意した音楽データからlibrosaモジュールによりPLPを求め,PLPからビート位置を検出せよ.
課題8
librosaのサンプルオーディオデータからonset envelopeを求め,onset envelopeの自己相関関数からテンポを推定せよ.
課題9
librosaのサンプルオーディオデータからonset envelopeを求め,onset envelopeのフーリエテンポグラムからテンポを推定せよ.