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:
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? -
Obtener datos de entrada de audio
Trazar espectograma
Obtenga un gráfico de espectograma para el sonido que desea detectar en un entorno silencioso
Estudie ese gráfico: dibuje características únicas de ese sonido
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)
Si se encuentra una coincidencia, bueno, el trabajo está hecho.
Pulir el algoritmo para eliminar los falsos negativos.
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.
fuente
Respuestas:
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:
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.
fuente
Utilicé este documento sobre la orientación final basada en la entropía cuando intentaba ignorar este tipo de sonidos en las llamadas telefónicas, utilizado para el reconocimiento de voz de la computadora, si los sonidos que intenta capturar es el habla, entonces la entropía podría funcionar realmente bien, para la música puede No será útil.
fuente
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
Clasificación
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.
fuente