web-dev-qa-db-fra.com

Comment détecter le BPM d'une chanson en php

Comment déterminer le tempo/BPM d'un morceau par programme? Quels algorithmes sont couramment utilisés et quelles considérations doivent être prises?

77
haresh

C'est difficile à expliquer dans un seul article StackOverflow. En général, les algorithmes de détection de battements les plus simples fonctionnent en localisant les pics d'énergie sonore, ce qui est facile à détecter. Des méthodes plus sophistiquées utilisent filtres en peigne et d'autres méthodes statistiques/de forme d'onde. Pour une explication détaillée, y compris des exemples de code, consultez cet article GameDev out.

42
John Feminella

Les mots-clés à rechercher sont "Beat Detection", "Beat Tracking" et "Music Information Retrieval". Il y a beaucoup d'informations ici: http://www.music-ir.org/

Il y a (peut-être) un concours annuel appelé MIREX où différents algorithmes sont testés sur leurs performances de détection de battements.

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

Cela devrait vous donner une liste d'algorithmes à tester.

Un algorithme classique est Beatroot (google it), ce qui est agréable et facile à comprendre. Cela fonctionne comme ceci:

  1. FFT de courte durée la musique pour obtenir un sonogramme.
  2. Additionnez les augmentations d'amplitude sur toutes les fréquences pour chaque pas de temps (ignorez les diminutions). Cela vous donne une fonction 1D variant dans le temps appelée "flux spectral".
  3. Trouvez les pics en utilisant n'importe quel ancien algorithme de détection de pics. Ceux-ci sont appelés "onsets" et correspondent au début des sons dans la musique (début des notes, coups de batterie, etc.).
  4. Construire un histogramme d'intervalles inter-débuts (IOI). Cela peut être utilisé pour trouver des tempos probables.
  5. Initialisez un ensemble d '"agents" ou "d'hypothèses" pour le résultat du suivi des temps. Nourrissez ces agents l'un après l'autre dans l'ordre. Chaque agent suit la liste des onsets qui sont également des temps et l'estimation du tempo actuel. Les agents peuvent soit accepter les débuts, s'ils correspondent étroitement à leur dernier rythme et rythme suivis, les ignorer s'ils sont très différents, soit générer un nouvel agent s'ils se trouvent entre les deux. Tous les temps ne nécessitent pas un début - les agents peuvent interpoler.
  6. Chaque agent reçoit un score en fonction de la netteté de son hypothèse - si tous ses débuts de battements sont bruyants, il obtient un score plus élevé. S'ils sont tous réguliers, il obtient un score plus élevé.
  7. L'agent ayant le score le plus élevé est la réponse.

Inconvénients de cet algorithme dans mon expérience:

  • La détection de crête est plutôt ad-hoc et sensible aux paramètres de seuil et ainsi de suite.
  • Certaines musiques n'ont pas de débuts évidents sur les temps. Évidemment, cela ne fonctionnera pas avec ceux-ci.
  • Difficile de savoir comment résoudre le problème 60bpm-vs-120bpm, surtout avec le suivi en direct!
  • Jette un lot d'informations en utilisant uniquement un flux spectral 1D. Je pense que vous pouvez faire beaucoup mieux en ayant quelques flux spectraux à bande limitée (et peut-être un à large bande pour les tambours).

Ici est une démo d'une version live de cet algorithme, montrant le flux spectral (ligne noire en bas) et les débuts (cercles verts). Il convient de considérer le fait que le rythme est extrait des uniquement cercles verts. J'ai joué les onsets juste comme des clics, et pour être honnête, je ne pense pas pouvoir entendre le rythme d'eux, donc à certains égards, cet algorithme est meilleur que les gens à la détection de battements. Je pense que la réduction à un tel signal de faible dimension est cependant son pas faible.

Il y a quelques années, j'ai trouvé un très bon site avec de nombreux algorithmes et du code pour la détection de battements. Je n'ai cependant pas réussi à le retrouver.

Edit: Trouvé!

Voici quelques excellents liens qui devraient vous aider à démarrer:

http://marsyasweb.appspot.com/

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

30
Timmmm

L'extraction de battements implique l'identification de structures métriques cognitives dans la musique. Très souvent, ceux-ci ne correspondent pas à l'énergie sonore physique - par exemple, dans la plupart des musiques, il y a un niveau de syncope, ce qui signifie que le battement "tapant du pied" que nous percevons ne correspond pas à la présence d'un son physique. Cela signifie que c'est un champ assez différent de détection de début, qui est la détection des sons physiques, et qui est effectué d'une manière différente.

Vous pouvez essayer la bibliothèque Aubio , qui est une simple bibliothèque C offrant des outils d'extraction de début et de temps.

Il y a aussi en ligne Echonest API , bien que cela implique de télécharger un MP3 sur un site Web et de récupérer du XML, donc cela pourrait ne pas convenir.

EDIT: Je suis tombé sur cette dernière nuit - une bibliothèque C/C++ très prometteuse, même si je ne l'ai pas utilisée moi-même. Plugins Vamp

22
Rob Watson

Le domaine général de recherche qui vous intéresse est appelé MUSIQUE INFORMATION RETRIEVAL

Il existe de nombreux algorithmes différents qui le font, mais ils sont tous fondamentalement centrés sur la DÉTECTION ONSET.

La détection de début mesure le début d'un événement, l'événement dans ce cas est une note jouée. Vous pouvez rechercher des changements dans la transformée de Fourier pondérée (contenu haute fréquence), vous pouvez rechercher des changements importants dans le contenu spectral. (Différence spectrale). (il y a quelques articles que je vous recommande de regarder plus loin) Une fois que vous appliquez un algorithme de détection de début, vous choisissez où se trouvent les battements via le seuillage.

Il existe différents algorithmes que vous pouvez utiliser une fois que vous avez obtenu cette localisation temporelle du rythme. Vous pouvez le transformer en un train d'impulsions (créer un signal qui est zéro pour toujours et 1 uniquement lorsque votre battement se produit), puis appliquer une FFT à cela et BAM, vous avez maintenant une fréquence d'onsets au plus grand pic.

Voici quelques articles pour vous guider dans la bonne direction:

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

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

Voici une extension de ce que certaines personnes discutent:

Quelqu'un a mentionné qu'il envisageait d'appliquer un algorithme d'apprentissage automatique: collectez essentiellement un ensemble de fonctionnalités des fonctions de détection de début (mentionnées ci-dessus) et combinez-les avec le signal brut dans un réseau neuronal/régression logistique et découvrez ce qui fait un battement un battement.

regardez le Dr Andrew Ng, il a des conférences gratuites d'apprentissage automatique de l'Université de Stanford en ligne (pas les conférences vidéo de longue haleine, il y a en fait un cours à distance en ligne)

9
Adam

Si vous parvenez à vous interfacer avec le code python dans votre projet, API Echo Nest Remix = est une API assez fluide pour python:

Il y a une méthode analysis.tempo qui vous donnera le BPM. Il peut faire bien plus qu'un simple BPM, comme vous pouvez le voir dans les documents de l'API ou this tutoriel

9
Lily

Effectuez une transformée de Fourier , et trouvez des pics dans le spectre de puissance. Vous recherchez des pics inférieurs à la coupure de 20 Hz pour l'audition humaine. Je suppose que généralement dans la gamme 0,1-5ish Hz pour être généreux.

Question SO qui pourrait aider: Bibliothèque de détection audio Bpm

En outre, voici l'une des nombreuses questions de "recherche de crête" sur SO: Détection de crête du signal mesuré


Edit: Pas que je fasse du traitement audio. C'est juste une supposition basée sur le fait que vous recherchez une propriété de domaine de fréquence du fichier ...


une autre modification: Il convient de noter que les formats de compression avec perte comme le mp3 stockent les données du domaine Fourier plutôt que les données du domaine temporel en premier lieu. Avec un peu d'intelligence, vous pouvez vous épargner des calculs lourds ... mais voyez le commentaire réfléchi de cobbal.

7
dmckee

Il existe plusieurs méthodes pour obtenir le BPM, mais celle que je trouve la plus efficace est le "spectre de battement" (décrit ici ). Cet algorithme calcule une matrice de similitude en comparant chaque court échantillon de musique avec les autres. Une fois la matrice de similitude calculée, il est possible d'obtenir une similitude moyenne entre chaque paire d'échantillons {S (T); S (T + 1)} pour chaque intervalle de temps T: il s'agit du spectre de battement. Le premier pic élevé dans le spectre de battement est la plupart du temps la durée du battement. La meilleure partie est que vous pouvez également faire des choses comme la structure musicale ou les analyses de rythme.

2
jeremy-george

D'autres ont déjà décrit certaines méthodes de détection des battements. Je veux ajouter qu'il existe des bibliothèques disponibles qui fournissent des techniques et des algorithmes pour ce genre de tâche.

Aubio est l'un d'entre eux, il a une bonne réputation et il est écrit en C avec un wrapper C++ afin que vous puissiez l'intégrer facilement avec une application cacao (tout le contenu audio dans les frameworks d'Apple est également écrit en C/C++).

2
Rafael Vega

La détection précise du BPM est très difficile. Voir cette question de stackoverflow , et ma réponse.

2
Nick Johnson

Pour republier ma réponse: Le moyen le plus simple est de demander à l'utilisateur d'appuyer sur un bouton en rythme avec le rythme et de compter le nombre de taps divisé par le temps.

2
Lucius Kwok

Voici un programme gratuit analysera et écrira le BPM sur la balise ID3V2. Aucune idée de la qualité

0
Scott Evernden