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

30

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.

Sudh
la source

Réponses:

36

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é que le filtrage à 200 Hz et au-dessous, puis à 3000 Hz et au-dessus fait un très bon travail pour conserver l'audio vocal 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 fréquences inférieures, puis utilisez le filtre passe-bas pour couper les fréquences supérieures. Si nécessaire, vous pouvez exécuter votre fichier plusieurs fois pour nettoyer les fréquences db supérieures dans les plages de fréquences coupées.

av8r
la source
Désolé, mais cela ne semble pas faire de réduction de bruit notable pour moi.
Angad
Cela fonctionne très bien pour réduire le faible niveau de bruit de fond (ventilateurs, bourdonnement, etc.) mais peut compromettre légèrement la qualité audio, bien que cela puisse être quelque peu atténué en appliquant d'autres filtres par la suite.
Iain Collins
3
Dans mon cas, l'audio d'origine était si mauvais qu'il était presque impossible d'entendre la voix à cause de quelques bruits de chute d'eau en arrière-plan. J'ai utilisé ce qui suit. Ce n'est pas une grande qualité, mais 1000 fois mieux que l'original. -af "highpass=f=200, lowpass=f=1000"
Eric
Je reçois une erreur avec ce qui précède ou plutôt, un avertissement de ffmpeg: [Parsed_highpass_0 @ 0x1524780] écrêtage 52 fois. Veuillez réduire le gain.
shevy
6
Vous pouvez prévisualiser votre filtre avecffplay <input file> -af lowpass=3000,highpass=200
Björn
11

FFmpeg dispose désormais de 2 filtres natifs pour gérer le bruit de fond:

De plus, depuis un certain temps, on peut utiliser ladspa(chercher le lv2suppresseur de bruit) et / ou (chercher le débruiteur de la parole) avec FFmpeg.

Paul B. Mahol
la source
9

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.)

Peter Cordes
la source