web-dev-qa-db-fra.com

Réduisez le bruit de fond et optimisez le discours d'un clip audio à l'aide de ffmpeg

J'extrais des extraits audio d'un fichier vidéo pour la reconnaissance vocale. Ces vidéos proviennent d'appareils mobiles/autres produits faits à la main et contiennent donc beaucoup de bruit. Je souhaite réduire le bruit de fond de l'audio afin que la parole que je relaie vers mon moteur de reconnaissance vocale soit claire. J'utilise ffmpeg pour faire tout cela, mais je suis bloqué pendant 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 est inférieure à 300-3000 hz, je peux filtrer toutes les autres fréquences pour supprimer tout bruit de fond. Qu'est-ce que je rate?

De plus, j'ai lu sur les filtres de weiner qui pourraient être utilisés pour améliorer la parole et j'ai trouvé ceci mais je ne suis pas sûr de savoir comment l'utiliser.

23
Sudh

Si vous souhaitez isoler la parole audible, essayez d’associer un filtre passe-bas et un filtre passe-haut. Pour l’audio utilisable, j’ai remarqué que le filtrage de 200hz et inférieur, puis de 3000hz et plus, permet de conserver un son de voix utilisable.

ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file>

Dans cet exemple, ajoutez d'abord le filtre passe-haut pour couper les basses fréquences, puis utilisez le filtre passe-bas pour couper les fréquences les plus hautes. Si nécessaire, vous pouvez parcourir votre fichier plusieurs fois afin de nettoyer les fréquences de base de données supérieures dans les plages de fréquences de coupure.

28
av8r

ffmpeg ne possède pas de filtres audio appropriés pour la réduction du bruit. Audacity dispose d’un filtre NR assez efficace, mais il est conçu pour être utilisé en mode 2 passes avec un échantillon du bruit, puis de l’entrée.

Les commentaires en haut de https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp expliquent comment travaux. (en gros: supprimer chaque bac FFT situé en dessous du seuil. Ainsi, il ne laisse passer les signaux que lorsqu'ils sont plus forts que le bruit de fond dans cette bande de fréquences. Il peut faire des choses étonnantes sans causer de problèmes. C'est comme un filtre passe-bande qui s'adapte Étant donné que l’énergie du bruit est répartie sur l’ensemble du spectre, il suffit de laisser passer quelques bandes étroites pour réduire l’énergie sonore totale de beaucoup.

Voir aussi Réduction du bruit audio: comment l'audace se compare-t-elle à d'autres options? pour plus de détails sur son fonctionnement et sur le seuillage des bacs FFT d'une manière ou d'une autre constitue également la base des filtres de réduction du bruit commerciaux.

Porter ce filtre sur ffmpeg serait un peu gênant. Peut-être que le mettre en œuvre en tant que filtre avec 2 entrées, au lieu d'un filtre à 2 passes, fonctionnerait mieux. Puisqu'il ne faut que quelques secondes pour obtenir un profil de bruit, ce n'est pas comme s'il devait lire l'intégralité du fichier. Et vous ne devez PAS alimenter le flux audio entier comme un échantillon de bruit, de toute façon. Un échantillon de bruit JUST est nécessaire pour définir les seuils pour chaque groupe FFT.

Donc oui, une deuxième 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 d'un tas de vaudous avec un extrait de flux/fractionnement de flux. Et bien sûr, vous avez besoin d'une intervention manuelle, sauf si vous avez un échantillon de bruit dans un fichier séparé qui conviendra pour plusieurs fichiers d'entrée. (Un échantillon de bruit provenant du même micro/de la même configuration devrait convenir à tous les clips de cette configuration.)

7
Peter Cordes

FFmpeg a maintenant 2 filtres natifs pour traiter le bruit de fond: afftdn et anlmdn. De plus, depuis quelque temps, on peut utiliser les filtres ladspa (chercher le suppresseur de bruit) et/ou lv2 (chercher le réducteur de parole) avec FFmpeg.

3
Paul B. Mahol