Cómo detectar mediante programación un sonido específico

El problema que está tratando de resolver es el reconocimiento acústico : es muy similar a los problemas de visión por computadora en los que las personas intentan detectar las caras de un gato dentro de una imagen, para muchas formas y tamaños diferentes de caras de gato.

Actualmente, implementar esto no es muy fácil, aunque no es imposible para cosas simples como detectar si un sonido es una alarma de incendio o no.

El problema de detección esencialmente equivale a un binario SÍ (1) o NO (0) de si el sonido está en la muestra dada (todo su archivo .mp3), o si quiere ser más elegante, una probabilidad de si el sonido es presente (un número entre 0 y 1).

El formato MP3 codifica una matriz lineal de amplitudes de sonido. El algoritmo más ingenuo es ejecutar una ventana deslizante (que contiene su forma de onda) sobre la entrada, y determinar si hay coincidencias perfectas en los números. Sin embargo, esto difícilmente funcionará en la práctica, ya que el volumen, las condiciones de medición de la señal, la acústica de la sala y el proceso de conversión A / D en sí varían con respecto al tiempo y pueden dar como resultado una forma de onda muy diferente codificada en el archivo MP3

Incluso en estas condiciones, el sonido se siente perceptualmente idéntico (o lo suficientemente cerca como para ser reconocido como un sonido distinto) para el oído humano. La hipótesis moderna en el reconocimiento de señales es la siguiente: en lugar de procesar todos los 4.0Mb (o el tiempo que dure su sonido) de datos en bruto, hay una representación “comprimida” que captura las ideas principales del sonido, sin descartar sus características más importantes. Escuche el quinto de Beethoven por la radio, e independientemente de si proviene de un piano o una sinfonía, reconocemos sin lugar a dudas la melodía.

Desea encontrar algún algoritmo / función que tome una forma de onda y le devolverá algunos números que describen a un alto nivel de qué es el sonido. Si pones una grabación de piano del quinto de Beethoven, esperas obtener los mismos números de salida que si hubieras puesto una grabación sinfónica (aunque las formas de onda eran muy diferentes). Si pones algo completamente diferente, como la novena sinfonía de Beethoven, esperarías un conjunto de números completamente diferente. Llamamos a estos números un vector de características, porque los números capturan “características” de la forma de onda.

La huella digital acústica es otro ejemplo más de extracción de “características”, donde “huella digital” = “característica” = “firma de calor” = “característica” (hay muchos sinónimos que significan lo mismo). La partitura musical en sí misma puede considerarse como un vector de características (aunque realmente bueno que actualmente no se puede lograr por ningún medio automático).

La detección es más difícil que la “clasificación” porque no solo necesita una buena manera de calcular las características, sino que también debe encontrarlas dentro de la señal. Si comienza a buscar la función después de que el sonido ya ha comenzado, ¡no la encontrará!

Si su tarea es la detección en tiempo real, un método de integración y disparo en tiempo real podría ser adecuado para su problema:

  1. Comience con flotante x = 0.
  2. Ejecute un bucle infinito haciendo lo siguiente: Si se detecta la primera parte del sonido, x + = 1.0. Si en el siguiente intervalo de tiempo coincide la siguiente parte del sonido, x + = 1.0 nuevamente.
  3. Esto continúa hasta que x cruza algún umbral y puede estar razonablemente seguro de que se ha producido el sonido /
  4. Decaimiento x con el tiempo.

Aún necesitará vectores de características para esto, solo en una escala de tiempo más corta.

El estado del arte en visión por computadora, reconocimiento de voz y reconocimiento de escritura a mano es utilizar redes neuronales que no requieren que los investigadores sean muy inteligentes al diseñar características. En cambio, dada una gran cantidad de datos de capacitación (de calidad), la red puede aprender a calcular funciones por sí misma.

Para la tarea de reconocer las notas musicales, un humano podría diseñar un vector de características que se parezca a una escala musical pentatónica. Una red neuronal, por otro lado, podría tener algo que no sea realmente interpretable para los seres humanos (probablemente el resultado de un sobreajuste). Incluso entonces, las escalas pentatónicas no capturan el tipo de falta de armonía de una alarma de incendio, por lo que no sería adecuado para su tarea.

Un método simple sería correlacionar constantemente (en el sentido estadístico) el sonido entrante con el sonido que desea detectar. No sé qué tan bien funcionará esto bajo interferencia, pero probablemente sea un buen lugar para comenzar si no sabe lo que debería estar haciendo.

Esencialmente, solo guarde el sonido que desea detectar, luego tome muestras del sonido entrante de la misma longitud y ejecútelo a través de la fórmula de correlación. Tendrá que experimentar para encontrar el umbral de decisión correcto.

Finalmente, detectar algo se reduce a tomar una decisión de ‘sí / no’. Solo necesita descubrir cómo detectar el límite de decisión.

Creo que la correlación de subbandas o el reconocimiento espectral pueden resolver este problema