So erkennen Sie die BPM eines Songs in PHP [geschlossen]

78

Wie kann das Tempo / BPM eines Songs programmgesteuert bestimmt werden? Welche Algorithmen werden üblicherweise verwendet und welche Überlegungen müssen angestellt werden?

LionC
quelle

Antworten:

42

Dies ist schwierig in einem einzelnen StackOverflow-Beitrag zu erklären. Im Allgemeinen arbeiten die einfachsten Beat-Erkennungsalgorithmen, indem sie Spitzen in der Schallenergie lokalisieren, was leicht zu erkennen ist. Anspruchsvollere Methoden verwenden Kammfilter und andere statistische / Wellenformmethoden. Eine ausführliche Erklärung mit Codebeispielen finden Sie in diesem GameDev-Artikel .

John Feminella
quelle
5 Jahre später ist der GameDev-Artikel nicht 404 ツ (Außerdem können Sie häufig webarchive.org gemäß web.archive.org/web/20120525085210/http://archive.gamedev.net/… verwenden )
earcam
Kannst du mir bitte einen Moment aus dem GameDev-Artikel erklären? Der Autor sagt, 1024 Proben seien ungefähr fünfhundert ( th? ) Sekunden. Und einige später sagt er, dass 44032 Proben ungefähr 1 Sekunde sind. Aber wie haben wir es bekommen, wenn 1024 Abtastungen pro 0,05 Sekunden 20480 Abtastungen pro 1 Sekunde entsprechen? Gibt es unterschiedliche Frequenzen? Dieses Textfragment kann leicht durch erste Eingabe der Nummer 1024 gefunden werden.
Powercoder
30

Die zu suchenden Schlüsselwörter sind "Beat Detection", "Beat Tracking" und "Music Information Retrieval". Hier gibt es viele Informationen: http://www.music-ir.org/

Es gibt einen (vielleicht) jährlichen Wettbewerb namens MIREX, bei dem verschiedene Algorithmen auf ihre Schlagerkennungsleistung getestet werden.

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

Das sollte Ihnen eine Liste der zu testenden Algorithmen geben.

Ein klassischer Algorithmus ist Beatroot (google it), der schön und leicht zu verstehen ist. Es funktioniert so:

  1. Kurzzeit FFT die Musik, um ein Sonogramm zu bekommen.
  2. Summierte die Erhöhungen in der Größe über alle Frequenzen für jeden Zeitschritt (ignoriert die Abnahmen). Dies gibt Ihnen eine zeitvariable 1D-Funktion, die als "Spektralfluss" bezeichnet wird.
  3. Finden Sie die Peaks mit einem alten Peak-Erkennungsalgorithmus. Diese werden als "Onsets" bezeichnet und entsprechen dem Beginn von Sounds in der Musik (Beginn von Noten, Drum-Hits usw.).
  4. Erstellen Sie ein Histogramm der Inter-Onset-Intervalle (IOIs). Dies kann verwendet werden, um wahrscheinliche Tempi zu finden.
  5. Initialisieren Sie eine Reihe von "Agenten" oder "Hypothesen" für das Beat-Tracking-Ergebnis. Füttere diese Agenten nacheinander mit den Einsätzen. Jeder Agent verfolgt die Liste der Onsets, die auch Beats sind, und die aktuelle Temposchätzung. Die Agenten können entweder die Onsets akzeptieren, wenn sie genau zu ihrem zuletzt verfolgten Beat und Tempo passen, sie ignorieren, wenn sie sich stark unterscheiden, oder einen neuen Agenten erzeugen, wenn sie dazwischen liegen. Nicht jeder Schlag erfordert einen Beginn - Agenten können interpolieren.
  6. Jeder Agent erhält eine Punktzahl, die davon abhängt, wie ordentlich seine Hypothese ist. Wenn alle Beat-Onsets laut sind, erhält er eine höhere Punktzahl. Wenn sie alle regelmäßig sind, erhält es eine höhere Punktzahl.
  7. Der Agent mit der höchsten Punktzahl ist die Antwort.

Nachteile dieses Algorithmus meiner Erfahrung nach:

  • Die Peakerkennung ist eher ad-hoc und empfindlich gegenüber Schwellenparametern und so weiter.
  • Manche Musik hat keine offensichtlichen Einsätze bei den Beats. Offensichtlich wird es mit denen nicht funktionieren.
  • Es ist schwierig zu wissen, wie das Problem zwischen 60 und 120 Bpm gelöst werden kann, insbesondere bei Live-Tracking!
  • Wirft viele Informationen weg, indem nur ein 1D-Spektralfluss verwendet wird. Ich denke, Sie können es viel besser machen, wenn Sie ein paar bandbegrenzte Spektralflüsse haben (und vielleicht einen Breitband für Schlagzeug).

Hier ist eine Demo einer Live-Version dieses Algorithmus, die den Spektralfluss (schwarze Linie unten) und den Beginn (grüne Kreise) zeigt. Es ist zu bedenken, dass der Beat nur aus den grünen Kreisen extrahiert wird . Ich habe die Onsets nur als Klicks wiedergegeben, und um ehrlich zu sein, glaube ich nicht, dass ich den Beat von ihnen hören konnte. In mancher Hinsicht ist dieser Algorithmus also besser als Leute bei der Beat-Erkennung. Ich denke, die Reduktion auf ein so niedrigdimensionales Signal ist jedoch sein schwacher Schritt.

Ärgerlicherweise habe ich vor einigen Jahren eine sehr gute Seite mit vielen Algorithmen und Code zur Beat-Erkennung gefunden. Ich habe es jedoch völlig versäumt, es wiederzufinden.

Edit: Gefunden!

Hier sind einige großartige Links, die Ihnen den Einstieg erleichtern sollen:

http://marsyasweb.appspot.com/

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

Timmmm
quelle
Schwer zu erstellendes Vamp Plugin für OSX-Ziel. Kein Problem mit Abhängigkeiten, aber mit den OS-Typedefs für Darwin. Versuchen Sie make -f build / Makefile.osx, nachdem Sie das SDK auf ... / Developer / SDKs / iPhoneOS7.0.sdk umgestellt haben, um zu sehen, was ich meine.
Loretoparisi
22

Die Beat-Extraktion beinhaltet die Identifizierung kognitiver metrischer Strukturen in der Musik. Sehr oft entsprechen diese nicht der physischen Schallenergie - zum Beispiel gibt es in den meisten Musikstücken eine Synkopierungsstufe, was bedeutet, dass der von uns wahrgenommene "Fußklopf" -Beat nicht dem Vorhandensein eines physischen Klangs entspricht. Dies bedeutet, dass dies ein ganz anderes Feld ist als die Onset-Erkennung , dh die Erkennung der physischen Geräusche, und auf eine andere Art und Weise durchgeführt wird.

Sie können die Aubio- Bibliothek ausprobieren , eine einfache C-Bibliothek, die sowohl Tools zum Einsetzen als auch zum Extrahieren von Beats bietet.

Es gibt auch die Online- Echonest-API , obwohl dies das Hochladen einer MP3- Datei auf eine Website und das Abrufen von XML umfasst und daher möglicherweise nicht so geeignet ist.

EDIT: Ich bin letzte Nacht auf eine sehr vielversprechend aussehende C / C ++ - Bibliothek gestoßen, obwohl ich sie selbst nicht benutzt habe. Vamp Plugins

netflux
quelle
9

Das allgemeine Forschungsgebiet, an dem Sie interessiert sind, heißt MUSIC INFORMATION RETRIEVAL

Es gibt viele verschiedene Algorithmen, die dies tun, aber alle konzentrieren sich im Wesentlichen auf ONSET DETECTION.

Die Onset-Erkennung misst den Beginn eines Ereignisses. In diesem Fall handelt es sich bei dem Ereignis um eine gespielte Note. Sie können nach Änderungen in der gewichteten Fourier-Transformation (Hochfrequenzinhalt) suchen. Sie können nach großen Änderungen im spektralen Inhalt suchen. (Spektraldifferenz). (Es gibt ein paar Artikel, die Sie weiter unten untersuchen sollten.) Sobald Sie einen Algorithmus zur Erkennung des Einsetzens angewendet haben, wählen Sie über die Schwellenwerte aus, wo die Beats sind.

Es gibt verschiedene Algorithmen, die Sie verwenden können, sobald Sie diese Zeitlokalisierung des Beats erhalten haben. Sie können daraus eine Impulsfolge machen (erstellen Sie ein Signal, das für alle Zeiten Null und nur dann 1 ist, wenn Ihr Beat auftritt), dann wenden Sie eine FFT darauf an, und BAM hat jetzt eine Häufigkeit von Einsätzen am größten Peak.

Hier sind einige Papiere, die Sie in die richtige Richtung führen sollen:

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

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

Hier ist eine Erweiterung dessen, was einige Leute diskutieren:

Jemand erwähnte die Anwendung eines Algorithmus für maschinelles Lernen: Sammeln Sie im Grunde genommen eine Reihe von Merkmalen aus den Funktionen zur Erkennung des Einsetzens (siehe oben) und kombinieren Sie sie mit dem Rohsignal in einem neuronalen Netzwerk / einer logistischen Regression und lernen Sie, was einen Schlag zu einem Schlag macht.

Schauen Sie sich Dr. Andrew Ng an, er hat kostenlose Online-Vorlesungen über maschinelles Lernen von der Stanford University (nicht die langwierigen Videovorträge, es gibt tatsächlich einen Online-Fernkurs).

Adam
quelle
9

Wenn Sie es schaffen, mit Python-Code in Ihrem Projekt zu kommunizieren , ist die Echo Nest Remix-API eine ziemlich raffinierte API für Python:

Es gibt eine Methode analysis.tempo, mit der Sie den BPM erhalten. Es kann viel mehr als nur einfaches BPM, wie Sie den API-Dokumenten oder diesem Tutorial entnehmen können

mph
quelle
7

Führen Sie eine Fourier-Transformation durch und finden Sie Spitzen im Leistungsspektrum. Sie suchen nach Spitzen unterhalb des 20-Hz-Grenzwerts für das menschliche Gehör. Ich würde normalerweise im Bereich von 0,1 bis 5 Hz als großzügig empfinden.

SO Frage, die helfen könnte: Bpm Audio Detection Library

Hier ist auch eine von mehreren "Peak Finding" -Fragen zu SO: Peak Detection des gemessenen Signals


Bearbeiten: Nicht, dass ich Audioverarbeitung mache. Es ist nur eine Vermutung, die auf der Tatsache basiert, dass Sie nach einer Frequenzdomäneneigenschaft der Datei suchen ...


Eine weitere Änderung: Es ist erwähnenswert, dass verlustbehaftete Komprimierungsformate wie MP3 in erster Linie Fourier-Domänendaten anstelle von Zeitdomänendaten speichern. Mit ein wenig Klugheit können Sie sich einige schwere Berechnungen ersparen ... aber sehen Sie sich den nachdenklichen Kommentar von Cobbal an.

dmckee --- Ex-Moderator Kätzchen
quelle
1
MP3 erreicht jedoch seine Komprimierung, indem die Frequenzen außerhalb des menschlichen Gehörs abgeschnitten werden. Fourier ist hier möglicherweise nicht das richtige Werkzeug.
Cobbal
1
MP3 "schneidet" Frequenzen außerhalb des menschlichen Gehörs nicht ab und führt Kosinustransformationen (bezogen auf Fourier) einzeln in umhüllte Fenster mit einer Breite von jeweils etwa 1 ms durch. Ich würde dmckees ersten Vorschlag an 10 s langen Fenstern versuchen und sehen, was herauskommt.
TrayMan
Dies ist zu einfach, um wirklich gut zu funktionieren.
Timmmm
2

Um meine Antwort erneut zu veröffentlichen: Der einfache Weg, dies zu tun, besteht darin, den Benutzer im Rhythmus des Schlags auf eine Schaltfläche tippen zu lassen und die Anzahl der Taps geteilt durch die Zeit zu zählen.


quelle
2

Andere haben bereits einige Beat-Detection-Methoden beschrieben. Ich möchte hinzufügen, dass einige Bibliotheken verfügbar sind, die Techniken und Algorithmen für diese Art von Aufgabe bereitstellen.

Aubio ist einer von ihnen, hat einen guten Ruf und ist in C mit einem C ++ - Wrapper geschrieben, sodass Sie es problemlos in eine Kakaoanwendung integrieren können (alle Audio-Inhalte in Apples Frameworks sind auch in C / C ++ geschrieben).

Rafael Vega
quelle
2

Es gibt verschiedene Methoden, um die BPM zu erhalten, aber die, die ich am effektivsten finde, ist das "Beat-Spektrum" ( hier beschrieben ). Dieser Algorithmus berechnet eine Ähnlichkeitsmatrix, indem er jedes kurze Musikbeispiel miteinander vergleicht. Sobald die Ähnlichkeitsmatrix berechnet ist, ist es möglich, eine durchschnittliche Ähnlichkeit zwischen jedem Abtastpaar {S (T); S (T + 1)} für jedes Zeitintervall T zu erhalten: Dies ist das Schwebungsspektrum. Der erste hohe Peak im Beat-Spektrum ist meistens die Beat-Dauer. Das Beste daran ist, dass Sie auch Dinge wie Musikstruktur- oder Rhythmusanalysen durchführen können.

Jeremy-George
quelle
0

Hier ist ein kostenloses Programm , das BPM analysiert und in das ID3V2-Tag schreibt. Keine Ahnung wie gut

Scott Evernden
quelle
-2

Ich würde mir vorstellen, dass dies bei 4-4 Tanzmusik am einfachsten ist, da es ungefähr zweimal pro Sekunde einen einzelnen Niederfrequenzschlag geben sollte.

Daniel Earwicker
quelle