Antecedentes: estoy trabajando en una aplicación para iPhone (aludida en varias otras publicaciones ) que "escucha" roncar / respirar mientras uno está dormido y determina si hay signos de apnea del sueño (como una pantalla previa para el "laboratorio del sueño" pruebas). La aplicación emplea principalmente "diferencia espectral" para detectar ronquidos / respiraciones, y funciona bastante bien (correlación ca 0.85-0.90) cuando se prueba contra grabaciones de laboratorio de sueño (que en realidad son bastante ruidosas).
Problema: Puedo filtrar la mayoría del ruido de "dormitorio" (ventiladores, etc.) a través de varias técnicas y, a menudo, detecto la respiración de manera confiable a niveles de S / N donde el oído humano no puede detectarla. El problema es el ruido de la voz. No es inusual tener una televisión o una radio funcionando en segundo plano (o simplemente tener a alguien hablando a lo lejos), y el ritmo de la voz coincide estrechamente con la respiración / ronquidos. De hecho, realicé una grabación del difunto autor / narrador de cuentos Bill Holm a través de la aplicación y era esencialmente indistinguible de roncar en ritmo, variabilidad de nivel y varias otras medidas. (Aunque puedo decir que aparentemente no tenía apnea del sueño, al menos no mientras estaba despierto).
Así que esta es una posibilidad remota (y probablemente una extensión de las reglas del foro), pero estoy buscando algunas ideas sobre cómo distinguir la voz. No necesitamos filtrar los ronquidos de alguna manera (pensé que sería bueno), sino que solo necesitamos una forma de rechazar como sonido "demasiado ruidoso" que está demasiado contaminado con la voz.
¿Algunas ideas?
Archivos publicados: he colocado algunos archivos en dropbox.com:
La primera es una pieza de música rock bastante aleatoria (supongo), y la segunda es una grabación del difunto discurso de Bill Holm. Ambos (que utilizo para que mis muestras de "ruido" se diferencien de los ronquidos) se han mezclado con ruido para ofuscar la señal. (Esto hace que la tarea de identificarlos sea significativamente más difícil). El tercer archivo es diez minutos de una grabación tuya en la que el primer tercio respira principalmente, el tercio medio es respiración / ronquido mixto y el tercio final es ronquido bastante constante. (Tienes tos por un bono).
Se ha cambiado el nombre de los tres archivos de ".wav" a "_wav.dat", ya que muchos navegadores dificultan enormemente la descarga de archivos wav. Simplemente cámbielos de nuevo a ".wav" después de la descarga.
Actualización: pensé que la entropía estaba "haciendo el truco" para mí, pero resultó ser principalmente peculiaridades de los casos de prueba que estaba usando, además de un algoritmo que no estaba muy bien diseñado. En el caso general, la entropía me está haciendo muy poco.
Posteriormente probé una técnica en la que calculo la FFT (usando varias funciones de ventana diferentes) de la magnitud de la señal general (probé la potencia, el flujo espectral y varias otras medidas) muestreada aproximadamente 8 veces por segundo (tomando las estadísticas del ciclo principal de FFT que es cada 1024/8000 segundos). Con 1024 muestras, esto cubre un rango de tiempo de aproximadamente dos minutos. Esperaba poder ver patrones en esto debido al lento ritmo de los ronquidos / respiración frente a la voz / música (y que también podría ser una mejor manera de abordar el problema de la " variabilidad "), pero si bien hay indicios de un patrón aquí y allá, no hay nada en lo que realmente pueda aferrarme.
( Más información: para algunos casos, la FFT de magnitud de la señal produce un patrón muy distinto con un pico fuerte a aproximadamente 0.2Hz y armónicos escalonados. Pero el patrón no es tan distinto la mayor parte del tiempo, y la voz y la música pueden generar menos distinción versiones de un patrón similar. Puede haber alguna forma de calcular un valor de correlación para una figura de mérito, pero parece que requeriría un ajuste de curva a aproximadamente un polinomio de cuarto orden, y hacerlo una vez por segundo en un teléfono parece poco práctico).
También intenté hacer la misma FFT de amplitud promedio para las 5 "bandas" individuales en las que he dividido el espectro. Las bandas son 4000-2000, 2000-1000, 1000-500 y 500-0. El patrón para las primeras 4 bandas fue generalmente similar al patrón general (aunque no hubo una banda "sobresaliente" real, y a menudo una señal extremadamente pequeña en las bandas de frecuencia más altas), pero la banda 500-0 generalmente fue aleatoria.
Recompensa: le daré la recompensa a Nathan, a pesar de que no se le ofreció nada nuevo, dado que la suya fue la sugerencia más productiva hasta la fecha. Sin embargo, todavía tengo algunos puntos que estaría dispuesto a otorgarle a otra persona, si presentaran algunas buenas ideas.
fuente
Respuestas:
Fondo
De acuerdo con los documentos a continuación, el ronquido se caracteriza por un pico a aproximadamente 130Hz, y se concentra completamente por debajo de 12kHz:
Veamos si podemos aprovechar esto.
Ejemplo de MATLAB
Tenemos una mala grabación de un niño roncando ; un archivo WAV mono de 10 minutos y 8 bits. La frecuencia de muestreo es de 8KHz, lo que significa que el ancho de banda de la señal de audio es de 4KHz. El nivel es muy bajo, así que lo compararé primero.
El eje y está normalizado al ancho de banda, 4KHz, de modo que la muesca que ves en 0.1 corresponde a una frecuencia de 400Hz. Hay una espiga correspondiente a una tos a ~ 186s; ignora eso. Podemos ver vagamente las muescas durante cada ronquido. No solo eso, sino que parecen concentrados por debajo de 0.2 x 4KHz = 800Hz. Miremos más de cerca.
Esta vez el eje de frecuencia fue etiquetado en Hertz. Ahora las muescas son bastante claras. Incluso podemos ver los armónicos del ruido de la línea de alimentación a partir de 60Hz (180Hz, 300Hz, 420Hz). Ahora viene la esencia del algoritmo: clasifiquemos la señal en función de la energía en esta subbanda, con el ruido de línea eliminado.
Si queremos ponernos elegantes, podemos descartar picos de gran tamaño:
La baja SNR, que se manifiesta en la dificultad para discernir la señal en la primera gráfica, significa que tenemos margen de maniobra de solo la mitad de una desviación estándar (cuyo valor era 4.1). Los tallos marcan los ronquidos.
fuente
Simplemente lanzando esto aquí para cubrir todas las posibilidades, es posible que pueda usar la entropía, no sé cuál es el nivel de entropía del ronquido frente al habla, pero si es lo suficientemente diferente, puede funcionar. http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf
fuente
¿Estadísticas de dominio de tiempo tal vez? Los ronquidos parecen tener períodos relativamente largos de estado estacionario, mientras que la energía del habla cambia bastante en períodos cortos de tiempo. Esto podría combinarse también con el análisis espectral. Las vocales tienen más contenido de baja frecuencia y las consonantes tienen más frecuencias altas. Durante el habla, el espectro puede rebotar rápidamente entre esos estados, mientras que el almacenamiento puede permanecer en un estado por períodos más largos.
fuente
Complejidad espectral en el tiempo. Hipotetizaré que el habla humana probablemente usa más fonemas y con una complejidad estadística mucho mayor en su secuencia que las secuencias de fonemas de los ronquidos.
Este es probablemente un problema mucho más fácil que el reconocimiento de voz continuo, ya que no necesitará reconocer correctamente ningún fonema u oración en particular, solo la cantidad de segmentos espectrales que suenan fonemas y alguna medida de complejidad estadística de sus secuencias (una entropía o prueba de compresibilidad podría funcionar). Luego, vea si puede determinar un umbral confiable para estas medidas.
fuente