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!