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.
la source
Réponses:
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.
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.
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.
Si nous voulons devenir fantaisistes, nous pouvons éliminer les pointes surdimensionnées:
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.
la source
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
la source
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.
la source
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.
la source