¿Cómo hago para detectar silbidos, pops y otros sonidos en la entrada de audio en vivo?


9

He leído muchas preguntas sobre SO y, francamente, cada una de ellas no describe ninguna forma particular de hacerlo. Algunos dicen "hacer FFT" y otros dicen "cruce por cero", etc. Pero solo he llegado al extremo de comprender que la entrada de audio digital consiste en un conjunto de amplitudes para una frecuencia particular y bueno ... Realmente no sé mucho Más allá de eso.

Ahora sí conozco el teorema de Nyquist, la frecuencia, la amplitud, la serie de Fourier, etc., y eso fue hace 2-3 años cuando lo hice en mi programa universitario en algún semestre. Pero en aquel entonces realmente no nos enseñaron mucho el uso del mundo real de Fourier, y no me molesté en desenterrar más sobre el tema más allá de aprender lo suficiente para aprobar el tema. Pero ahora voy a tener que usar todas esas cosas.

Aquí hay una instantánea de los sonidos que intento detectar:

gráfico único de chasquidos de dedos y encendido / apagado de luces

Claramente, los sonidos tienen gráficos únicos. Solo quiero entender cómo extraer sus características únicas particulares para sus líneas puntiagudas únicas en el gráfico. Como qué amplitud, frecuencia, etc. Y por cuánto tiempo, aunque eso es trivial, supongo.

Quiero una simple lista de instrucciones paso a paso, poco vaga: puedo buscar en Google la terminología que no entenderé.

¿Te gusta quizás esto? -

  1. Obtener datos de entrada de audio

  2. Trazar espectograma

  3. Obtenga un gráfico de espectograma para el sonido que desea detectar en un entorno silencioso

  4. Estudie ese gráfico: dibuje características únicas de ese sonido

  5. Realice algún tipo de función que pueda detectar esas características particulares en la transmisión de audio en vivo, utilizando las características del sonido que se encuentra en (4)

  6. Si se encuentra una coincidencia, bueno, el trabajo está hecho.

  7. Pulir el algoritmo para eliminar los falsos negativos.

UNAsiXZ

Estaba pensando en hacer que el usuario grabara el sonido que quiere almacenar como un gesto en un entorno tranquilo. Y el usuario solo emitiría el sonido entre el relleno de tiempo silencioso ; 3 segundos al principio y al final de la grabación.

Digamos, durante los primeros 3 segundos, mi sistema establecería que la entrada actual es el sonido de fondo silencioso normal. Y luego, un cambio repentino en el gráfico sería el inicio de la entrada de sonido. Y cuando eso se detenga, la grabación continuaría durante otros 3 segundos, el relleno de tiempo de silencio final . Esto lo haría manualmente el usuario. Luego almacenaría automáticamente las características de solo esa parte durante la cual duró el cambio repentino en el gráfico, en algún lugar entre los tiempos de relleno.

Y así, las características de esa parte se guardarían como datos de gestos de ese sonido, que se utilizarían para detectar ese sonido en particular en la transmisión de audio en vivo más adelante.

El problema es que estoy pensando todo esto en inglés simple. Necesito pensar en matemáticas y física, para poder implementarlo eficientemente en mi código. No tengo ni idea de qué escribir y dónde escribirlo en mi código, incluso con tantas bibliotecas y preguntas sobre SO a mi disposición.

Y perdón si esto fue largo.


1
Por curiosidad, ¿ese espectrograma está hecho en un teléfono o tableta? Si es así, ¿puede decir el nombre de la aplicación? Se ve realmente genial. Con respecto a su pregunta, creo que su aplicación es similar al tema / tarea de hacer un reconocimiento de palabras aislado. Probablemente puedas obtener muchas ideas e inspiración buscando en Google. La parte difícil es no reconocer los gestos en un conjunto relativamente pequeño y limitado de gestos, la parte difícil es filtrar las cosas que no son gestos.
niaren

Esta es la aplicación: play.google.com/store/apps/… Y gracias por tus puntos de vista. Pero quiero que me digas cómo detectar no palabras, sino sonidos (al menos por ahora), como silbidos, pop, aplausos, etc. Estoy trabajando en Python.
bad_keypoints

1
Lamentablemente, este tipo de cosas sigue siendo un área de investigación. No conozco a nadie que resuelva este problema específico.
Bjorn Roche

Respuestas:


2

Si bien estoy de acuerdo con uno de los comentarios de que el uso de técnicas de reconocimiento de voz puede ser un buen comienzo, estos sonidos son diferentes y no estoy al tanto de que alguien haya investigado para clasificarlos (el artículo citado por Nathan parece solo distinguir entre el habla y ruido), así que, a menos que alguien presente algo que lo contradiga, tendrá que inventar su propia técnica, y eso requerirá mucho aprendizaje y mucho trabajo. Lo mejor que puedo hacer es empezar.

En primer lugar, no esperes que nadie pueda producir alguna fórmula mágica. No hay ecuación para pasar del sonido a lo que es el sonido. Los humanos y las computadoras deben aprender incorporando datos para hacer conjeturas sobre lo que son los sonidos. La razón por la cual las personas dicen en sus respuestas "usar FFT" o "usar cruce por cero" es porque estos son algunos de los componentes básicos de DSP utilizados en el reconocimiento de voz y algoritmos relacionados. Pero la FFT y la velocidad de cruce cero son generalmente solo los primeros pasos para crear un conjunto de parámetros que describan el sonido. Estos parámetros se analizan estadísticamente (no a través de alguna función mágica) para determinar a qué categoría pertenecen probablemente. Tenga en cuenta que dije "muy probablemente": incluso la mejor detección de voz (¡y el cerebro humano!

Por lo tanto, algunos parámetros que puede buscar incluyen:

  • tasa de cruce por cero
  • centroide de frecuencia
  • sobre (esto es en realidad un conjunto de parámetros, que incluyen, por ejemplo, tiempo de ataque)
  • envoltura espectral
  • equilibrio armónico par / impar
  • voiciness
  • tono fundamental

Una vez que tenga un conjunto de parámetros que cree que le permitirán distinguir sus sonidos, necesitará usar algún método estadístico para clasificarlos. El modelo oculto de Markov se usa a menudo en el habla. También puede analizar la regresión logística, K-means, y estoy seguro de que hay otras opciones, pero creo que HMM está probado y es cierto.


Su respuesta es buena, pero básicamente le pido que haga coincidir los sonidos del usuario con los sonidos que hace más tarde al usar mi software. Como cosas de similitud. Digamos que un usuario produce diferentes tipos de sonidos A, B y C. Y las características de estos sonidos se almacenan como C_A, C_B y C_C respectivamente.
bad_keypoints

La técnica sigue siendo la misma: 1. averiguar qué parámetros va a medir, 2. medirlos, 3. usar estadísticas para aprender qué hace que cada sonido sea diferente, 4. usar esos datos para categorizar.
Bjorn Roche

así que eso es básicamente lo que pensé. pero supongo que tendré que ver qué parámetros de la buena lista larga que proporcionó tendrían que marcar para disuadir los sonidos.
bad_keypoints

1
Para ser honesto, soy muy pesimista sobre poder distinguir cosas como un chasquido de dedos y un interruptor de luz en una variedad de entornos sin muchos datos de muestra y tal vez más parámetros de los que di, pero espero estar equivocado. Por favor, informe sobre sus resultados, incluso si lleva un tiempo.
Bjorn Roche

Además, algunas personas en la lista de correo music-dsp ( music.columbia.edu/cmc/music-dsp ) pueden tener otras sugerencias.
Bjorn Roche


0

Creo que las recomendaciones de Bjorn son muy buenas, pero quiero proporcionar información adicional. Según su descripción, esto se parece mucho a un problema de identificación de timbre. Hay algunas investigaciones en esta área en contextos de música de computadora (identificar diferentes instrumentos es una cosa útil para poder hacer y diferenciar entre un chasquido y un aplauso se debe al timbre del sonido). William Brentha investigado un poco en esta área (busque timbreID en su página) y ha creado un software para usar en Pure Data. En cada una de las situaciones que busca eventos específicos, sería una buena idea hacer una segmentación automática por detección de inicio. Como ya está tomando un STFT, determinar un inicio no requeriría demasiado trabajo adicional (verifique la detección de inicio de Spectral Flux). Un esquema del sistema podría ser como tal:

Formación

  • Determine las características apropiadas (por ejemplo, tasa de cruce por cero, centroide espectral, MFCC)
  • Detectar un inicio
  • Calcule estas características en el audio de entrada (sus grabaciones de gestos)
  • Mantenga una base de datos de cálculos de características. Deberá determinar si se trata de una situación de capacitación supervisada o no supervisada. Por ejemplo, los usuarios especifican de antemano que un chasquido es "sonido 1" y un aplauso es "sonido 2", o su sistema intenta agruparlos después del entrenamiento.

Clasificación

  • Detecta un inicio en tiempo real y calcula las características del audio entrante
  • Use una métrica de distancia (distancia euclidiana u otra distancia Lp) para hacer una clasificación de vecino más cercano o K-vecino más cercano para determinar el sonido "más cercano" de su base de datos

Este artículo sobre identificación de timbre percusivo podría ser de alguna utilidad. Describe las definiciones de posibles características para calcular el sonido entrante y el método de clasificación del autor. Esto funcionará bastante bien para los sonidos de percusión, pero podría no funcionar tan bien para algo como el habla (sílabas múltiples), en ese caso un método HMM sería más adecuado. Del mismo modo, la precisión de su detección de inicio variará según los tipos de sonidos que esté buscando.

Si está particularmente preocupado por las instantáneas o los interruptores de luz, dedique un tiempo a determinar qué características podrían discriminar con precisión entre los dos sonidos.


Detectaría el inicio detectando cambios repentinos en los datos de audio entrantes. Eso debería funcionar. Estoy a punto de detectar el inicio y el final de los gestos que se almacenarán.
bad_keypoints

Sí, eso debería funcionar principalmente. La única razón por la que sugerí Spectral Flux es porque de todos modos vas a tomar un STFT. Si espera un entorno bastante tranquilo, un umbral de amplitud básico debería funcionar lo suficientemente bien.
greatscott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.