Reduzca el ruido de fondo y optimice la voz de un clip de audio con ffmpeg

30

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.

Sudh
fuente

Respuestas:

36

Si está buscando aislar el habla audible, intente combinar un filtro de paso bajo con un filtro de paso alto. Para el audio utilizable, he notado que filtrar 200 Hz y menos, luego filtrar 3000 Hz y más, hace un trabajo bastante bueno para mantener el audio de voz utilizable.

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

En este ejemplo, agregue el filtro de paso alto primero para cortar las frecuencias más bajas y luego use el filtro de paso bajo para cortar las frecuencias más altas. Si es necesario, puede ejecutar su archivo a través de esto más de una vez para limpiar frecuencias db más altas dentro de los rangos de frecuencia de corte.

av8r
fuente
Lo siento, pero esto parece no hacer una reducción notable de ruido para mí.
Angad
Esto funciona muy bien para reducir el bajo nivel de ruido de fondo (ventiladores, zumbidos, etc.) pero puede comprometer ligeramente la calidad del audio, aunque eso puede mitigarse un poco aplicando otros filtros después.
Iain Collins el
3
Para mi caso, el audio original era tan malo que era casi imposible escuchar la voz debido a un poco de ruido de fondo. Usé lo siguiente. No es de gran calidad, pero 1000 veces mejor que el original. -af "highpass=f=200, lowpass=f=1000"
Eric
Recibo algún error con lo anterior o, más bien, advertencia de ffmpeg: [Parsed_highpass_0 @ 0x1524780] recorte 52 veces. Por favor, reduzca la ganancia.
shevy
66
Puede previsualizar su filtro conffplay <input file> -af lowpass=3000,highpass=200
Björn
11

FFmpeg ahora tiene 2 filtros nativos para lidiar con el ruido de fondo:

Además, desde hace algún tiempo, uno puede usar ladspa(buscar un supresor de ruido) y / o lv2(buscar un disipador de voz) filtros con FFmpeg.

Paul B. Mahol
fuente
9

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

Peter Cordes
fuente