web-dev-qa-db-ja.com

PHPで曲のBPMを検出する方法

曲のテンポ/ BPMをプログラムで決定するにはどうすればよいですか?一般的にどのアルゴリズムが使用され、どのような考慮事項が必要ですか?

77
haresh

これは、単一のStackOverflow投稿で説明するのが困難です。一般的に、最も簡単なビート検出アルゴリズムは、検出しやすい音エネルギーのピークを見つけることにより機能します。より洗練されたメソッドは、comb filtersおよびその他の統計的/波形メソッドを使用します。コードサンプルを含む詳細な説明については、 このGameDevの記事 を確認してください。

42
John Feminella

検索するキーワードは、「Beat Detection」、「Beat Tracking」、および「Music Information Retrieval」です。ここには多くの情報があります: http://www.music-ir.org/

MIREXと呼ばれる(たぶん)年次コンテストがあり、そこではビート検出パフォーマンスでさまざまなアルゴリズムがテストされます。

http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/

これにより、テストするアルゴリズムのリストが表示されます。

古典的なアルゴリズムはBeatroot(google it)で、これはニースで理解しやすいものです。それはこのように動作します:

  1. ソノグラムを取得するために音楽を短時間FFTします。
  2. 各タイムステップのすべての周波数でincreasesの大きさを合計します(減少は無視します)。これにより、「スペクトルフラックス」と呼ばれる1D時変関数が得られます。
  3. 古いピーク検出アルゴリズムを使用してピークを見つけます。これらは「オンセット」と呼ばれ、音楽のサウンドの開始(ノートの開始、ドラムヒットなど)に対応します。
  4. Inter-onset-intervals(IOI)のヒストグラムを作成します。これは、可能性のあるテンポを見つけるために使用できます。
  5. ビート追跡結果のために、「エージェント」または「仮説」のセットを初期化します。これらのエージェントに順番に1つずつ開始します。各エージェントは、ビートであるオンセットのリストと、現在のテンポの推定値を追跡します。エージェントは、最後に追跡されたビートとテンポにぴったり合う場合はオンセットを受け入れるか、大きく異なる場合は無視するか、中間にある場合は新しいエージェントをスポーンできます。すべてのビートが開始を必要とするわけではありません-エージェントは補間できます。
  6. 各エージェントには、その仮説がいかに素晴らしかったかに応じてスコアが与えられます-ビートの開始がすべて大きい場合、より高いスコアを取得します。それらがすべて定期的である場合、より高いスコアを取得します。
  7. 最高のスコアリングエージェントが答えです。

私の経験ではこのアルゴリズムの欠点:

  • ピーク検出は、アドホックであり、しきい値パラメーターなどに敏感です。
  • 一部の音楽では、ビートに明らかな始まりがありません。明らかにそれはそれらでは動作しません。
  • 特にライブトラッキングで、60bpm-vs-120bpmの問題を解決する方法を知るのは困難です!
  • 1Dスペクトルフラックスのみを使用して、lotの情報を破棄します。いくつかの帯域制限されたスペクトルフラックス(およびドラム用のブロードバンドビームを1つ)を使用することで、はるかに良い結果が得られると思います。

ここ は、このアルゴリズムのライブバージョンのデモであり、スペクトルフラックス(下部の黒い線)とオンセット(緑色の円)を示しています。緑色の円からonlyからビートが抽出されるという事実を考慮する価値があります。私はオンセットをクリックするだけで再生しましたが、正直なところ、それらからビートを聞くことができるとは思わないので、いくつかの点でこのアルゴリズムはビート検出の人々よりも優れています。しかし、このような低次元信号への低減は、その弱いステップだと思います。

迷惑なことに、数年前にビート検出用の多くのアルゴリズムとコードを備えた非常に優れたサイトを見つけました。私はそれを完全に見つけることができませんでした。

編集:それを見つけた!

始めるのに役立つすばらしいリンクを次に示します。

http://marsyasweb.appspot.com/

http://www.vamp-plugins.org/download.html

30
Timmmm

ビート抽出には、音楽の認知メトリック構造の識別が含まれます。非常に多くの場合、これらは物理的な音エネルギーに対応しません。たとえば、ほとんどの音楽ではシンコペーションのレベルがあります。これは、これが物理的な音の検出であるonset detectionとは全く異なるフィールドであり、異なる方法で実行されることを意味します。

Aubio ライブラリを試すことができます。これは、開始およびビート抽出ツールの両方を提供する単純なCライブラリです。

オンライン Echonest API もありますが、これにはMP3をWebサイトにアップロードし、XMLを取得する必要があるため、あまり適切ではありません。

EDIT:昨夜私は出会った-非常に有望なC/C++ライブラリであるが、自分では使っていない。 Vampプラグイン

22
Rob Watson

あなたが興味を持っている研究の一般的な領域は、音楽情報検索と呼ばれます

これを行う多くの異なるアルゴリズムがありますが、それらはすべて基本的にONSET DETECTIONに集中しています。

開始検出は、イベントの開始を測定します。この場合のイベントは、再生されているノートです。重み付けされたフーリエ変換(高周波コンテンツ)の変化を調べることができます。スペクトルコンテンツの大きな変化を調べることができます。 (スペクトルの違い)。 (さらに詳しく調べることをお勧めする論文がいくつかあります)発症検出アルゴリズムを適用したら、しきい値処理によってビートがどこにあるかを選びます。

ビートの時間定位を取得したら、使用できるさまざまなアルゴリズムがあります。これをパルス列に変換して(常に0で、ビートが発生したときにのみ1になる信号を作成します)、FFTを適用すると、BAMで最大ピークにオンセットの周波数が得られます。

正しい方向に導くためのいくつかの論文があります:

http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf

http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf

これは、一部の人々が議論しているものの拡張です。

誰かが機械学習アルゴリズムの適用を検討していると述べました:基本的に、オンセット検出関数(上記)から一連の機能を収集し、それらをニューラルネットワーク/ロジスティック回帰で生信号と組み合わせて、ビートをビートにするものを学習します。

andrew Ng博士に目を向けると、彼はスタンフォード大学から無料の機械学習講義をオンラインで受けています(長時間のビデオ講義ではなく、実際にオンラインの遠隔講座があります)

9
Adam

pythonプロジェクト内のコードとのインターフェースを管理できる場合、 Echo Nest Remix API =は、Python用の非常に滑らかなAPIです。

BPMを提供するメソッドanalysis.tempoがあります。 APIドキュメントまたはthisチュートリアルからわかるように、単純なBPMよりもはるかに多くのことができます。

9
Lily

フーリエ変換 を実行し、パワースペクトルのピークを見つけます。人間の聴覚の20 Hzカットオフ以下のピークを探しています。通常、0.1〜5 Hzの範囲で十分だと思います。

役に立つかもしれない質問: Bpmオーディオ検出ライブラリ

また、SOに関するいくつかの「ピーク検出」質問の1つです。 測定信号のピーク検出


編集:私がオーディオ処理をするわけではありません。これは、ファイルの周波数領域プロパティを探しているという事実に基づく単なる推測です...


別の編集:mp3のような非可逆圧縮形式は、そもそも時間領域データではなくフーリエ領域データを保存することに注意する価値があります。少し賢くすれば、重い計算を省くことができます...しかし、cobbalの思慮深いコメントを見てください。

7
dmckee

BPMを取得する方法はいくつかありますが、最も効果的な方法は「ビートスペクトル」です(ここ )。このアルゴリズムは、音楽の各短いサンプルを他のすべてのサンプルと比較することにより、類似度マトリックスを計算します。類似度マトリックスが計算されると、各時間間隔Tのすべてのサンプルペア{S(T); S(T + 1)}間の平均類似度を取得できます。これはビートスペクトルです。ビートスペクトルの最初の高いピークは、ほとんどの場合、ビート持続時間です。最良の部分は、音楽構造やリズム分析などのこともできるということです。

2
jeremy-george

他の人はすでにいくつかのビート検出方法を説明しています。この種のタスクのためのテクニックとアルゴリズムを提供するライブラリがいくつかあります。

Aubio はそのうちの1つで、評判が高く、C++ラッパーを使用してCで記述されているため、ココアアプリケーションと簡単に統合できます(AppleのフレームワークのすべてのオーディオもCで記述されています)/C++)。

2
Rafael Vega

正確なBPM検出は非常に困難です。 このstackoverflowの質問 とそれに対する私の返信を参照してください。

2
Nick Johnson

私の答えを再投稿するには:簡単な方法は、ユーザーにビートに合わせてボタンをタップさせ、タップ数を時間で割って数えることです。

2
Lucius Kwok

無料プログラム は、BPMを分析してID3V2タグに書き込みます。よくわからない

0
Scott Evernden