Extraigo clips de audio de un archivo de vídeo para el reconocimiento de voz. Estos videos provienen de dispositivos móviles u 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 transmito 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 probado 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 se encuentra en el rango de 300 a 3000 hz, puedo filtrar todas las demás frecuencias para suprimir cualquier ruido de fondo. ¿Qué me estoy perdiendo?
Además, leí sobre los filtros Weiner que podrían usarse para mejorar el habla y encontréestepero no estoy seguro de cómo usarlo.
Respuesta1
Si busca 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 y luego filtrar 3000 hz y más hace un buen trabajo al mantener el audio de voz utilizable.
ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file>
En este ejemplo, agregue primero el filtro de paso alto 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 de db más altas dentro de los rangos de frecuencia de corte.
Respuesta2
FFmpeg ahora tiene 3 filtros nativos para lidiar con el ruido de fondo:
afftdn
: Elimina el ruido de las muestras de audio con FFTanlmdn
: Reduce el ruido de banda ancha en muestras de audio mediante un algoritmo de medios no localesarnndn
: Reduce el ruido del habla mediante redes neuronales recurrentes. Se pueden encontrar ejemplos de archivos de modelo para cargar.aquí.
Además, desde hace algún tiempo, se pueden usar filtros ladspa
(busque supresor de ruido) y/o lv2
(busque eliminador de ruido de voz) con FFmpeg.
Respuesta3
Actualización: FFmpeg agregó recientemente afftdn
que utiliza el método de umbral de ruido por contenedor FFT que se describe a continuación, con varias opciones para adaptar/calcular los valores de umbral apropiados sobre la marcha.
anlmdn
(medios no locales) es una técnica que funciona bien para vídeo; No he probado el filtro de audio.
Cualquiera de estos debería sermuchomejor que paso alto/paso bajo, a menos que su único ruido sea un zumbido de 60 Hz o algo así. (El habla humana aún puede sonar bien en un paso de banda bastante estrecho, pero hay formas mucho mejores de limpiar un silbido de fondo de ruido de banda ancha).
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 solo del ruido y luego la entrada.
Los comentarios en la parte superior dehttps://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cppexplica cómo funciona. (Básicamente: suprime cada contenedor FFT que esté 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 distribuye por todo el espectro, solo dejar pasar unas pocas bandas estrechas reducirá MUCHO la energía total del ruido.
Ver tambiénReducción de ruido de audio: ¿cómo se compara audacity con otras opciones?para obtener más detalles sobre cómo funciona, y que establecer un umbral en los contenedores FFT de una forma u otra también es la base de los filtros comerciales típicos de reducción de ruido.
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 sólo necesita unos segundos para obtener un perfil de ruido, no es como si tuviera que leer todo el archivo. Y de todos modos, NO DEBES alimentarlo con toda la transmisión de audio como una muestra de ruido. Necesita ver una muestra de SOLO ruido para establecer umbrales para cada contenedor FFT.
Entonces sí, tendría sentido una segunda entrada, en lugar de 2 pasadas. Pero eso lo hace mucho menos fácil de usar que la mayoría de los filtros ffmpeg. Necesitarías un montón de vudú con extracción 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).
Respuesta4
Completarusuario564335la respuesta:
Este: -af arnndn=m=cb.rnnn
es probablemente el mejor filtro de ruido que he usadoffmpeg
(basado en IA).
Como esto:
ffmpeg -i <input_file> -af arnndn=m=cb.rnnn <output_file>
No se necesitan filtros de banda de frecuencia. Modelos entrenados ( files.rnnn
)disponible aquí(debe descargar y utilizar uno de los archivos).
El modelo cb
( conjoined-burgers
) es el que encontrémás impresionantey versátil. También encontré este filtro bastante eficiente (no parece usar más CPU que el loudnorm
filtro, por ejemplo).
Además, desde ffmpeg 5.0, hay un nuevo filtro de ruido:afwtdn.
Si mal no recuerdo, lo probé pero no fue tan eficiente como la red neuronal entrenada anterior en mi humilde opinión.