2010-07-03 7 views
7

Fondamentalement, j'ai beaucoup de fichiers audio représentant la même chanson. Cependant, certains d'entre eux sont de qualité inférieure à l'original, et certains sont édités à l'endroit où ils ne correspondent plus à la chanson originale. Ce que je voudrais faire, c'est de comparer par programme ces fichiers audio à l'original et voir ceux qui correspondent à cette chanson, quelle que soit la qualité. Une comparaison directe ne fonctionnerait évidemment pas car la qualité des fichiers varie.Comparer deux fichiers audio

Je crois que cela pourrait être fait en analysant la structure des chansons et en les comparant à l'original, mais je ne connais rien à l'ingénierie audio, ce qui ne m'aide pas beaucoup. Toutes les chansons sont du même format (MP3). De plus, j'utilise Python, donc s'il y a des bindings, ce serait fantastique; sinon, quelque chose pour la JVM ou même une bibliothèque native serait bien aussi, tant qu'il fonctionne sur Linux et que je peux comprendre comment l'utiliser.

+1

Regardez comment fonctionne Shazam: http://laplacian.wordpress.com/2009/01/10/how-shazam-works/ –

+0

+1, cool blog – BenG

+0

Hmm, on dirait que ce n'est pas aussi simple que Je pensais que ce serait. –

Répondre

4

Copie à partir that réponse:

La même question que les gens à l'ancien AudioScrobbler et actuellement à MusicBrainz ont travaillé depuis longtemps. Pour le moment, le projet Python qui peut vous aider dans votre quête est Picard, qui va marquer les fichiers audio (pas seulement les fichiers MPEG 1 Layer 3) avec un GUID (en fait, plusieurs d'entre eux), et à partir de là, faire correspondre les Les tags sont assez simples. Si vous préférez le faire comme un projet personnel, libofa peut vous être utile. Le documentation for the Python wrapper peut-être vous aidera le plus.

+0

J'ai fini par utiliser Picard, au moins pour l'instant. Merci. :) –

6

D'abord, vous devrez changer votre domaine de comparaison. Analyser des échantillons bruts à partir des fichiers non compressés ne vous mènera nulle part. Votre mesure de distance sera basée sur une ou plusieurs caractéristiques que vous extrayez des échantillons audio. Wikipedia répertorie les fonctions suivantes couramment utilisées pour Acoustic Fingerprinting:

caractéristiques perceptuelles souvent exploitées par les empreintes digitales audio comprennent le taux de passage à zéro en moyenne, tempo estimée, spectre moyen, la planéité spectrale, les tons de premier plan à travers un ensemble de bandes, et la bande passante.

Je n'ai pas de solutions programmatiques pour vous, mais voici un interesting attempt pour la rétro-ingénierie du système d'identification audio YouTube. Il est utilisé pour la détection de violation de droits d'auteur, un problème similaire.

13

Ce n'est pas une tâche triviale. Je ne pense pas que n'importe quelle bibliothèque disponible dans le commerce puisse le faire. Voici une approche possible:

  1. Décoder le mp3 en PCM.
  2. Assurez-vous que les données PCM ont une fréquence d'échantillonnage spécifique que vous avez choisie au préalable (par exemple, 16 kHz). Vous devrez rééchantillonner des morceaux dont la fréquence d'échantillonnage est différente. Un taux d'échantillonnage élevé n'est pas nécessaire car vous avez besoin d'une comparaison floue de toute façon, mais un taux d'échantillonnage trop faible perdra trop de détails. Normaliser les données PCM (par exemple, trouver la valeur maximale de l'échantillon et redimensionner tous les échantillons pour que l'échantillon ayant la plus grande amplitude utilise toute la plage dynamique du format de données, par exemple si le format d'échantillon est signé 16 bits, ou -32767).
  3. Diviser les données audio en trames d'un nombre fixe d'échantillons (par exemple: 1000 échantillons par image).
  4. Convertissez chaque trame en domaine de spectre (FFT).
  5. Calculer la corrélation entre les séquences d'images représentant deux chansons. Si la correllation est supérieure à un certain seuil, supposons que les chansons sont les mêmes.

bibliothèques Python:

  • PyMedia (pour l'étape 1)
  • NumPy (pour le traitement des données) - voir aussi this article pour quelques informations d'introduction

Une complication supplémentaire. Vos chansons peuvent avoir une longueur de silence différente au début.Donc, pour éviter les faux négatifs, vous pouvez avoir besoin d'une étape supplémentaire:

3.1. Scannez les données PCM depuis le début, jusqu'à ce que l'énergie sonore dépasse le seuil prédéfini. (Par exemple, calculer RMS avec une fenêtre glissante de 10 échantillons et arrêter quand il dépasse 1% de la gamme dynamique). Ensuite, jetez toutes les données jusqu'à ce point.

+0

Les données PCM sont un tableau d'octets à droite? À l'étape 3, tout en normalisant puisque nous avons besoin d'une amplitude allant jusqu'à 32767, je crois que vous le convertiriez en un entier/double tableau. Corrigez-moi si j'ai tort, s'il-vous plait. Aussi, avons-nous besoin de calculer la corrélation à l'étape 6? Ou si nous ne faisons que comparer les valeurs fft et voir si elles tombent dans un seuil? – LINGS

+0

@LINGS (3) suppose que les données PCM de l'étape (1) sont un tableau de type approprié (par exemple int16 ou float32). Mais si le décodeur de choix renvoie des octets bruts alors oui, une étape de conversion est nécessaire. – atzz

+0

@LINGS étape (6): la différence simple ne fonctionnera pas si votre solution doit tolérer le bruit, parce que certains bruits tels que les clics ou les claps provoquent une grande différence dans la FFT. La différence intégrée pourrait fonctionner cependant. Je ne suis pas sûr que la corrélation soit la meilleure méthode de comparaison ici, je n'ai pas fait de recherche comme je l'aurais probablement dû, mais ça a fonctionné correctement quand j'ai implémenté quelque chose de similaire. – atzz

Questions connexes