Frage Wie man den BPM eines Songs in PHP erkennt [geschlossen]


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


76
2018-03-18 05:32


Ursprung


Antworten:


Dies ist in einem einzelnen StackOverflow-Post schwierig zu erklären. Im Allgemeinen arbeiten die einfachsten Beat-Detection-Algorithmen, indem sie Peaks in der Schallenergie finden, die leicht zu erkennen sind. Fortgeschrittenere Methoden verwenden Kammfilter und andere statistische / Wellenform-Methoden. Für eine ausführliche Erklärung einschließlich Codebeispiele, überprüfen dieser GameDev-Artikel aus.


42
2018-03-18 05:38



Die Suchbegriffe, nach denen gesucht werden soll, 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 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 es), das ist schön und leicht zu verstehen. Es funktioniert so:

  1. Kurzzeit FFT die Musik, um ein Sonogramm zu erhalten.
  2. Summe die erhöht sich in der Größenordnung über alle Frequenzen für jeden Zeitschritt (ignorieren Sie 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!
  • Wirf einen weg Menge von 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).

Hier ist eine Demo einer Live-Version dieses Algorithmus, die den spektralen Fluss (schwarze Linie unten) und die Onsets (grüne Kreise) zeigt. Es ist eine Überlegung wert, dass der Beat extrahiert wird nur die grünen Kreise. 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


30
2018-03-27 15:30



Beat-Extraktion beinhaltet die Identifizierung von kognitiven metrischen Strukturen in der Musik. Sehr oft entsprechen diese nicht der physischen Schallenergie - zum Beispiel gibt es in der meisten Musik eine Ebene der Synkopierung, was bedeutet, dass der "Fußklopf" -Schlag, den wir wahrnehmen, nicht dem Vorhandensein eines physischen Klangs entspricht. Dies bedeutet, dass dies ein ganz anderes Feld ist Onset-ErkennungDas ist die Erkennung der physikalischen Geräusche und wird auf andere Weise durchgeführt.

Du könntest das versuchen Aubio Bibliothek, die eine einfache C-Bibliothek ist, die sowohl Werkzeuge für das Einsetzen als auch für das Herausziehen bietet.

Es gibt auch das online Echonest-API, obwohl dies das Hochladen eines MP3s auf eine Website und das Abrufen von XML beinhaltet, ist es vielleicht nicht so geeignet.

BEARBEITEN: Ich habe diese letzte Nacht gesehen - eine sehr vielversprechende C / C ++ Bibliothek, obwohl ich sie selbst nicht benutzt habe. Vamp-Plugins


22
2018-03-18 07:56



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)


9
2018-03-13 20:43



Wenn es Ihnen gelingt, mit Python-Code in Ihrem Projekt zu interagieren, Echo-Nest-Remix-API ist eine ziemlich glatte API für Python:

Es gibt eine Methode analysis.tempo Das wird Ihnen die BPM geben. Es kann viel mehr als einfaches BPM, wie Sie aus den API-Dokumenten oder sehen können Dies Anleitung


9
2018-03-18 06:18



Führen Sie ein Fourier-Transformationund finde Spitzen 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-Erkennungsbibliothek

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


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


ein anderer 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.


7
2018-03-18 05:37



Genaue BPM-Erkennung ist sehr schwierig. Sehen diese Stackoverflow-Frageund meine Antwort darauf.


2
2018-03-18 09:55



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.


2
2018-03-20 21:46



Andere haben bereits einige Methoden zur Erkennung von Schlägen beschrieben. Ich möchte hinzufügen, dass es einige Bibliotheken gibt, die Techniken und Algorithmen für diese Art von Aufgabe bereitstellen.

Aubio ist einer von ihnen, es hat einen guten Ruf und es ist in C geschrieben mit einem C ++ - Wrapper, so dass Sie es leicht in eine Cocoa-Anwendung integrieren können (das gesamte Audio-Zeug in Apples Frameworks ist auch in C / C ++ geschrieben).


2
2018-02-13 12:15



Es gibt mehrere Methoden, um das BPM zu erhalten, aber das, was ich am effektivsten finde, ist das "Beat - Spektrum" (beschrieben) Hier). 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.


2
2018-02-23 23:16



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


0
2018-03-18 05:39