Extraigo clips de audio de un archivo de video para el reconocimiento de voz. Estos videos provienen de dispositivos móviles / otros dispositivos hechos a mano y por lo tanto contienen mucho ruido. Quiero reducir el ruido de fondo del audio para que la voz que transmita a mi motor de reconocimiento de voz sea clara. Estoy usando ffmpeg para hacer todo esto, pero estoy atascado en la fase de reducción de ruido.
Hasta ahora he intentado los siguientes filtros:
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
Pero los resultados son muy decepcionantes. Mi razonamiento fue que, dado que el habla está por debajo del rango de 300-3000 hz, puedo filtrar todas las demás frecuencias para suprimir cualquier ruido de fondo. ¿Qué me estoy perdiendo?
Además, leí acerca de los filtros weiner que podrían usarse para mejorar el habla y descubrí esto, pero no estoy seguro de cómo usarlo.
-af "highpass=f=200, lowpass=f=1000"
ffplay <input file> -af lowpass=3000,highpass=200
FFmpeg ahora tiene 2 filtros nativos para lidiar con el ruido de fondo:
afftdn
anlmdn
Además, desde hace algún tiempo, uno puede usar
ladspa
(buscar un supresor de ruido) y / olv2
(buscar un disipador de voz) filtros con FFmpeg.fuente
ffmpeg no tiene filtros de audio decentes para la reducción de ruido incorporados. Audacity tiene un filtro NR bastante efectivo, pero está diseñado para usarse con una operación de 2 pasadas con una muestra del ruido y luego la entrada.
Los comentarios en la parte superior de https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp explican cómo funciona. (Básicamente: suprima todos los contenedores FFT que están por debajo del umbral. Por lo tanto, solo deja pasar las señales cuando son más fuertes que el ruido de fondo en esa banda de frecuencia. Puede hacer cosas increíbles sin causar problemas. Es como un filtro de paso de banda que se adapta a la señal. Dado que la energía del ruido se extiende por todo el espectro, solo dejar pasar unas pocas bandas estrechas reducirá la energía total del ruido MUCHO.
Consulte también Reducción de ruido de audio: ¿cómo se compara audacity con otras opciones? para obtener más detalles sobre cómo funciona, y que el umbral de los contenedores FFT de una forma u otra es la base de los típicos filtros comerciales de reducción de ruido también.
Portar ese filtro a ffmpeg sería un poco incómodo. Quizás implementarlo como un filtro con 2 entradas, en lugar de un filtro de 2 pasos, funcionaría mejor. Dado que solo necesita unos segundos para obtener un perfil de ruido, no es como si tuviera que leer todo el archivo. Y, de todos modos, NO DEBE alimentar la transmisión de audio completa como una muestra de ruido. Necesita ver una muestra de ruido SOLO para establecer umbrales para cada contenedor FFT.
Entonces, sí, una segunda entrada, en lugar de 2pass, tendría sentido. Pero eso hace que sea mucho menos fácil de usar que la mayoría de los filtros ffmpeg. Necesitarías un montón de vudú con extracto de flujo dividido / intervalo de tiempo. Y, por supuesto, necesita intervención manual, a menos que tenga una muestra de ruido en un archivo separado que sea apropiado para múltiples archivos de entrada. (una muestra de ruido del mismo micrófono / configuración debería estar bien para todos los clips de esa configuración).
fuente