¿Cómo distinguir la voz del ronquido?

22

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.

Daniel R Hicks
fuente
2
¿Puedes publicar algunos espectrogramas representativos? (Deje que los datos hablen). ¿Cómo calcula la "diferencia espectral"?
Emre
La "diferencia espectral" a veces se denomina "flujo espectral" y algunos otros términos. Básicamente es la suma de los cuadrados de las diferencias individuales en las sucesivas FFT del sonido.
Daniel R Hicks
2
Ahora que lo pienso, los clips de audio serían aún mejores. Gracias por la aclaración.
Emre
Estoy tratando de descubrir cuál sería la mejor presentación. No tengo un software sofisticado para hacer espectros (aparte de mis FFT reales) para muestras cortas: Audacity requiere una muestra demasiado larga para capturar el espectro de un sonido individual. Y hay algunos problemas de privacidad médica con la publicación de sonidos reales del paciente.
Daniel R Hicks
1
Los espectrogramas de @DanielRHicks con TV + roncan y solo roncan o algo así realmente ayudaría mucho.
Spacey

Respuestas:

10

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.

[snd,fs]=wavread('recordedFile20120408010300_first_ten_minutes');
cmp=compand(snd,255,1);
wavwrite(cmp,'companded'); % used for listening purposes
[s,f,t,p]=spectrogram(snd,hann(8192));
surf(linspace(0,600,length(t)),f/pi,10*log10(p),'edgecolor','none'); 
axis tight; view(0,90);

Espectrograma completo

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.

idx_max_freq=round(0.2*length(f));
surf(linspace(0,600,length(t)),fs*f(1:,idx_max_freq:)/(2*pi),10*log10(p(1:idx_max_freq,:)),'edgecolor','none');
axis tight; view(0,90);

Zoom del espectrograma a 0-800Hz.

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.

freq_list=round([1:57 63:177 183:297 303:417 423:800]*idx_max_freq/800);
y=10*log10(sum(p(freq_list,:)));
plot(linspace(0,600,length(y)),y-median(y))
stem(linspace(0,600,length(y)),y-median(y)>.5*std(y))

Si queremos ponernos elegantes, podemos descartar picos de gran tamaño:

stem(linspace(0,600,length(y)),(y-median(y)>.5*std(y)).*(y-median(y)<5*std(y)))

Gráfico de la energía en la subbanda con muesca 0-800Hz

El resultado final

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.

Emre
fuente
Sí, mi algoritmo actual cancela el zumbido y otros ruidos armónicos (el ruido del ventilador tiende a ser de aproximadamente 110Hz) al poner a cero los cubos FFT que están en un nivel más o menos constante. No sé a qué se refiere cuando dice "clasifiquemos la señal en función de la energía en esta subbanda": ¿a qué subbanda se refiere?
Daniel R Hicks
Ah, ya veo, estás hablando de menos de 800 Hz. Me perdí ese bit.
Daniel R Hicks
Si miras tu tabla superior, verás que hay bastante información cerca de la parte superior, y otra banda justo debajo de la mitad. Y estas bandas tienen mucho menos ruido de la competencia. Mi esquema actual corta el espectro e intenta evaluar la SNR de cada corte, luego las pondera en consecuencia.
Daniel R Hicks
Puede concatenar varias características, como la energía en subbandas seleccionadas, la planitud espectral, etc. para crear un vector de característica tentativo. Luego realice PCA para averiguar cuáles son más importantes, como se explicó en el último artículo.
Emre
Eso es básicamente lo que estoy haciendo, sin el rigor de la PCA.
Daniel R Hicks,
9

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

Nathan Day
fuente
No entiendo completamente lo que estoy haciendo con él (la teoría de la información hace explotar mi cabeza), pero implementé un cálculo de entropía cruda, agregué un poco de normalización totalmente no teórica, y parece estar funcionando. La música y la voz tienen una entropía baja (negativa), mientras que el ronquido es significativamente mayor. Y el ruido de fondo en general parece disminuir el valor (negativo), por lo que proporciona una muy buena figura de mérito. Sin embargo, se necesita más experimentación.
Daniel R Hicks
Una cosa a tener en cuenta es que también debe incluir una compuerta de nivel simple, ya que puede tener un ruido de fondo extremadamente bajo que puede coincidir con las cosas que está tratando de dejar pasar, también mi experiencia parece sugerir la cuantización digital de El ruido extremo de nivel bajo puede aumentar el orden de la señal, ya que a niveles bajos hay un número reducido de posibles valores de muestra y la entropía por sí sola no considera diferencias en la amplitud.
Nathan Day
Sí, regularmente estoy luchando contra el ruido, y tengo una muy buena manera de medir eso por separado. Cuando el ruido excede un cierto nivel, despejo. (En realidad, es increíblemente difícil medir el ruido.)
Daniel R Hicks
Por desgracia, descubrí que gran parte de lo que estaba midiendo con mi cálculo de entropía cruda era un artefacto del cálculo (debido a ceros en los datos de prueba). Funciona para mi necesidad, pero no tan bien como pensé al principio.
Daniel R Hicks
Seguimiento: reemplacé el FFT fijo / flotante que había estado usando con uno de coma flotante completo (que no produce ceros cuando los niveles son bajos), y la utilidad de la entropía fue más allá de los tubos, no parece proporcionar algo particularmente útil.
Daniel R Hicks
3

¿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.

Hilmar
fuente
Las estadísticas básicas del dominio del tiempo son indistinguibles. Sin embargo, es un buen punto que podría mirar la variabilidad a corto plazo (que normalmente suavizo). Buscar el "rebote" entre las bandas de frecuencia también es una buena idea ... Actualmente me divido en 5 bandas y rechazo las bandas con una aparente baja señal.
Daniel R Hicks
@DanielRHicks Vi cómo calcular la envoltura cepstral en otro lugar, pero quizás puedas usar eso como una medida de tu variabilidad espectral en lugar del espectro puro que será más 'ruidoso / irregular' mientras que el cepstrum me tiende a ser más suave. . También he oído que el cepstrum Mel-Frequency se usa en el reconocimiento de voz, y esto suena como si pudiera serle útil.
Spacey
@DanielRHicks: ¿Indistinguible por qué método? Ciertamente son distinguibles para mí.
endolito
@endolith - Indistinguible debido a mis métricas actuales: la "diferencia espectral" más el nivel de energía general. Pero tienen un filtro de paso bajo con una constante de tiempo de aproximadamente 0,5 segundos. Creo que intentaré mirar un poco los datos sin filtrar.
Daniel R Hicks
Intenté capturar las estadísticas de tiempo de corta duración. Algunas "pistas", pero nada definitivo.
Daniel R Hicks
1

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.

hotpaw2
fuente
El problema es que el ronquido es asombrosamente complejo / aleatorio, y carece de características distintivas cuando se examina su espectro.
Daniel R Hicks
Sería una información interesante si una persona que duerme forma tantos filtros de forzamiento de vocales y plosivos diferentes (y dígrafos y trigrafos de tales en una densidad a lo largo del tiempo), e inflexiones de tono (etc.), mientras duerme como cuando está despierto y hablando.
hotpaw2
La falta de características puede ser una característica importante. El discurso tiene características.
hotpaw2
Un problema es que los ronquidos pueden variar enormemente, de una respiración a la siguiente. Un simple aliento pesado es muy "blanco", pero un ronquido puede tener algunos picos muy fuertes. Es esencialmente una onda cuadrada, aunque es una simplificación excesiva. Y tenemos que hacer el análisis en tiempo real en un teléfono inteligente, por lo que la complejidad del algoritmo es limitada.
Daniel R Hicks