J'extrait des clips audio d'un fichier vidéo pour la reconnaissance vocale. Ces vidéos proviennent d'appareils mobiles / autres 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 transmets à mon moteur de reconnaissance vocale soit claire. J'utilise ffmpeg pour faire tout cela, mais je suis bloqué sur 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 une plage de 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 weiner qui pourraient être utilisés pour des améliorations de la parole et j'ai trouvé cela, mais je ne sais pas comment l'utiliser.
-af "highpass=f=200, lowpass=f=1000"
ffplay <input file> -af lowpass=3000,highpass=200
FFmpeg dispose désormais de 2 filtres natifs pour gérer le bruit de fond:
afftdn
anlmdn
De plus, depuis un certain temps, on peut utiliser
ladspa
(chercher lelv2
suppresseur de bruit) et / ou (chercher le débruiteur de la parole) avec FFmpeg.la source
ffmpeg n'a pas de filtres audio décents pour la réduction du bruit intégrés. Audacity a un filtre NR assez efficace, mais il est conçu pour être utilisé avec un fonctionnement en 2 passes avec un échantillon 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: supprime chaque bac FFT qui est en dessous du seuil. Il ne laisse donc 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 incroyables sans causer de problème. 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, le fait de ne laisser passer que quelques bandes étroites réduira considérablement l'énergie sonore totale.
Voir aussi Réduction du bruit audio: comment l'audace se compare-t-elle aux autres options? pour plus de détails sur son fonctionnement, et que le seuillage des bacs FFT d'une manière ou d'une autre est également la base des filtres de réduction du bruit commerciaux typiques.
Porter ce filtre sur ffmpeg serait un peu gênant. Peut-être que l'implémenter comme un filtre à 2 entrées, au lieu d'un filtre à 2 passes, fonctionnerait mieux. Comme il n'a besoin que de quelques secondes pour obtenir un profil de bruit, ce n'est pas comme s'il devait lire tout le fichier. Et vous NE DEVEZ PAS lui fournir le flux audio entier comme un échantillon de bruit, de toute façon. Il doit voir un échantillon de bruit JUST pour définir des seuils pour chaque bac FFT.
Alors 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 d'un tas de vaudou avec un extrait de répartition / plage de temps. 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 sera approprié pour plusieurs fichiers d'entrée. (un échantillon de bruit provenant du même micro / configuration devrait convenir à tous les clips de cette configuration.)
la source