Jak odróżnić głos od chrapania?

22

Tło: Pracuję nad aplikacją na iPhone'a (wspomnianą w kilku innych postach ), która „słucha” chrapania / oddychania, gdy ktoś śpi i określa, czy występują oznaki bezdechu sennego (jako wstępny ekran „laboratorium snu” testowanie). Aplikacja wykorzystuje przede wszystkim „różnicę widmową” do wykrywania chrapania / oddechów i działa całkiem dobrze (korelacja około 0,85-0,90) podczas testowania z nagraniami laboratoryjnymi podczas snu (które w rzeczywistości są dość głośne).

Problem: Większość hałasu „w sypialni” (wentylatory itp.) Mogę odfiltrować za pomocą kilku technik i często niezawodnie wykrywam oddech na poziomach S / N, gdzie ludzkie ucho nie może go wykryć. Problemem jest hałas głosu. Nie jest niczym niezwykłym, że w tle działa telewizor lub radio (lub po prostu ktoś mówi w oddali), a rytm głosu ściśle pasuje do oddychania / chrapania. W rzeczywistości przeprowadziłem nagranie zmarłego autora / gawędziarza Billa Holma za pośrednictwem aplikacji i było to w zasadzie nie do odróżnienia od chrapania w rytmie, zmienności poziomu i kilku innych miar. (Chociaż mogę powiedzieć, że najwyraźniej nie miał bezdechu sennego, przynajmniej nie będąc na jawie).

To trochę długa szansa (i prawdopodobnie szereg zasad na forum), ale szukam pomysłów na rozróżnianie głosu. Nie musimy jakoś odfiltrowywać chrapania (pomyślałoby, że to byłoby miłe), ale raczej potrzebujemy sposobu, aby odrzucić jako „zbyt głośny” dźwięk, który jest nadmiernie zanieczyszczony głosem.

Jakieś pomysły?

Pliki opublikowane: Umieściłem niektóre pliki na dropbox.com:

Pierwsza jest raczej przypadkowym utworem rockowym (jak sądzę), a druga to nagranie przemówienia zmarłego Billa Holma. Oba (które wykorzystuję jako moje próbki „szumu” w odróżnieniu od chrapania) zostały zmieszane z szumem w celu zaciemnienia sygnału. (To sprawia, że ​​zadanie ich zidentyfikowania jest znacznie trudniejsze.) Trzeci plik to dziesięć minut twojego nagrania, w którym pierwsza trzecia w większości oddycha, środkowa trzecia to mieszane oddychanie / chrapanie, a ostatnia trzecia to dość stałe chrapanie. (Kaszlesz po bonus.)

Wszystkie trzy pliki zostały przemianowane z „.wav” na „_wav.dat”, ponieważ wiele przeglądarek utrudnia pobieranie plików wav. Wystarczy zmienić nazwę z powrotem na „.wav” po pobraniu.

Aktualizacja: Myślałem, że entropia „robi to dla mnie”, ale okazało się, że były to przede wszystkim osobliwości przypadków testowych, których używałem, a także algorytm, który nie był zbyt dobrze zaprojektowany. W ogólnym przypadku entropia niewiele dla mnie robi.

Następnie wypróbowałem technikę, w której obliczam FFT (używając kilku różnych funkcji okna) ogólnej wielkości sygnału (próbowałem mocy, strumienia widmowego i kilku innych miar) próbkowanych około 8 razy na sekundę (biorąc statystyki z głównego cyklu FFT czyli co 1024/8000 sekund). Przy 1024 próbkach obejmuje to czas około dwóch minut. Miałem nadzieję, że będę w stanie dostrzec w tym wzorce ze względu na powolny rytm chrapania / oddychania kontra głos / muzyka (i że może to być również lepszy sposób na rozwiązanie problemu „ zmienności ”), ale chociaż istnieją wskazówki wzoru tu i tam, nie ma nic, na czym mógłbym się naprawdę zatrzasnąć.

( Dalsze informacje: W niektórych przypadkach FFT wielkości sygnału wytwarza bardzo wyraźny wzór z silnym pikiem przy około 0,2 Hz i harmonicznymi schodkowymi. Ale wzór nie jest prawie tak wyraźny przez większość czasu, a głos i muzyka mogą generować mniej wyraźne wersje o podobnym wzorze. Może istnieć jakiś sposób obliczenia wartości korelacji dla liczby zasług, ale wydaje się, że wymagałoby to dopasowania krzywej do wielomianu czwartego rzędu, a robienie tego raz na sekundę w telefonie wydaje się niepraktyczne.)

Próbowałem również wykonać tę samą FFT o średniej amplitudzie dla 5 pojedynczych „pasm”, na które podzieliłem widmo. Pasma to 4000-2000, 2000-1000, 1000-500 i 500-0. Wzorzec dla pierwszych 4 pasm był ogólnie podobny do ogólnego wzorca (chociaż nie było prawdziwego pasma „wyróżniającego się”, a często zanikająco mały sygnał w pasmach wyższych częstotliwości), ale pasmo 500-0 było po prostu losowe.

Bounty: Dam Nathanowi nagrodę, mimo że nie zaoferował nic nowego, biorąc pod uwagę, że była to jak dotąd najbardziej produktywna sugestia. Nadal mam kilka punktów, które chciałbym przyznać komuś innemu, jeśli wpadną one na dobre pomysły.

Daniel R. Hicks
źródło
2
Czy możesz opublikować reprezentatywne spektrogramy? (Niech dane mówią). Jak obliczasz „różnicę widmową”?
Emre
„Różnica widmowa” jest czasami określana jako „strumień widmowy” i kilka innych terminów. Zasadniczo jest to suma kwadratów indywidualnych różnic w kolejnych FFT dźwięku.
Daniel R Hicks,
2
Pomyśl o tym, klipy audio byłyby jeszcze lepsze. Dziękuję za wyjaśnienie.
Emre
Próbuję dowiedzieć się, jaka byłaby najlepsza prezentacja. Nie mam wyszukanego oprogramowania do wykonywania widm (innych niż moje rzeczywiste FFT) dla krótkich próbek - Audacity wymaga zbyt długiej próbki, aby uchwycić spektrum pojedynczego dźwięku. I są pewne problemy z prywatnością medyczną związane z publikowaniem rzeczywistych dźwięków pacjenta.
Daniel R Hicks,
1
@DanielRHicks Spektrogramy z TV + chrapanie i chrapanie lub coś w tym rodzaju naprawdę poszedłoby daleko.
Spacey,

Odpowiedzi:

10

tło

Zgodnie z poniższymi dokumentami chrapanie charakteryzuje się pikiem przy około 130 Hz i jest całkowicie skoncentrowane poniżej 12 kHz:

Zobaczmy, czy możemy to wykorzystać.

Przykład MATLAB

Mamy słabą rejestrację chrapania dziecka ; 10-minutowy, 8-bitowy plik WAV mono. Częstotliwość próbkowania wynosi 8 KHz, co oznacza, że ​​szerokość pasma sygnału audio wynosi 4K Hz. Poziom jest bardzo niski, więc zrobię to najpierw go opowiem .

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

Pełny spektrogram

Oś y jest znormalizowana do szerokości pasma, 4KHz, tak że wycięcie, które widzisz przy 0.1, odpowiada częstotliwości 400 Hz. Występuje skok odpowiadający kaszelowi w ~ 186s; zignoruj ​​to. Możemy słabo zobaczyć wycięcia podczas każdego chrapania. Co więcej, wydają się skoncentrowane poniżej 0,2 x 4KHz = 800Hz. Przyjrzyjmy się bliżej.

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

Powiększenie spektrogramu do 0–800 Hz.

Tym razem oś częstotliwości została oznaczona w hercach. Teraz wycięcia są dość wyraźne. Widzimy nawet podtony szumu linii energetycznej zaczynającego się od 60 Hz (180 Hz, 300 Hz, 420 Hz). Teraz jest istota algorytmu: sklasyfikujmy sygnał na podstawie energii w tym podzakresie, z usuniętym szumem linii.

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

Jeśli chcemy się zachwycić, możemy odrzucić zbyt duże skoki:

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

Wykres energii w karbowanym podzakresie 0–800 Hz

Wynik końcowy

Niski SNR, przejawiający się w trudnościach w rozpoznawaniu sygnału na pierwszym wykresie, oznacza, że ​​mamy swobodę wynoszącą tylko połowę standardowego odchylenia (którego wartość wynosiła 4,1). Pędy zaznaczają chrapanie.

Emre
źródło
Tak, mój obecny algorytm niweluje szum i inne szumy harmoniczne (hałas wentylatora zwykle wynosi około 110 Hz) przez wyzerowanie segmentów FFT, które są na mniej więcej stałym poziomie. Nie jestem pewien, co masz na myśli, mówiąc „klasyfikujmy sygnał na podstawie energii w tym podzakresie” - o jakim podzakresie chodzi?
Daniel R Hicks
Och, rozumiem, mówisz o częstotliwości poniżej 800 Hz - tego mi trochę brakowało.
Daniel R Hicks,
Jeśli spojrzysz na swój górny wykres, zobaczysz, że u góry jest sporo informacji, a inny zespół tuż poniżej środka. I te pasma mają znacznie mniej konkurencyjny hałas. Mój obecny schemat wycina widmo i próbuje ocenić SNR każdego wycinka, a następnie odpowiednio je wyważa.
Daniel R Hicks,
Można połączyć kilka cech, takich jak energia w wybranych podpasmach, płaskość spektralna itd., Aby utworzyć wstępny wektor cech. Następnie wykonaj PCA, aby dowiedzieć się, które z nich są najważniejsze, jak wyjaśniono w ostatnim artykule.
Emre,
Zasadniczo to robię bez rygoru PCA.
Daniel R Hicks
9

Po prostu wrzucając to tutaj, aby uwzględnić wszystkie możliwości, możesz być w stanie użyć entropii, nie wiem, jaki jest poziom entropii chrapania w porównaniu do mowy, ale jeśli jest wystarczająco inny, to może działać. http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf

Dzień Nathana
źródło
Nie do końca rozumiem, co z tym robię (teoria informacji powoduje wybuch mojej głowy), ale wdrożyłem prymitywną kalkulację entropii, wprowadziłem trochę całkowicie nieoretyczną normalizację i wydaje się, że działa. Muzyka i głos mają niską (ujemną) entropię, podczas gdy chrapanie jest znacznie wyższe. A hałas w tle wydaje się zmniejszać (ujemną) wartość, więc zapewnia całkiem niezłą wartość. Potrzebne są jednak dalsze eksperymenty.
Daniel R Hicks
Jedną rzeczą, na którą należy uważać, jest również dołączenie prostej bramki poziomu, ponieważ możesz mieć wyjątkowo niski poziom szumu wstecznego, który może pasować do rzeczy, które próbujesz przepuścić, również moje doświadczenie wydaje się sugerować kwantyzację cyfr ekstremalnie niski poziom szumu może zwiększyć mniej więcej porządek w sygnale, ponieważ przy niskich poziomach istnieje zmniejszona liczba możliwych wartości próbek, a sama entropia nie uwzględnia różnic w amplitudzie.
Nathan Day
Tak, regularnie walczę z hałasem i mam całkiem niezły sposób na osobną ocenę tego. Kiedy hałas przekracza pewien poziom, wybijam się. (W rzeczywistości jest niezwykle trudno zmierzyć hałas.)
Daniel R Hicks,
Niestety, odkryłem, że wiele z tego, co mierzyłem przy użyciu mojego surowego obliczenia entropii, było artefaktem obliczeń (z powodu zer w danych testowych). To trochę działa na moją potrzebę, ale nie tak ładnie, jak myślałem.
Daniel R Hicks
Dalsze działania: zastąpiłem stały / zmiennoprzecinkowy FFT, którego używałem, pełnym zmiennoprzecinkowym (który nie wytwarza zer, gdy poziomy są niskie), a przydatność entropii poszła dalej w dół rur - nie wydają się zapewniać coś szczególnie przydatnego.
Daniel R Hicks
3

Może statystyki w dziedzinie czasu? Chrapanie wydaje się mieć względnie długie okresy stanu ustalonego, podczas gdy energia mowy zmienia się dość szybko w krótkich okresach czasu. Można to również połączyć z analizą spektralną. Samogłoski mają więcej niskich częstotliwości, a spółgłosek więcej wysokich częstotliwości. Podczas mowy widmo może szybko odbijać się między tymi stanami, a przechowywanie może pozostawać w jednym stanie przez dłuższy czas.

Hilmar
źródło
Podstawowe statystyki w dziedzinie czasu są nierozróżnialne. Warto jednak spojrzeć na zmienność krótkoterminową (którą normalnie wygładzam). Dobrym pomysłem jest również szukanie „odbijania” między pasmami częstotliwości ... Obecnie dzielę na 5 pasm i odrzucam pasma z pozornie niską S / N.
Daniel R Hicks,
@DanielRHicks Widziałem, jak obliczyć cepstralną obwiednię gdzie indziej, ale być może możesz użyć tego jako miary zmienności widmowej zamiast czystego spektrum, które będzie bardziej „głośne / poszarpane”, podczas gdy cepstrum (y) wydają mi się bardziej gładkie . Słyszałem również, że cepstrum o częstotliwości Mel jest używane w rozpoznawaniu głosu, a to brzmi jak dla mnie przydatne.
Spacey,
@DanielRHicks: Nie do odróżnienia, jaką metodą? Z pewnością są dla mnie rozpoznawalne.
endolith,
@endolith - Nie do odróżnienia, biorąc pod uwagę moje obecne wskaźniki - „różnicę widmową” plus ogólny poziom energii. Ale są one filtrowane dolnoprzepustowo ze stałą czasową około 0,5 sekundy. Myślę, że spróbuję trochę przyjrzeć się niefiltrowanym danym.
Daniel R Hicks
Próbowałem uchwycić krótkoterminowe statystyki czasu. Niektóre „wskazówki”, ale nic ostatecznego.
Daniel R Hicks
1

Złożoność spektralna w czasie. Postawię hipotezę, że ludzka mowa prawdopodobnie używa więcej fonemów i ze znacznie większą złożonością statystyczną w ich sekwencjonowaniu niż sekwencje fonemów chrapania.

Jest to prawdopodobnie o wiele łatwiejszy problem niż ciągłe rozpoznawanie mowy, ponieważ nie trzeba właściwie rozpoznawać żadnego konkretnego fonemu lub zdania, tylko liczbę segmentów widmowych sondujących fonem i pewną statystyczną miarę złożoności ich sekwencji (entropia lub test ściśliwości może działać). Sprawdź, czy możesz ustalić wiarygodny próg dla tych środków.

hotpaw2
źródło
Problem polega na tym, że chrapanie jest niezwykle złożone / losowe i nie ma wielu wyraźnych cech podczas badania jego spektrum.
Daniel R Hicks
Byłoby interesującą informacją, jeśli śpiący uformowałby tyle różnych filtrów i plosive formentów samogłoskowych (oraz digrafów i trigrafów o takiej gęstości z upływem czasu), a także fleksję tonów (itp.) Podczas snu, gdy nie śpi i rozmawia.
hotpaw2
Brak funkcji może być znaczącą cechą. Mowa ma funkcje.
hotpaw2
Jednym z problemów jest to, że chrapanie może się znacznie różnić w zależności od oddechu. Prosty ciężki oddech jest bardzo „biały”, ale chrapanie może mieć bardzo silne kolce. Zasadniczo jest to fala prostokątna, ale to nadmierne uproszczenie. I musimy przeprowadzić analizę w czasie rzeczywistym na smartfonie, aby złożoność algorytmu była ograniczona.
Daniel R Hicks