[Algorithm] Wie man den BPM eines Songs in PHP erkennt


Answers

Die Suchbegriffe, nach denen gesucht werden soll, sind "Beat Detection", "Beat Tracking" und "Music Information Retrieval". Es gibt viele Informationen hier: http://www.music-ir.org/

Es gibt einen (vielleicht) jährlichen Wettbewerb namens MIREX, bei dem verschiedene Algorithmen auf ihre Beat-Erkennungsleistung 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 erhalten.
  2. Summiere die Erhöhungen der Amplitude über alle Frequenzen für jeden Zeitschritt (ignoriere die Abnahmen). Dies gibt Ihnen eine 1D zeitvariierende Funktion, die als "Spektralfluss" bezeichnet wird.
  3. Suchen Sie die Peaks mit einem beliebigen Algorithmus zur Erkennung alter Peaks. Diese werden "Onsets" genannt und entsprechen dem Beginn von Sounds in der Musik (Starts von Noten, Drum Hits, etc.).
  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 in Reihenfolge. 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 eng mit ihrem letzten getrackten Beat und Tempo zusammenpassen, sie ignorieren, wenn sie sich stark voneinander unterscheiden, oder einen neuen Agenten spawnen, wenn sie dazwischen liegen. Nicht jeder Beat erfordert einen Beginn - Agenten können interpolieren.
  6. Jeder Agent erhält eine Punktzahl, je nachdem, wie ordentlich seine Hypothese ist - wenn alle seine Beat-Onsets laut sind, erhält er eine höhere Punktzahl. Wenn sie alle regelmäßig sind, bekommt sie eine höhere Punktzahl.
  7. Der Agent mit der höchsten Punktzahl ist die Antwort.

Nachteile für diesen Algorithmus in meiner Erfahrung:

  • Die Peak-Erkennung ist eher ad-hoc und empfindlich gegenüber Schwellenparametern und so weiter.
  • Manche Musik hat keine offensichtlichen Anspielungen auf die Beats. Offensichtlich wird es mit diesen nicht funktionieren.
  • Schwierig zu wissen, wie man das 60bpm-vs-120bpm-Problem lösen kann, vor allem mit Live-Tracking!
  • Vertreibt viele Informationen, indem nur ein 1D-Spektralfluss verwendet wird. Ich denke, Sie können viel besser machen, indem Sie ein paar bandbegrenzte Spektralflüsse haben (und vielleicht eine Breitband-Frequenz für Schlagzeug).

Here ist eine Demo einer Live-Version dieses Algorithmus, die den spektralen Fluss (schwarze Linie an der Unterseite) und Onsets (grüne Kreise) zeigt. Man sollte bedenken, dass der Beat nur aus den grünen Kreisen gewonnen wird. Ich habe die Onsets nur als Klicks abgespielt, und um ehrlich zu sein, glaube ich nicht, dass ich den Beat von ihnen hören konnte, also ist dieser Algorithmus in mancher Hinsicht besser als Leute bei der Beat-Erkennung. Ich denke, dass die Reduktion auf solch ein niedrig-dimensionales Signal ein schwacher Schritt ist.

Nervig fand ich vor einigen Jahren eine sehr gute Seite mit vielen Algorithmen und Code zur Beat-Erkennung. Ich habe es aber total versäumt, es wiederzufinden.

Bearbeiten: Gefunden!

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

http://marsyasweb.appspot.com/

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

Question

Wie kann das Tempo / BPM eines Songs programmgesteuert festgelegt werden? Welche Algorithmen werden häufig verwendet und welche Überlegungen müssen gemacht werden?




Führen Sie eine Fourier-Transformation durch und suchen Sie nach Peaks im Leistungsspektrum. Sie suchen nach Peaks unterhalb der 20-Hz-Grenze für das menschliche Gehör. Ich würde normalerweise im Bereich von 0,1 bis 5 Hz schätzen, großzügig zu sein.

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

Auch hier ist eine von mehreren "Peak-Finding" -Fragen zu SO: Peak-Detektion des gemessenen Signals

Edit: Nicht, dass ich Audiobearbeitung mache. Es ist nur eine Vermutung, basierend auf der Tatsache, dass Sie nach einer Frequency Domain-Eigenschaft der Datei suchen ...

ein weiterer Schnitt: Es ist erwähnenswert, dass verlustbehaftete Kompressionsformate wie MP3, Fourier-Domain-Daten statt Zeitbereichsdaten an erster Stelle speichern. Mit ein wenig Cleverness können Sie sich einige schwere Berechnungen ersparen ... aber sehen Sie sich den nachdenklichen Kommentar von Cobbal an.




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

Es gibt viele verschiedene Algorithmen, die dies tun, aber sie alle sind grundlegend auf ONSET DETECTION zentriert.

Die Onset-Erkennung misst den Beginn eines Ereignisses, das Ereignis ist in diesem Fall eine gespielte Note. Sie können nach Änderungen in der gewichteten Fourier-Transformation (High Frequency Content) suchen, nach der Sie große Änderungen im Spektralinhalt suchen können. (Spektraldifferenz) (Es gibt ein paar Artikel, die ich Ihnen empfehlen werde, weiter unten zu sehen.) Sobald Sie einen Onset-Erkennungsalgorithmus anwenden, wählen Sie, wo die Beats über die Schwellenwertbildung sind.

Es gibt verschiedene Algorithmen, die Sie verwenden können, sobald Sie die zeitliche Lokalisierung des Taktes erreicht haben. Sie können es in eine Impulsfolge umwandeln (erzeugen Sie ein Signal, das für immer Null ist und 1 nur wenn Ihr Beat passiert) und wenden Sie dann eine FFT an und BAM haben jetzt eine Häufigkeit von Einsätzen bei der größten Spitze.

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

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 zu dem, was einige Leute diskutieren:

Jemand erwähnte, dass man einen maschinellen Lernalgorithmus anwenden sollte: Im Wesentlichen sammle ich eine Reihe von Funktionen aus den Onset-Erkennungsfunktionen (oben erwähnt) und kombiniere sie mit dem rohen Signal in einer neuronalen Netzwerk / logistischen Regression und lerne, was einen Beat zum Beat macht.

schauen Sie sich Dr. Andrew Ng an, er hat kostenlose Vorlesungen zum maschinellen Lernen von der Stanford University online (nicht die langatmigen Videovorlesungen, es gibt tatsächlich einen Online-Fernkurs)




Es gibt mehrere Methoden, um die BPM zu erhalten, aber die, die ich am effektivsten finde, ist das "Beat-Spektrum" ( here beschrieben). Dieser Algorithmus berechnet eine Ähnlichkeitsmatrix durch Vergleichen jedes kurzen Samples der Musik mit jedem anderen. 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. Der beste Teil ist, dass Sie auch Dinge wie Musikstruktur oder Rhythmusanalysen machen können.




Um meine Antwort zu wiederholen: Der einfachste Weg ist, den Benutzer im Takt mit dem Beat auf einen Button zu tippen und die Anzahl der Taps geteilt durch die Zeit zu zählen.




Ich würde mir vorstellen, dass dies in 4-4 Tanzmusik am einfachsten ist, da es etwa zweimal pro Sekunde einen einzigen niederfrequenten Schlag geben sollte.




Links