[Algorithm] Wie man die BPM eines Liedes in PHP erkennt


Answers

Die zu suchenden Schlüsselwörter 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 von zu testenden Algorithmen geben.

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

  1. Kurzzeit-FFT die Musik, um ein Sonogramm zu erhalten.
  2. Summieren Sie die Vergrößerungen über alle Frequenzen für jeden Zeitschritt (ignorieren Sie die Abnahmen). Dies gibt Ihnen eine 1D zeitveränderliche Funktion namens "spektraler Fluss".
  3. Finden Sie die Peaks mit Hilfe eines alten Spitzenerkennungsalgorithmus. Diese werden "Onsets" genannt und entsprechen dem Beginn von Tönen in der Musik (Notenbeginn, Schlagzeugtreffer usw.).
  4. Konstruieren Sie ein Histogramm von Inter-Onset-Intervallen (IOIs). Dies kann verwendet werden, um wahrscheinliche Tempi zu finden.
  5. Initialisiere einen Satz von "Agenten" oder "Hypothesen" für das Beat-Tracking-Ergebnis. Weisen Sie diesen Agenten die einzelnen Ones nacheinander zu. Jeder Agent verfolgt die Liste der Onsets, die auch Beats sind, und die aktuelle Tempobeurteilung. Die Agenten können die Einsätze entweder akzeptieren, wenn sie genau zu ihrem letzten verfolgten Takt und Tempo passen, sie ignorieren, wenn sie sich stark unterscheiden, oder einen neuen Agenten hervorbringen, wenn sie sich dazwischen befinden. Nicht jeder Schlag erfordert einen Onset - Agenten können interpolieren.
  6. Jeder Agent erhält eine Punktzahl, je nachdem, wie sauber seine Hypothese ist - wenn alle seine Beat-Onsets laut sind, erhält er eine höhere Punktzahl. Wenn sie alle regelmäßig sind, erhält sie eine höhere Punktzahl.
  7. Der Agent mit der höchsten Punktzahl ist die Antwort.

Nachteile dieses Algorithmus in meiner Erfahrung:

  • Die Peak-Erkennung ist eher ad-hoc und empfindlich gegenüber Schwellenparametern und so weiter.
  • Einige Musik hat keine offensichtlichen Einsätze an den Beats. Offensichtlich wird es nicht mit denen arbeiten.
  • Es ist schwierig zu wissen, wie man das 60bpm-vs-120bpm-Problem lösen kann, besonders beim Live-Tracking!
  • Wirft viele Informationen weg, indem nur ein 1D-Spektralfluss verwendet wird. Ich denke, Sie können viel besser mit ein paar Band-limitierten spektralen Flüssen (und vielleicht einem Breitband für Drums).

Hier ist eine Demo einer Live-Version dieses Algorithmus, die den spektralen Fluss (schwarze Linie unten) und Onsets (grüne Kreise) zeigt. Es lohnt sich, die Tatsache zu berücksichtigen, dass der Beat nur aus den grünen Kreisen extrahiert wird. Ich habe die Onsets genauso wie Klicks abgespielt, und um ehrlich zu sein, glaube ich nicht, dass ich den Beat von ihnen hören könnte, also ist dieser Algorithmus in gewisser Hinsicht besser als die Leute bei der Beat-Erkennung. Ich denke, dass die Reduzierung auf ein so schwachdimensionales Signal der schwache Schritt ist.

Ärgerlicherweise habe ich vor ein paar Jahren eine sehr gute Seite mit vielen Algorithmen und Code für die Beat-Erkennung gefunden. Ich habe es jedoch total versäumt, es wieder zu finden.

Bearbeiten: Fand es!

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 programmatisch festgelegt werden? Welche Algorithmen werden üblicherweise verwendet und welche Überlegungen müssen angestellt werden?




Führe eine Fourier-Transformation durch und finde Spitzen im Leistungsspektrum. Sie suchen nach Spitzen unterhalb der 20-Hz-Grenze für das menschliche Gehör. Ich würde in der Regel 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 Find" -Fragen zu SO: Peak-Erkennung des Messsignals

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

Ein weiterer Schnitt: Es ist erwähnenswert, dass verlustreiche Komprimierung Formate wie MP3, speichern Fourier-Domain-Daten, anstatt Zeit-Domain-Daten an erster Stelle. Mit ein wenig Cleverness können Sie sich einige schwere Berechnungen sparen ... aber sehen Sie den durchdachten Kommentar von Cobbal.




Es gibt mehrere Methoden, um die BPM zu erhalten, aber die, die ich am effektivsten finde, ist das "Beat-Spektrum" ( hier beschrieben). Dieser Algorithmus berechnet eine Ähnlichkeitsmatrix durch Vergleichen jeder kurzen Probe der Musik mit jedem anderen. Sobald die Ähnlichkeitsmatrix berechnet ist, ist es möglich, eine durchschnittliche Ähnlichkeit zwischen jedem Abtastwertpaar {S (T); S (T + 1)} für jedes Zeitintervall T zu erhalten: dies ist das Schwebungsspektrum. Die erste hohe Spitze im Schwebungsspektrum ist meistens die Schwebungsdauer. Das Beste daran ist, dass man auch Musikstrukturen oder Rhythmusanalysen machen kann.




Um meine Antwort zu wiederholen: Der einfache Weg, dies zu tun, besteht darin, dass der Benutzer eine Taste im Rhythmus des Taktes antippt und die Anzahl der Taps dividiert durch die Zeit zählt.




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 grundsätzlich um ONSET DETECTION zentriert.

Onset Detection misst den Beginn eines Events, das Event ist in diesem Fall eine gespielte Note. Sie können nach Änderungen in der gewichteten Fouriertransformation (Hochfrequenzinhalt) suchen, die Sie nach großen Änderungen im Spektralgehalt suchen können. (Spektrale Differenz). (Es gibt ein paar Papiere, die ich dir weiter unten empfehlen soll) Wenn du einen Onset Detection Algorithmus anwendest, wählst du aus, wo die Beats per Threshold liegen.

Es gibt verschiedene Algorithmen, die Sie verwenden können, sobald Sie die Lokalisierung des Taktes zu diesem Zeitpunkt erhalten haben. Sie können es in eine Impulsfolge umwandeln (erzeugen Sie ein Signal, das für alle Zeit Null ist und 1 nur, wenn Ihr Schlag geschieht), dann wenden Sie eine FFT an und BAM jetzt haben Sie eine Häufigkeit von Onsets bei der größten Spitze.

Hier 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, wie man einen maschinellen Lernalgorithmus anwendet: Man sammele grundsätzlich eine Reihe von Features aus den Onset-Erkennungsfunktionen (siehe oben) und kombiniere sie mit dem Rohsignal in einer neuronalen Netzwerk- / logistischen Regression und lerne, was einen Beat zum Beat macht.

Schauen Sie in Dr. Andrew Ng, er hat kostenlose Vorlesungen über maschinelles Lernen von der Stanford Universität online (nicht die langatmigen Videovorträge, es gibt tatsächlich einen Online-Fernkurs)




Ich würde mir vorstellen, dass dies bei 4-4-Dance-Musik am einfachsten sein wird, da es ungefähr zweimal pro Sekunde einen einzigen niederfrequenten Schlag geben sollte.