J'expérimente depuis quelques semaines pour trouver un moyen de faire correspondre / trouver des chansons similaires dans une bibliothèque contenant différents genres de musique.
Mon premier essai a été de détecter des fonctionnalités telles que le tempo ou la quantité de basses dans les morceaux pour former des groupes, mais je n'ai pas été loin avec cette approche (détection des battements basés sur les changements de volume) car environ 20% des morceaux n'ont pas à être comptés toujours, parfois 1/2 ou 1/3 d'entre eux et je ne pouvais pas implémenter cela.
Après quelques semaines d'essais infructueux, j'ai eu une nouvelle idée qui est décrite plus loin dans cet article. Autrement dit, cela fonctionne en prenant des échantillons de fichiers de spectre, créant quelque chose comme un "spectre moyen" de fichiers pour les comparer. L'idée derrière était que, par exemple, Hardstyle a beaucoup plus de basses que la musique rock moyenne, j'ai également vérifié cela en regardant certains spectres dans Audacity.
- Fichier 1: Prenez des spectres FFT de fichier complets (taille de l'échantillon 2048 atm, échelle des amplitudes)
- Additionnez tous les tableaux de spectre, prenez les moyennes de chaque bac
- Faites de même avec d'autres fichiers, stockez tous les résultats
- Faire la liste des différences de valeurs FFT entre le fichier 1 et d'autres fichiers
- Faire la moyenne des différences entre le fichier 1 et le fichier X
- Tri croissant par ces moyennes
- Les chansons avec la «valeur de différence» la plus basse sont considérées comme similaires.
Certains d'entre vous qui ont de bonnes connaissances peuvent-ils me dire si ce serait la bonne / bonne façon de mettre en œuvre mon idée?
Réponses:
Ce que vous essayez de faire a été essayé à maintes reprises par des centaines de chercheurs et il existe un corpus assez important à ce sujet. Consultez les actes de la conférence ISMIR. Même si elle n'est pas à jour, lisez la thèse d'Elias Pampalk: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf
Pour vous orienter rapidement sur la bonne voie:
La musique peut être similaire selon plusieurs dimensions: a) timbre / texture / genre; b) motif rythmique; c) progression mélodie / accord ... et plus encore! D'après votre message, ce que vous voulez mesurer n'est pas clair!
C'est pour les fonctionnalités. Maintenant, vous devrez penser à une meilleure façon de comparer vos chansons une fois qu'elles ont été représentées comme une séquence de ces fonctionnalités. Le calcul des différences par paires entre les séquences n'est pas très intelligent - par exemple: comparer un morceau et le même morceau compensé par un certain silence produira une différence alors qu'il est exactement le même! Vous préférez comparer la distribution de ces fonctionnalités; par exemple, calculer l'écart moyen / standard des caractéristiques sur le morceau A et l'écart moyen / standard des caractéristiques sur le morceau B, puis prendre une distance probabiliste (KL, Bhattacharyya sur celles-ci).
Dernier point, mais qui importera plus tard: calculer la distance entre une chanson et le reste du corpus pour trouver les correspondances les plus proches est assez inefficace. Lorsqu'elles traitent de grandes collections, des techniques telles que LSH ou Ball arbres permettent d'effectuer ces requêtes de voisins les plus proches sans comparaison explicite avec l'ensemble du corpus.
Soit dit en passant, la détection du tempo est une tout autre affaire. Si vous souhaitez vous y intéresser, le meilleur article sur les performances / l'accessibilité sur le sujet est le Beat Tracking d'Ellis par programmation dynamique. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . C'est incroyablement simple mais proche des algorithmes de pointe.
la source