60 votes

Réduisez le bruit de fond et optimisez la parole d'un extrait audio en utilisant ffmpeg

Je extrait des clips audio d'un fichier vidéo pour la reconnaissance vocale. Ces vidéos proviennent de mobiles/d'autres appareils artisanaux et contiennent donc beaucoup de bruit. Je veux réduire le bruit de fond de l'audio afin que la parole que je transmette à mon moteur de reconnaissance vocale soit claire. J'utilise ffmpeg pour faire tout cela, mais je suis bloqué à la phase de réduction du bruit.

Jusqu'à présent, j'ai essayé les filtres suivants:

ffmpeg-20140324-git-63dbba6-win64-static\bin>ffmpeg -i i nput.wav -filter_complex "highpass=f=400,lowpass=f=1800" out2.wav

ffmpeg -i i nput.wav -af "equalizer=f=1000:width_type=h:width=900:g=-10" output.wav

ffmpeg -i i nput.wav -af "bandreject=f=1200:width_type=h:width=900:g=-10" output.wav

Mais les résultats sont très décevants. Mon raisonnement était que puisque la parole se situe dans la plage de 300 à 3000 Hz, je pourrais filtrer toutes les autres fréquences pour supprimer tout bruit de fond. Qu'est-ce que je rate?

J'ai également lu à propos des filtres de Wiener qui pourraient être utilisés pour l'amélioration de la parole et j'ai trouvé ceci mais je ne sais pas comment l'utiliser.

50voto

Calvin Tanuri Points 38

Si vous cherchez à isoler la parole audible, essayez de combiner un filtre passe-bas avec un filtre passe-haut. Pour l'audio utilisable, j'ai remarqué qu'en filtrant en dessous de 200 Hz, puis en filtrant au-dessus de 3000 Hz, cela permet de conserver un son de voix utilisable.

ffmpeg -i  -af "highpass=f=200, lowpass=f=3000" 

Dans cet exemple, ajoutez d'abord le filtre passe-haut pour couper les fréquences les plus basses, puis utilisez le filtre passe-bas pour couper les fréquences les plus élevées. Si nécessaire, vous pouvez faire passer votre fichier plusieurs fois à travers cela pour nettoyer les fréquences db plus élevées dans les plages de fréquences coupées.

38voto

FFmpeg dispose désormais de 3 filtres natifs pour traiter le bruit de fond :

  • afftdn : Débruite les échantillons audio avec FFT
  • anlmdn : Réduit le bruit large bande dans les échantillons audio en utilisant un algorithme de Moyennes Non Locales
  • arnndn : Réduit le bruit de la parole en utilisant des Réseaux de Neurones Récurents. Des exemples de fichiers de modèle à charger peuvent être trouvés ici.

De plus, depuis un certain temps, il est possible d'utiliser les filtres ladspa (recherchez noise-supressor) et/ou lv2 (recherchez speech denoiser) avec FFmpeg.

19voto

Peter Cordes Points 5022

Mise à jour : récemment, FFmpeg a ajouté afftdn qui utilise la méthode du seuil de bruit par FFT-bin décrite ci-dessous, avec diverses options pour adapter / déterminer des valeurs de seuil appropriées en temps réel.

anlmdn (moyennes non locales) est une technique qui fonctionne bien pour la vidéo; je n'ai pas essayé le filtre audio.

L'un ou l'autre de ceux-ci devrait être beaucoup mieux que le passe-haut / passe-bas, à moins que votre seule source de bruit soit un bourdonnement à 60 Hz ou quelque chose du genre. (La parole humaine peut quand même sonner correctement dans une bande passante assez étroite, mais il y a beaucoup de meilleures façons de nettoyer un bourdonnement de fond à large bande.)


ffmpeg n'a aucun filtre audio décent pour la réduction du bruit intégré. Audacity a un filtre de réduction de bruit assez efficace, mais il est conçu pour être utilisé en opération à 2 passes avec un échantillon juste du bruit, puis l'entrée.

Les commentaires en haut de https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp expliquent comment cela fonctionne. (en gros : supprimer chaque bin FFT qui est en dessous du seuil. Donc il laisse passer les signaux uniquement quand ils sont plus forts que le plancher de bruit dans cette bande de fréquence. Cela peut faire des choses étonnantes sans causer de problèmes. C'est comme un filtre passe-bande qui s'adapte au signal. Comme l'énergie du bruit est répartie sur tout le spectre, ne laisser passer que quelques bandes étroites le réduira énormément l'énergie totale du bruit.

Voir aussi Réduction du bruit audio : comment audacity se compare à d'autres options ? pour plus de détails sur son fonctionnement, et que le seuillage des bins FFT d'une manière ou d'une autre est à la base des filtres de réduction de bruit commerciaux typiques, aussi.

Porter ce filtre à ffmpeg serait un peu maladroit. Peut-être qu'en l'implémentant comme un filtre avec 2 entrées, au lieu d'un filtre à 2 passes, fonctionnerait le mieux. Comme il a juste besoin de quelques secondes pour obtenir un profil de bruit, ce n'est pas comme s'il devait lire tout le fichier. Et vous NE DEVRIEZ PAS lui fournir le flux audio entier comme échantillon de bruit, de toute façon. Il doit voir un échantillon UNIQUEMENT du bruit pour définir les seuils pour chaque bin FFT.

Donc oui, une 2e entrée, plutôt que 2 passes, aurait du sens. Mais cela le rend beaucoup moins facile à utiliser que la plupart des filtres ffmpeg. Vous auriez besoin de beaucoup de magie avec la division de flux / extraction de plage de temps. Et bien sûr, vous avez besoin d'intervention manuelle, à moins d'avoir un échantillon de bruit dans un fichier séparé qui conviendra à plusieurs fichiers d'entrée. (un seul échantillon de bruit du même micro / setup devrait fonctionner pour tous les extraits de ce setup.)

13voto

Matteo M. Points 131

J'avais une vidéo avec un bruit de fond très fort. J'ai réussi à le corriger de cette façon : J'ai fait deux passes avec la commande suivante :

ffmpeg -i input.mp4 -af "afftdn=nf=-25" file1.mp4

ffmpeg -i file1.mp4 -af "afftdn=nf=-25" file2.mp4

Ensuite, j'ai utilisé la commande suivante pour clarifier la parole :

ffmpeg -i file2.mp4 -af "highpass=f=200, lowpass=f=3000" file3.mp4

Enfin, j'ai augmenté le volume avec :

ffmpeg file3.mp4 -af "volume=4" finaloutput.mp4

De cette manière, j'ai réussi à obtenir un audio assez bon. Cependant, le son étant quelque chose de subjectif, ce qui est bon pour moi peut ne pas l'être pour d'autres. J'espère que cela vous aidera. M.M.

2voto

Alex Points 21

La combinaison de filtres passe-bas et passe-haut avec afftdn est assez impressionnante, j'ai réussi à nettoyer d'anciennes vidéos VHS du bruit blanc avec cette configuration :

-af "highpass=200,lowpass=3000,afftdn"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X