Wie kann man Stimme von Schnarchen unterscheiden?


22

Hintergrund: Ich arbeite an einer iPhone-Anwendung (auf die in mehreren anderen Posts hingewiesen wird ), die während des Schlafens Schnarchen / Atmen "abhört" und feststellt, ob Anzeichen von Schlafapnoe vorliegen (als Vorbild für "Schlaflabor"). testen). Die Anwendung verwendet hauptsächlich "Spektraldifferenzen" zur Erkennung von Schnarchen / Atemzügen und funktioniert recht gut (Korrelation zwischen ca. 0,85 und 0,90), wenn sie mit Aufnahmen aus dem Schlaflabor verglichen wird (die tatsächlich ziemlich laut sind).

Problem: Das meiste "Schlafzimmer" -Geräusch (Ventilatoren usw.) kann ich durch verschiedene Techniken herausfiltern und kann Atmung bei S / N-Pegeln, bei denen das menschliche Ohr sie nicht erkennen kann, oft zuverlässig erkennen. Das Problem ist das Sprachrauschen. Es ist nicht ungewöhnlich, dass ein Fernseher oder ein Radio im Hintergrund läuft (oder einfach jemand in der Ferne spricht), und der Rhythmus der Stimme passt genau zum Atmen / Schnarchen. Tatsächlich habe ich eine Aufnahme des verstorbenen Autors / Geschichtenerzählers Bill Holm über die App abgespielt, und es war im Wesentlichen nicht zu unterscheiden von Schnarchen in Bezug auf Rhythmus, Pegelvariabilität und verschiedenen anderen Maßnahmen. (Obwohl ich sagen kann, dass er anscheinend keine Schlafapnoe hatte, zumindest nicht wach.)

Das ist also ein bisschen langwierig (und wahrscheinlich ein Teil der Forenregeln), aber ich suche nach Ideen, wie man die Stimme unterscheidet. Wir müssen das Schnarchen nicht irgendwie herausfiltern (dachte, das wäre schön), sondern wir müssen nur einen Weg finden, um Geräusche als "zu laut" abzulehnen, die übermäßig mit Sprache verschmutzt sind.

Irgendwelche Ideen?

Veröffentlichte Dateien: Ich habe einige Dateien auf dropbox.com platziert:

Das erste ist ein eher zufälliges Stück Rockmusik (ich denke), und das zweite ist eine Aufnahme des verstorbenen Bill Holm. Beide (die ich als Beispiel für "Rauschen" verwende, um von Schnarchen zu unterscheiden) wurden mit Rauschen gemischt, um das Signal irgendwie zu verschleiern. (Dies erschwert die Identifizierung erheblich.) Bei der dritten Datei handelt es sich um eine zehnminütige Aufzeichnung von Ihrer Person, bei der das erste Drittel hauptsächlich atmet, das mittlere Drittel gemischt atmet / schnarcht und das letzte Drittel ziemlich gleichmäßig schnarcht. (Sie bekommen einen Husten als Bonus.)

Alle drei Dateien wurden von ".wav" in "_wav.dat" umbenannt, da viele Browser das Herunterladen von WAV-Dateien erschweren. Benennen Sie sie nach dem Herunterladen einfach wieder in ".wav" um.

Update: Ich dachte, Entropie würde für mich "den Trick machen", aber es stellte sich heraus, dass es sich hauptsächlich um Besonderheiten der von mir verwendeten Testfälle handelte, sowie um einen Algorithmus, der nicht allzu gut konzipiert war. Im Allgemeinen tut die Entropie sehr wenig für mich.

Anschließend habe ich eine Technik ausprobiert, bei der ich die FFT (unter Verwendung mehrerer verschiedener Fensterfunktionen) der Gesamtsignalgröße (ich habe Leistung, Spektralfluss und mehrere andere Messwerte ausprobiert) berechnet, die ungefähr 8 Mal pro Sekunde abgetastet wurde (wobei die Statistiken aus dem Haupt-FFT-Zyklus entnommen wurden) das ist alle 1024/8000 Sekunden). Bei 1024 Stichproben deckt dies einen Zeitbereich von etwa zwei Minuten ab. Ich hatte gehofft, dass ich aufgrund des langsamen Rhythmus von Schnarchen / Atmen vs. Stimme / Musik Muster darin erkennen kann (und dass es auch eine bessere Möglichkeit ist, das Problem der " Variabilität " anzugehen ), aber es gibt Hinweise Von einem Muster gibt es hier und da nichts, woran ich mich wirklich festhalten kann.

( Weitere Informationen: In einigen Fällen erzeugt die FFT der Signalgröße ein sehr ausgeprägtes Muster mit einer starken Spitze bei etwa 0,2 Hz und Oberschwingungen im Gleichschritt. Das Muster ist jedoch die meiste Zeit nicht annähernd so ausgeprägt, und Stimme und Musik können weniger ausgeprägt sein Versionen eines ähnlichen Musters. Es könnte eine Möglichkeit geben, einen Korrelationswert für eine Gütezahl zu berechnen, aber es scheint, dass eine Kurvenanpassung auf ein Polynom 4. Ordnung erforderlich ist, und dies einmal pro Sekunde in einem Telefon zu tun, erscheint unpraktisch.)

Ich habe auch versucht, die gleiche FFT der durchschnittlichen Amplitude für die 5 einzelnen "Bänder" zu machen, in die ich das Spektrum unterteilt habe. Die Bänder sind 4000-2000, 2000-1000, 1000-500 und 500-0. Das Muster für die ersten 4 Bänder war im Allgemeinen dem Gesamtmuster ähnlich (obwohl es kein echtes "herausragendes" Band gab und in den höheren Frequenzbändern häufig ein verschwindend kleines Signal), aber das 500-0-Band war im Allgemeinen nur zufällig.

Kopfgeld: Ich werde Nathan das Kopfgeld geben, obwohl er nichts Neues angeboten hat, da dies der produktivste Vorschlag war, den es bisher gab. Ich habe noch ein paar Punkte, die ich gerne an andere vergeben würde, wenn sie gute Ideen hätten.


2
Können Sie einige repräsentative Spektrogramme posten? (Lassen Sie die Daten sprechen.) Wie berechnen Sie den "spektralen Unterschied"?
Emre

Der "spektrale Unterschied" wird manchmal als "spektraler Fluss" und einige andere Ausdrücke bezeichnet. Grundsätzlich ist es die Summe der Quadrate der einzelnen Unterschiede in aufeinanderfolgenden FFTs des Klangs.
Daniel R Hicks

2
Kommen Sie und denken Sie darüber nach, Audioclips wären noch besser. Danke für die Klarstellung.
Emre

Ich versuche herauszufinden, was die beste Präsentation sein würde. Ich habe keine ausgefallene Software, um Spektren (anders als meine eigentlichen FFTs) für kurze Samples zu erstellen. Audacity benötigt zu lange Samples, um das Spektrum eines einzelnen Sounds zu erfassen. Und es gibt einige Datenschutzprobleme beim Posten tatsächlicher Patientensounds.
Daniel R Hicks

1
@DanielRHicks Spektren mit TV + Schnarchen und nur Schnarchen oder so etwas würde wirklich viel bewirken.
Spacey

Antworten:


10

Hintergrund

Nach den nachstehenden Veröffentlichungen ist das Schnarchen durch einen Peak bei etwa 130 Hz gekennzeichnet und vollständig auf unter 12 kHz konzentriert:

Mal sehen, ob wir das nutzen können.

MATLAB Beispiel

Wir haben eine schlechte Aufzeichnung eines schnarchenden Kindes ; eine 10-minütige 8-Bit-Mono-WAV-Datei. Die Abtastrate beträgt 8 kHz, was bedeutet, dass die Bandbreite des Audiosignals 4 kHz beträgt. Das Level ist sehr niedrig, also werde ich es zuerst kompandieren .

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

Vollständiges Spektrogramm

Die y-Achse ist auf die Bandbreite von 4 kHz normiert, sodass die bei 0,1 angezeigte Kerbe einer Frequenz von 400 Hz entspricht. Es gibt eine Spitze, die einem Husten bei ~ 186s entspricht; ignoriere das. Wir können die Kerben bei jedem Schnarchen vage sehen. Darüber hinaus scheinen sie unter 0,2 x 4 kHz = 800 Hz konzentriert zu sein. Lass uns genauer hinschauen.

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 des Spektrogramms auf 0-800Hz.

Diesmal wurde die Frequenzachse in Hertz angegeben. Jetzt sind die Kerben ganz klar. Wir können sogar die Obertöne des Stromleitungsrauschens ab 60 Hz (180 Hz, 300 Hz, 420 Hz) erkennen. Nun kommt das Wesentliche des Algorithmus: Lassen Sie uns das Signal anhand der Energie in diesem Teilband klassifizieren, wobei das Leitungsrauschen entfernt wird.

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

Wenn wir Lust haben, können wir übergroße Spikes wegwerfen:

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

Auftragung der Energie im gekerbten Teilband 0-800Hz

Das Endergebnis

Das niedrige SNR, das sich in der Schwierigkeit äußert, das Signal im ersten Diagramm zu erkennen, bedeutet, dass wir nur einen Spielraum von einer halben Standardabweichung haben (deren Wert 4,1 betrug). Die Stiele markieren das Schnarchen.


Ja, mein aktueller Algorithmus löscht Brummen und andere harmonische Geräusche (das Geräusch des Beatmungsgeräts liegt in der Regel bei 110 Hz), indem die FFT-Buckets, die sich auf einem mehr oder weniger konstanten Pegel befinden, auf Null gesetzt werden. Mir ist nicht klar, was Sie meinen, wenn Sie sagen: "Lassen Sie uns das Signal anhand der Energie in diesem Teilband klassifizieren" - auf welches Teilband beziehen Sie sich?
Daniel R Hicks

Oh, ich verstehe, Sie sprechen von unter 800 Hz - ich habe das ein bisschen verpasst.
Daniel R Hicks

Wenn Sie sich Ihr oberes Diagramm ansehen, werden Sie feststellen, dass oben eine ganze Reihe von Informationen zu finden sind und dass sich eine weitere Band knapp unterhalb der Mitte befindet. Und diese Bands haben viel weniger Konkurrenzlärm. Mein aktuelles Schema schneidet das Spektrum und versucht, das SNR jeder Schicht zu bewerten, und gewichtet sie dann entsprechend.
Daniel R Hicks

Sie können mehrere Merkmale verketten, z. B. die Energie in ausgewählten Teilbändern, die spektrale Ebenheit usw., um einen vorläufigen Merkmalsvektor zu erstellen. Führen Sie dann eine PCA durch, um herauszufinden, welche am wichtigsten sind, wie im letzten Artikel erläutert.
Emre

Das ist im Grunde, was ich tue, abgesehen von der Strenge der PCA.
Daniel R Hicks

9

Wenn Sie dies hier reinwerfen, um alle Möglichkeiten abzudecken, können Sie möglicherweise Entropie verwenden. Ich weiß nicht, wie hoch die Entropie zwischen Schnarchen und Sprache ist. http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf


Ich verstehe nicht ganz, was ich damit mache (die Informationstheorie lässt meinen Kopf explodieren), aber ich habe eine grobe Entropieberechnung implementiert, etwas völlig nicht-theoretische Normalisierung eingeführt, und es scheint zu funktionieren. Musik und Stimme haben eine niedrige (negative) Entropie, während das Schnarchen deutlich höher ist. Und Hintergrundgeräusche scheinen im Allgemeinen den (negativen) Wert zu verringern, so dass sie eine ziemlich gute Gütezahl liefern. Es sind jedoch weitere Experimente erforderlich.
Daniel R Hicks

Eine Sache, auf die Sie achten sollten, ist, dass Sie auch ein einfaches Level-Gate einbinden müssen, da Sie extrem leises Back-Noise haben können, das möglicherweise zu dem passt, was Sie durchlassen möchten Rauschen mit extrem niedrigem Pegel kann die Ordnung des Signals erhöhen, da bei niedrigen Pegeln die Anzahl der möglichen Abtastwerte verringert ist und die Entropie allein keine Amplitudenunterschiede berücksichtigt.
Nathan Day

Ja, ich kämpfe regelmäßig mit Lärm und habe eine ziemlich gute Möglichkeit, das getrennt zu messen. Wenn der Lärm einen bestimmten Pegel überschreitet, stochere ich. (Es ist erstaunlich schwierig, Lärm zu messen.)
Daniel R Hicks

Leider habe ich festgestellt, dass vieles, was ich mit meiner Rohentropieberechnung gemessen habe, ein Artefakt der Berechnung war (aufgrund von Nullen in den Testdaten). Es funktioniert irgendwie für meine Bedürfnisse, aber nicht so gut, wie ich zuerst gedacht habe.
Daniel R Hicks

Follow-up: Ich habe die feste / float-FFT, die ich verwendet habe, durch eine volle Fließkomma-FFT ersetzt (die bei niedrigen Pegeln keine Nullen erzeugt), und die Nützlichkeit der Entropie hat sich in den Röhren weiter verbessert - nicht scheinen etwas besonders Nützliches zu bieten.
Daniel R Hicks

3

Zeitbereichsstatistik vielleicht? Das Schnarchen scheint relativ lange Perioden des Gleichgewichtszustands zu haben, während sich die Sprachenergie über kurze Zeiträume ziemlich stark ändert. Dies könnte auch mit einer Spektralanalyse kombiniert werden. Vokale haben mehr niederfrequente Inhalte und Konsonanten mehr hochfrequente. Während des Sprechens kann das Spektrum schnell zwischen diesen Zuständen hin und her springen, während das Speichern für längere Zeiträume in einem Zustand verbleibt.


Die grundlegenden Zeitbereichsstatistiken sind nicht zu unterscheiden. Es ist jedoch ein guter Punkt, dass ich mir die kurzfristige Variabilität ansehen kann (die ich normalerweise ausglätte). Es ist auch eine gute Idee, nach dem "Prellen" zwischen den Frequenzbändern zu suchen ... Ich teile mich derzeit in 5 Bänder auf und lehne Bänder mit scheinbar niedrigem Rauschabstand ab.
Daniel R Hicks

@DanielRHicks Ich habe irgendwo anders gesehen, wie man die Cepstralhüllkurve berechnet , aber vielleicht können Sie dies als Maß für Ihre spektrale Variabilität verwenden, anstatt des reinen Spektrums, das mehr "verrauscht / gezackt" ist, wohingegen das Cepstrum (die Cepstren) zu meiner Glätte tendieren . Ich habe auch gehört, dass Mel-Frequency Cepstrum für die Spracherkennung verwendet wird, und das klingt, als könnte es für Sie von Nutzen sein.
Spacey

@DanielRHicks: Nach welcher Methode nicht zu unterscheiden? Sie sind auf jeden Fall für mich unterscheidbar.
Endolith

@endolith - In Anbetracht meiner aktuellen Messdaten nicht zu unterscheiden - der "Spektraldifferenz" plus Gesamtenergieniveau. Sie werden jedoch mit einer Zeitkonstante von etwa 0,5 Sekunden tiefpassgefiltert. Ich denke, ich werde versuchen, die ungefilterten Daten ein wenig anzusehen.
Daniel R Hicks

Ich habe versucht, die Kurzzeitstatistiken zu erfassen. Einige "Hinweise", aber nichts Bestimmtes.
Daniel R Hicks

1

Spektrale Komplexität im Zeitverlauf. Ich gehe davon aus, dass die menschliche Sprache wahrscheinlich mehr Phoneme verwendet und ihre Sequenzierung statistisch weitaus komplexer ist als die Phonemsequenzen des Schnarchens.

Dies ist wahrscheinlich ein viel einfacheres Problem als die kontinuierliche Spracherkennung, da Sie nicht unbedingt ein bestimmtes Phonem oder einen bestimmten Satz richtig erkennen müssen, sondern nur die Anzahl der phonemklingenden Spektralsegmente und ein statistisches Maß für die Komplexität ihrer Sequenzen (Entropie oder Entropie) Kompressibilitätstest funktioniert möglicherweise). Prüfen Sie dann, ob Sie einen zuverlässigen Schwellenwert für diese Maßnahmen ermitteln können.


Das Problem ist, dass das Schnarchen erstaunlich komplex / zufällig ist und es bei der Untersuchung seines Spektrums an eindeutigen Merkmalen mangelt.
Daniel R Hicks

Es wäre eine interessante Information, wenn eine schlafende Person so viele verschiedene Vokalfilter und -plastiken (und Digraphen und Trigraphen mit einer solchen Dichte im Laufe der Zeit) und Tonhöhenbeugungen (usw.) bilden würde, während sie schläft wie wenn sie wach ist und spricht.
Hotpaw2

Das Fehlen von Funktionen kann ein wesentliches Merkmal sein. Sprache hat Funktionen.
Hotpaw2

Ein Problem ist, dass das Schnarchen von Atemzug zu Atemzug sehr unterschiedlich sein kann. Ein einfacher schwerer Atemzug ist sehr "weiß", aber ein Schnarchen kann einige sehr starke Spitzen haben. Es ist im Wesentlichen eine Rechteckwelle, obwohl dies eine übermäßige Vereinfachung darstellt. Und wir müssen die Analyse in Echtzeit auf einem Smartphone durchführen, damit die Komplexität des Algorithmus begrenzt ist.
Daniel R Hicks
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.