Estoy tratando de escribir un algoritmo que segmente automáticamente una pieza de audio con grabaciones de llamadas de pájaros. Mis datos de entrada son archivos wave de 1 minuto de duración y en la salida me gustaría recibir llamadas separadas para un análisis más detallado. El problema es que la relación señal / ruido es bastante terrible debido a las condiciones ambientales y la mala calidad de un micrófono (mono, muestreo de 8 kHz).
Le agradecería cualquier consejo sobre cómo continuar con la reducción de ruido.
Aquí hay un ejemplo de mi entrada, grabación de audio de un minuto en formato de onda: http://goo.gl/16fG8P
Así es como se ve la señal:
El filtrado de paso de banda, en el que mantengo solo cualquier cosa entre 1500 - 2500 Hz, mejora la situación, pero aún está lejos de las expectativas. En este espectro todavía hay mucho ruido presente.
También tracé la energía promedio a largo plazo (más de 32 muestras) y eliminé algunos clics. Aquí está el resultado:
Con todo el ruido restante, tengo que establecer un umbral muy bajo para el algoritmo de detección de inicio para elegir los últimos 10 segundos de llamadas de aves. El problema es que si lo modifico de tal manera, en la próxima grabación puedo obtener muchos falsos positivos.
El filtro de media móvil ayuda un poco con el ruido del viento. ¿Alguna otra idea? Estaba pensando en "Spectral Subtraction", pero aquí me parece que tengo un problema con el huevo y la gallina: para encontrar un área de solo ruido, tengo que segmentar el audio y segmentar el audio que necesito para eliminar el ruido. ¿Conoces alguna biblioteca que tenga este algoritmo o algunas implementaciones en pseudocódigo? Methinks Audacity utiliza dicho método para eliminar el ruido. Es muy efectivo, pero se deja al usuario marcar el área de solo ruido.
Estoy escribiendo en Python y es un proyecto gratuito de código abierto.
¡Gracias por leer!
fuente
Respuestas:
Al final, lo que ha demostrado ser la mejor solución fue la detección de inicio basada en alta frecuencia o contenido de energía. Antes de que pudiera funcionar, tuve que usar un filtro de paso alto para cortar primero 1 kHz, ya que contenía demasiado ruido.
Una vez que tuve un área de solo ruido, pude usar su perfil para reducir el ruido del resto de la muestra.
Una biblioteca que encontré particularmente útil fue Aubio . Tiene un buen conjunto de ejemplos y ofrece muchos algoritmos para elegir para la detección de inicio.
fuente
No sé mucho sobre la reducción de ruido de audio, pero después de una sustracción de ruido rápida y sucia del filtro de banda de paso (alrededor de 1500-3000 hz) obtengo esto:
https://dl.dropboxusercontent.com/u/98395391/signal_denoised.wav
Creo que suena un poco mejor de las señales filtradas y originales.
Con un filtro Wiener simple obtengo resultados muy similares.
fuente