J'essaie d'écrire un algorithme qui segmenterait automatiquement un morceau audio avec des enregistrements d'appels d'oiseaux. Mes données d'entrée sont des fichiers d'onde d'une minute et sur la sortie, j'aimerais recevoir des appels séparés pour une analyse plus approfondie. Le problème est que le rapport signal / bruit est assez terrible en raison des conditions environnementales et de la mauvaise qualité d'un microphone (mono, échantillonnage 8 kHz).
Je serais très reconnaissant de tout conseil sur la façon de poursuivre la réduction du bruit.
Voici un exemple de mon entrée, un enregistrement audio d'une minute au format wave: http://goo.gl/16fG8P
Voici à quoi ressemble le signal:
Le filtrage passe-bande, dans lequel je ne garde rien entre 1500 et 2500 Hz, améliore la situation, mais il est encore loin des attentes. Dans ce spectre, il y a encore beaucoup de bruit.
J'ai également tracé l'énergie moyenne à long terme (sur des intervalles de 32 échantillons) et supprimé certains clics. Voici le résultat:
Avec tout le bruit restant, je dois définir un seuil très bas pour l'algorithme de détection de début afin de sélectionner les 10 dernières secondes d'appels d'oiseaux. Le problème est que si je le modifie de cette manière, lors de l'enregistrement suivant, je peux obtenir une charge de faux positifs.
Le filtre moyen mobile aide un peu avec le bruit du vent. D'autres idées? Je pensais à "Soustraction spectrale", mais ici, il me semble que j'ai un problème de poule et d'oeuf - pour trouver une zone de bruit uniquement, je dois segmenter l'audio et segmenter l'audio dont j'ai besoin pour supprimer le bruit. Connaissez-vous des bibliothèques qui ont cet algorithme ou certaines implémentations en pseudo-code? Methinks Audacity utilise une telle méthode pour éliminer le bruit. Il est très efficace, mais il appartient à l'utilisateur de marquer la zone de bruit uniquement.
J'écris en Python et c'est un projet gratuit et open-source.
Merci d'avoir lu!
la source
Réponses:
À la fin, ce qui s'est avéré être la meilleure solution était la détection de début basée sur la haute fréquence ou le contenu énergétique. Avant de pouvoir fonctionner, j'ai dû utiliser un filtre passe-haut pour couper le premier 1 kHz, car il contenait trop de bruit.
Une fois que j'avais une zone de bruit seulement, je pouvais utiliser son profil pour réduire le bruit du reste de l'échantillon.
Aubio était une bibliothèque que j'ai trouvée particulièrement utile . Il a un bon ensemble d'exemples et fournit un grand nombre d'algorithmes à choisir pour la détection de début.
la source
Je ne connais pas beaucoup la réduction du bruit audio mais après une soustraction rapide et sale du bruit de la bande passante filtrée (environ 1500-3000 hz), j'obtiens ceci:
https://dl.dropboxusercontent.com/u/98395391/signal_denoised.wav
Je pense que ça sonne un peu mieux que les signaux filtrés et originaux.
Avec un simple filtre de Wiener, j'obtiens des résultats très similaires.
la source