Comment distinguer la voix du ronflement?


22

Contexte: Je travaille sur une application iPhone (mentionnée dans plusieurs autres articles ) qui "écoute" le ronflement / la respiration pendant que l'on est endormi et détermine s'il y a des signes d'apnée du sommeil (en tant que pré-écran pour "laboratoire de sommeil" essai). L'application utilise principalement la «différence spectrale» pour détecter les ronflements / respirations, et elle fonctionne assez bien (corrélation d'environ 0,85 à 0,90) lorsqu'elle est testée par rapport aux enregistrements de laboratoire du sommeil (qui sont en fait assez bruyants).

Problème: la plupart des bruits «de chambre» (ventilateurs, etc.) peuvent être filtrés par plusieurs techniques et détectent souvent de manière fiable la respiration à des niveaux S / N où l'oreille humaine ne peut pas la détecter. Le problème est le bruit de la voix. Il n'est pas inhabituel d'avoir une télévision ou une radio en arrière-plan (ou simplement d'avoir quelqu'un qui parle au loin), et le rythme de la voix correspond étroitement à la respiration / ronflement. En fait, j'ai exécuté un enregistrement de feu l'auteur / conteur Bill Holm via l'application et il était essentiellement impossible de distinguer le ronflement du rythme, la variabilité du niveau et plusieurs autres mesures. (Bien que je puisse dire qu'il n'a apparemment pas eu d'apnée du sommeil, du moins pas lorsqu'il est éveillé.)

C'est donc un peu long (et probablement un tronçon de règles du forum), mais je cherche quelques idées sur la façon de distinguer la voix. Nous n'avons pas besoin de filtrer les ronflements d'une manière ou d'une autre (ce serait bien), mais nous avons juste besoin d'un moyen de rejeter le son "trop ​​bruyant" qui est trop pollué par la voix.

Des idées?

Fichiers publiés: j'ai placé des fichiers sur dropbox.com:

Le premier est un morceau plutôt aléatoire de musique rock (je suppose), et le second est un enregistrement de feu Bill Holm. Les deux (que j'utilise pour différencier mes échantillons de "bruit" du ronflement) ont été mélangés avec du bruit pour obscurcir le signal. (Cela rend la tâche de les identifier beaucoup plus difficile.) Le troisième fichier contient dix minutes de votre enregistrement, où le premier tiers respire le plus, le tiers du milieu est une respiration / ronflement mixte et le dernier tiers est un ronflement assez stable. (Vous obtenez une toux pour un bonus.)

Les trois fichiers ont été renommés de ".wav" en "_wav.dat", car de nombreux navigateurs rendent le téléchargement des fichiers wav incroyablement difficile. Renommez-les simplement en ".wav" après le téléchargement.

Mise à jour: Je pensais que l'entropie "faisait l'affaire" pour moi, mais il s'est avéré être principalement des particularités des cas de test que j'utilisais, plus un algorithme qui n'était pas trop bien conçu. Dans le cas général, l'entropie fait très peu pour moi.

J'ai ensuite essayé une technique où je calcule la FFT (en utilisant plusieurs fonctions de fenêtre différentes) de l'amplitude globale du signal (j'ai essayé la puissance, le flux spectral et plusieurs autres mesures) échantillonné environ 8 fois par seconde (en prenant les statistiques du cycle FFT principal qui est toutes les 1024/8000 secondes). Avec 1024 échantillons, cela couvre une plage de temps d'environ deux minutes. J'espérais que je serais en mesure de voir des schémas en raison du rythme lent du ronflement / respiration vs voix / musique (et que cela pourrait également être un meilleur moyen de résoudre le problème de la " variabilité "), mais bien qu'il y ait des indices d'un motif ici et là, il n'y a rien que je puisse vraiment accrocher.

( Plus d'informations: Dans certains cas, la FFT de l'amplitude du signal produit un motif très distinct avec un fort pic à environ 0,2 Hz et des harmoniques de marches. Mais le motif n'est pas aussi distinct la plupart du temps, et la voix et la musique peuvent générer moins distinctes versions d'un modèle similaire. Il pourrait y avoir un moyen de calculer une valeur de corrélation pour un chiffre de mérite, mais il semble que cela nécessiterait l'ajustement de la courbe à un polynôme de 4e ordre, et le faire une fois par seconde dans un téléphone semble peu pratique.)

J'ai également essayé de faire la même FFT d'amplitude moyenne pour les 5 "bandes" individuelles dans lesquelles j'ai divisé le spectre. Les bandes sont 4000-2000, 2000-1000, 1000-500 et 500-0. Le modèle pour les 4 premières bandes était généralement similaire au modèle global (bien qu'il n'y ait pas de véritable bande «hors concours», et souvent un signal extrêmement faible dans les bandes de fréquences plus élevées), mais la bande 500-0 était généralement aléatoire.

Bounty: Je vais donner à Nathan la prime, même s'il n'a rien offert de nouveau, étant donné que c'était la suggestion la plus productive à ce jour. J'ai encore quelques points que je serais prêt à attribuer à quelqu'un d'autre, s'ils venaient avec de bonnes idées.


2
Pouvez-vous publier des spectrogrammes représentatifs? (Laissez parler les données.) Comment calculez-vous la "différence spectrale"?
Emre

La "différence spectrale" est parfois appelée "flux spectral" et quelques autres termes. Fondamentalement, c'est la somme des carrés des différences individuelles dans les FFT successives du son.
Daniel R Hicks

2
À bien y penser, les clips audio seraient encore mieux. Merci pour la clarification.
Emre

J'essaie de comprendre quelle serait la meilleure présentation. Je n'ai pas de logiciel sophistiqué pour faire des spectres (autres que mes FFT réels) pour des échantillons courts - Audacity a besoin d'un échantillon trop long pour capturer le spectre d'un son individuel. Et il y a des problèmes de confidentialité médicale avec la publication de sons de patients réels.
Daniel R Hicks

1
@DanielRHicks Spectrogrammes avec TV + ronflement et juste ronflement ou quelque chose comme ça irait vraiment très loin.
Spacey

Réponses:


10

Contexte

Selon les articles ci-dessous, le ronflement est caractérisé par un pic à environ 130 Hz et est entièrement concentré en dessous de 12 kHz:

Voyons voir si nous pouvons tirer parti de cela.

Exemple MATLAB

Nous avons un mauvais enregistrement d'un enfant qui ronfle ; un fichier WAV mono 8 bits de 10 minutes. Le taux d'échantillonnage est de 8 KHz, ce qui signifie que la bande passante du signal audio est de 4KHz. Le niveau est très bas, je vais donc le compander en premier.

[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);

Spectrogramme complet

L'axe des y est normalisé à la bande passante, 4KHz, de sorte que l'encoche que vous voyez à 0,1 correspond à une fréquence de 400Hz. Il y a un pic correspondant à une toux à ~ 186 s; ignorer cela. On voit vaguement les encoches lors de chaque ronflement. Non seulement cela, mais ils semblent concentrés en dessous de 0,2 x 4KHz = 800Hz. Regardons de plus près.

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 du spectrogramme à 0-800Hz.

Cette fois, l'axe des fréquences a été étiqueté en Hertz. Maintenant, les encoches sont assez claires. Nous pouvons même voir les harmoniques du bruit de la ligne électrique à partir de 60 Hz (180 Hz, 300 Hz, 420 Hz). Voici maintenant l'essence de l'algorithme: classons le signal en fonction de l'énergie dans cette sous-bande, sans le bruit de ligne.

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 nous voulons devenir fantaisistes, nous pouvons éliminer les pointes surdimensionnées:

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

Tracé de l'énergie dans la sous-bande crantée 0-800Hz

Le résultat final

Le faible SNR, qui se manifeste par la difficulté à discerner le signal dans le premier tracé, signifie que nous n'avons qu'une marge d'un demi-écart-type (dont la valeur était de 4,1). Les tiges marquent les ronflements.


Oui, mon algorithme actuel annule le bourdonnement et les autres bruits harmoniques (le bruit du ventilateur a tendance à être d'environ 110 Hz) en mettant à zéro les seaux FFT qui sont à un niveau plus ou moins constant. Je ne comprends pas ce que vous voulez dire lorsque vous dites "classons le signal en fonction de l'énergie dans cette sous-bande" - de quelle sous-bande parlez-vous?
Daniel R Hicks

Oh, je vois, vous parlez de moins de 800 Hz - j'ai raté ce bit.
Daniel R Hicks

Si vous regardez votre graphique supérieur, vous verrez qu'il y a pas mal d'informations en haut et une autre bande juste en dessous du milieu. Et ces bandes ont beaucoup moins de bruit concurrentiel. Mon schéma actuel tranche le spectre et tente d'évaluer le SNR de chaque tranche, puis les pondère en conséquence.
Daniel R Hicks

Vous pouvez concaténer plusieurs entités, telles que l'énergie dans des sous-bandes sélectionnées, la planéité spectrale, etc. pour créer un vecteur d'entité provisoire. Ensuite, effectuez l'ACP pour découvrir celles qui importent le plus, comme expliqué dans le dernier article.
Emre

C'est essentiellement ce que je fais, en l'absence de la rigueur de l'APC.
Daniel R Hicks

9

En lançant cela ici pour couvrir toutes les possibilités, vous pourriez peut-être utiliser l'entropie, je ne sais pas quel est le niveau d'entropie du ronflement par rapport à la parole, mais s'il est suffisamment différent, cela peut fonctionner. http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf


Je ne comprends pas tout à fait ce que j'en fais (la théorie de l'information fait exploser ma tête), mais j'ai implémenté un calcul d'entropie brut, ajouté une normalisation totalement non théorique, et cela semble fonctionner. La musique et la voix ont une entropie faible (négative), tandis que le ronflement est considérablement plus élevé. Et le bruit de fond en général semble diminuer la valeur (négative), donc il fournit un assez bon chiffre de mérite. Cependant, plus d'expérimentation était nécessaire.
Daniel R Hicks

Une chose à laquelle vous devez faire attention est que vous devez également inclure une porte de niveau simple car, vous pouvez avoir un bruit de fond de niveau extrêmement bas qui peut correspondre à ce que vous essayez de laisser passer, mon expérience semble également suggérer la quantification des chiffres de un bruit extrêmement faible peut augmenter l'ordre de l'ordre du signal, car à de faibles niveaux, il existe un nombre réduit de valeurs d'échantillonnage possibles et l'entropie seule ne prend pas en compte les différences d'amplitude.
Nathan Day

Oui, je me bats régulièrement contre le bruit, et j'ai un assez bon moyen d'évaluer cela séparément. Lorsque le bruit dépasse un certain niveau, je frappe. (Il est incroyablement difficile, en fait, de mesurer le bruit.)
Daniel R Hicks

Hélas, j'ai découvert qu'une grande partie de ce que je mesurais avec mon calcul d'entropie brute était un artefact du calcul (en raison de zéros dans les données de test). Cela fonctionne en quelque sorte pour mes besoins, mais pas aussi bien que je le pensais au départ.
Daniel R Hicks

Suivi: j'ai remplacé la FFT fixe / flottante que j'utilisais par une FFT à virgule flottante complète (qui ne produit pas de zéros lorsque les niveaux sont bas), et l'utilité de l'entropie est allée plus loin dans les tubes - ne le fait pas semblent fournir quelque chose de particulièrement utile.
Daniel R Hicks

3

Peut-être des statistiques dans le domaine temporel? Le ronflement semble avoir des périodes d'état stationnaire relativement longues, tandis que l'énergie de la parole change un peu sur de courtes périodes. Cela pourrait également être combiné avec l'analyse spectrale. Les voyelles ont un contenu plus basse fréquence et les consonnes plus hautes fréquences. Pendant la parole, le spectre peut rapidement rebondir entre ces états, tandis que le stockage peut rester dans un état pendant de plus longues périodes.


Les statistiques de base du domaine temporel sont indiscernables. Cependant, c'est un bon point que je pourrais regarder la variabilité à court terme (que je lisse normalement). La recherche du "rebond" entre les bandes de fréquences est aussi une bonne idée ... Je me divise actuellement en 5 bandes et rejette les bandes avec un S / N apparemment bas.
Daniel R Hicks

@DanielRHicks J'ai vu comment calculer l' enveloppe cepstrale ailleurs, mais peut-être pouvez-vous l'utiliser comme une mesure de votre variabilité spectrale au lieu du spectre pur qui sera plus «bruyant / dentelé» tandis que le (s) cepstrum (s) ont tendance à me rendre plus lisse . J'ai également entendu dire que le cepstre Mel-Frequency est utilisé dans la reconnaissance vocale, et cela semble pouvoir vous être utile.
Spacey

@DanielRHicks: indiscernable par quelle méthode? Ils se distinguent certainement pour moi.
endolith

@endolith - Indiscernable étant donné mes mesures actuelles - la "différence spectrale" plus le niveau d'énergie global. Mais ils sont filtrés passe-bas avec une constante de temps d'environ 0,5 seconde. Je pense que je vais essayer de regarder un peu les données non filtrées.
Daniel R Hicks

J'ai essayé de capturer les statistiques de temps de courte durée. Quelques "indices", mais rien de définitif.
Daniel R Hicks

1

Complexité spectrale dans le temps. Je vais émettre l'hypothèse que la parole humaine utilise probablement plus de phonèmes et avec une complexité statistique beaucoup plus grande dans leur séquençage que les séquences de phonèmes du ronflement.

C'est probablement un problème beaucoup plus facile que la reconnaissance vocale continue, car vous n'aurez pas besoin de reconnaître correctement un phonème ou une phrase particulière, seulement le nombre de segments spectraux qui sonnent au phonème, et une certaine mesure statistique de la complexité de leurs séquences (une entropie ou test de compressibilité peut fonctionner). Vérifiez ensuite si vous pouvez déterminer un seuil fiable pour ces mesures.


Le problème est que le ronflement est incroyablement complexe / aléatoire et manque beaucoup de caractéristiques distinctes lorsque son spectre est examiné.
Daniel R Hicks

Ce serait une information intéressante si une personne endormie formait autant de filtres et de plosifs formant des voyelles (et des digraphes et trigraphes de ceux-ci à une densité dans le temps), et des inflexions de hauteur (etc.), tout en dormant comme lorsqu'elle était éveillée et parlait.
hotpaw2

Le manque de fonctionnalités peut être une caractéristique importante. La parole a des fonctionnalités.
hotpaw2

Un problème est que le ronflement peut varier énormément, d'un souffle à l'autre. Une simple respiration lourde est très "blanche", mais un ronflement peut avoir des pointes très fortes. C'est essentiellement une onde carrée, bien que ce soit une simplification excessive. Et nous devons faire l'analyse en temps réel sur un téléphone intelligent, de sorte que la complexité de l'algorithme est limitée.
Daniel R Hicks
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.