Trouver de la musique similaire à l'aide de spectres FFT

16

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?

gfg
la source
1
Si vous essayez de détecter le tempo, vous voudrez peut-être essayer de mettre le signal au carré, puis de prendre une transformée de Fourier. Des fréquences de l'ordre de 1 Hz ne seront pas présentes dans un spectre FFT ordinaire (non carré), car elles sont filtrées. Une idée connexe, utilisée pour la détection de la hauteur, est appelée le «cepstre»; vous pouvez le découvrir en recherchant sur Google. Pour différencier la pop et le jazz du classique, vous pouvez essayer de détecter les sons d'un kit de batterie, qui ne sont pas accordés. Le vibrato doit être détectable par la machine. Il existe des mesures de dissonance qui peuvent être calculées par machine.
1
Vous devriez peut-être demander aux modérateurs de déplacer ceci vers dsp.SE
Dilip Sarwate
J'ai signalé ma question avec la demande de la déplacer vers DSP de SE. Vous voulez dire que je pourrais détecter s'il y a un Drumkit présent ou non pour classer l'entrée? Pouvez-vous expliquer comment le signal carré conduit à Tempo?
3
La musique est enregistrée et maîtrisée de manière à maximiser leur diffusion spectrale, surtout de nos jours. Je ne pense pas que les spectres complets vous donneront un bon critère pour classer la musique.
Phonon
2
Au lieu de spectres, vous devriez regarder des spectrogrammes. Les spectres ne vous montrent que le contenu en fréquence de la chanson entière à la fois. Les spectrogrammes montrent comment le contenu en fréquence change avec le temps.
endolith

Réponses:

17

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!

  • Si vous êtes intéressé par a) les fonctionnalités que vous voudrez peut-être examiner sont les MFCC (Mel Frequency Cepstrum Coefficients), car elles captent en quelque sorte le fonctionnement de l'audition humaine (déformation de fréquence, échelle logarithmique), car elles sont décorrélées (ce qui facilite la modélisation) , et comme ils ont une dimensionnalité plus faible (13 coefficients vs 2048).
  • Si vous êtes intéressé par b), regardez une fonction appelée "Patterns de Fluctuation" (Pampalk, en courte autocorrélation du signal dans la gamme 0,1 .. 10 Hz sur quelques bandes); ou les caractéristiques "Penny" de Whitman (FFT du MFCC le long de l'axe du temps).
  • Si vous êtes intéressé par c), regardez les chromagrammes. Commencez avec le code chromagramme d'Ellis (http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/) puis passez à l'implémentation de Mauch si vous avez besoin de quelque chose de plus robuste (http://isophonics.net/nnls-chroma ).

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.

pichenettes
la source
Merci pour votre réponse détaillée, j'ai déjà entendu parler de MFCC plusieurs fois dans ce contexte et il semble raisonnable de ne pas utiliser les résultats FFT nus. Il semble assez complexe à implémenter avec mon "état des connaissances" et mon environnement de développement actuels (C #, Bass Library's FFT Results) mais je vais essayer.
gfg