Come distinguere la voce dal russare?


22

Background: sto lavorando ad un'applicazione per iPhone (citata in molti altri post ) che "ascolta" russare / respirare mentre si dorme e determina se ci sono segni di apnea notturna (come pre-schermo per "sleep lab" test). L'applicazione utilizza principalmente la "differenza spettrale" per rilevare russamenti / respiri e funziona abbastanza bene (circa 0,85-0-0,90 correlazione) quando testata contro le registrazioni del laboratorio del sonno (che in realtà sono piuttosto rumorose).

Problema: la maggior parte del rumore della "camera da letto" (ventole, ecc.) Posso filtrare attraverso diverse tecniche e spesso rilevare in modo affidabile la respirazione a livelli S / N dove l'orecchio umano non è in grado di rilevarlo. Il problema è il rumore della voce. Non è insolito avere una televisione o una radio in esecuzione in sottofondo (o semplicemente avere qualcuno che parla in lontananza), e il ritmo della voce è strettamente correlato alla respirazione / al russare. In effetti, ho eseguito una registrazione del compianto autore / narratore Bill Holm attraverso l'app ed era essenzialmente indistinguibile dal russare in ritmo, variabilità di livello e diverse altre misure. (Anche se posso dire che a quanto pare non aveva apnea notturna, almeno non da sveglio.)

Quindi questo è un po 'lungo (e probabilmente un tratto delle regole del forum), ma sto cercando alcune idee su come distinguere la voce. Non abbiamo bisogno di filtrare i russamenti in qualche modo (pensato che sarebbe bello), ma piuttosto abbiamo solo bisogno di un modo per rifiutare come suono "troppo rumoroso" che è eccessivamente inquinato dalla voce.

Qualche idea?

File pubblicati: ho inserito alcuni file su dropbox.com:

Il primo è un pezzo piuttosto casuale di musica rock (immagino), e il secondo è una registrazione del defunto discorso di Bill Holm. Entrambi (che uso come campioni di "rumore" differenziati dal russare) sono stati mescolati con il rumore per offuscare il segnale. (Questo rende il compito di identificarli significativamente più difficili.) Il terzo file è dieci minuti di una registrazione del tuo veramente dove il primo terzo sta respirando principalmente, il terzo medio è il respiro / russamento misto, e il terzo finale è russare abbastanza costante. (Ottieni un colpo di tosse per un bonus.)

Tutti e tre i file sono stati rinominati da ".wav" a "_wav.dat", poiché molti browser rendono incredibilmente difficile scaricare file wav. Basta rinominarli in ".wav" dopo il download.

Aggiornamento: ho pensato che l'entropia stesse "facendo il trucco" per me, ma si è rivelato principalmente una peculiarità dei casi di test che stavo usando, oltre a un algoritmo che non era troppo ben progettato. Nel caso generale l'entropia sta facendo molto poco per me.

Successivamente ho provato una tecnica in cui ho calcolato l'FFT (usando diverse funzioni della finestra) dell'entità del segnale generale (ho provato potenza, flusso spettrale e diverse altre misure) campionata circa 8 volte al secondo (prendendo le statistiche dal ciclo FFT principale che è ogni 1024/8000 secondi). Con 1024 campioni questo copre un intervallo di tempo di circa due minuti. Speravo di riuscire a vedere gli schemi in questo a causa del ritmo lento del russare / respirare contro la voce / la musica (e che potrebbe anche essere un modo migliore per affrontare il problema della " variabilità "), ma mentre ci sono suggerimenti di uno schema qua e là, non c'è nulla su cui possa davvero aggrapparmi.

( Ulteriori informazioni: in alcuni casi la FFT della grandezza del segnale produce un pattern molto distinto con un picco forte a circa 0,2 Hz e armoniche a gradini. Ma il pattern non è quasi così distinto per la maggior parte del tempo e la voce e la musica possono generare meno distinti versioni di un modello simile. Potrebbe esserci un modo per calcolare un valore di correlazione per una figura di merito, ma sembra che richiederebbe un adattamento della curva a circa un polinomio del 4 ° ordine, e farlo una volta al secondo in un telefono sembra poco pratico.)

Ho anche provato a fare lo stesso FFT di ampiezza media per le 5 singole "bande" in cui ho diviso lo spettro. Le bande sono 4000-2000, 2000-1000, 1000-500 e 500-0. Il modello per le prime 4 bande era generalmente simile al modello generale (sebbene non ci fosse una vera banda "spiccata" e spesso un segnale evanescente nelle bande di frequenza più alte), ma la banda 500-0 era generalmente casuale.

Bounty: Darò a Nathan la generosità, anche se non ha offerto nulla di nuovo, dato che il suo è stato il suggerimento più produttivo fino ad oggi. Ho ancora alcuni punti che sarei disposto a assegnare a qualcun altro, però, se avessero trovato delle buone idee.


2
Puoi pubblicare alcuni spettrogrammi rappresentativi? (Lascia parlare i dati.) Come stai calcolando la "differenza spettrale"?
Emre,

La "differenza spettrale" viene talvolta definita "flusso spettrale" e pochi altri termini. Fondamentalmente è la somma dei quadrati delle differenze individuali nelle successive FFT del suono.
Daniel R Hicks,

2
Vieni a pensarci bene, le clip audio sarebbero ancora meglio. Grazie per il chiarimento.
Emre,

Sto cercando di capire quale sarebbe la migliore presentazione. Non ho software sofisticati per fare spettri (diversi dai miei FFT effettivi) per brevi campioni - Audacity richiede un campione troppo lungo per catturare lo spettro di un singolo suono. E ci sono alcuni problemi di privacy medica con la pubblicazione dei suoni reali dei pazienti.
Daniel R Hicks il

1
@DanielRHicks Spettrogrammi con TV + russare e solo russare o qualcosa del genere farebbe molto.
Spacey,

Risposte:


10

sfondo

Secondo i documenti di seguito, il russare è caratterizzato da un picco a circa 130Hz ed è interamente concentrato al di sotto di 12kHz:

Vediamo se possiamo sfruttare questo.

Esempio MATLAB

Abbiamo una scarsa registrazione di un bambino che russa ; un file WAV mono di 10 minuti e 8 bit. La frequenza di campionamento è 8KHz, il che significa che la larghezza di banda del segnale audio è 4KHz. Il livello è molto basso, quindi lo chiederò per primo.

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

Spettrogramma completo

L'asse y è normalizzato alla larghezza di banda, 4KHz, quindi quella tacca che vedi a 0.1 corrisponde a una frequenza di 400Hz. C'è un picco corrispondente a una tosse a ~ 186s; ignoralo. Possiamo vagamente vedere le tacche durante ogni russare. Non solo, ma sembrano concentrati al di sotto di 0,2 x 4KHz = 800Hz. Diamo un'occhiata più da vicino.

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 dello spettrogramma su 0-800Hz.

Questa volta l'asse della frequenza è stato etichettato in Hertz. Ora le tacche sono abbastanza chiare. Possiamo persino vedere le sfumature del rumore della linea di alimentazione che iniziano a 60Hz (180Hz, 300Hz, 420Hz). Ora arriva l'essenza dell'algoritmo: classifichiamo il segnale in base all'energia in questo sotto-marchio, con il rumore di linea rimosso.

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

Se vogliamo essere fantasiosi, possiamo scartare picchi di grandi dimensioni:

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

Tracciamento dell'energia nella sottobanda dentellata 0-800Hz

Il risultato finale

Il basso SNR, che si manifesta nella difficoltà di discernere il segnale nel primo diagramma, significa che abbiamo un margine di manovra solo per metà di una deviazione standard (il cui valore era 4.1). Gli steli segnano il russare.


Sì, il mio attuale algoritmo annulla il ronzio e altri rumori armonici (il rumore del ventilatore tende a circa 110Hz) azzerando i bucket FFT a un livello più o meno costante. Non sono chiaro cosa intendi quando dici "classifichiamo il segnale in base all'energia in questo sotto-marchio" - a quale sottoband ti riferisci?
Daniel R Hicks,

Oh, vedo, stai parlando sotto gli 800 Hz - mi mancava quel pezzetto.
Daniel R Hicks,

Se guardi il grafico in alto vedrai che ci sono un bel po 'di informazioni nella parte superiore e un'altra banda appena sotto la metà. E queste bande hanno molto meno rumore della concorrenza. Il mio schema attuale suddivide lo spettro e tenta di valutare il SNR di ogni sezione, quindi li pondera di conseguenza.
Daniel R Hicks,

È possibile concatenare diverse funzioni, ad esempio l'energia in sottofondi selezionati, la planarità spettrale e così via per creare un vettore di caratteristiche provvisorio. Quindi esegui PCA per scoprire quali contano di più, come spiegato nell'ultimo documento.
Emre,

Questo è fondamentalmente quello che sto facendo, senza il rigore del PCA.
Daniel R Hicks,

9

Basta buttarlo qui per coprire tutte le possibilità, potresti essere in grado di usare l'entropia, non so quale sia il livello di entropia del russare contro il discorso, ma se è abbastanza diverso potrebbe funzionare. http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf


Non capisco perfettamente cosa ci sto facendo (la teoria dell'informazione mi fa esplodere la testa), ma ho implementato un rozzo calcolo dell'entropia, ho lanciato un po 'di normalizzazione totalmente non teorica e sembra funzionare. La musica e la voce hanno un'entropia (negativa) bassa, mentre il russare è significativamente più alto. E il rumore di fondo in generale sembra diminuire il valore (negativo), quindi fornisce una buona cifra di merito. Sono tuttavia necessarie ulteriori sperimentazioni.
Daniel R Hicks,

Una cosa da fare attenzione è che devi anche includere un semplice gate di livello, poiché puoi avere un rumore di fondo di livello estremamente basso che potrebbe corrispondere a quello che stai cercando di far passare, anche la mia esperienza sembra suggerire la quantizzazione delle cifre di rumore di livello estremamente basso può aumentare il livello di ordine nel segnale, poiché a livelli bassi vi è un numero ridotto di possibili valori di campionamento e l'entropia da sola non considera le differenze di ampiezza.
Nathan Day

Sì, faccio regolarmente battaglie con il rumore e ho un buon modo per valutarlo separatamente. Quando il rumore supera un certo livello, punt. (In realtà è incredibilmente difficile misurare il rumore.)
Daniel R Hicks

Ahimè, ho scoperto che gran parte di ciò che stavo misurando con il mio calcolo dell'entropia grezza era un artefatto del calcolo (a causa di zeri nei dati del test). Funziona in qualche modo per le mie necessità, ma non come pensavo inizialmente.
Daniel R Hicks,

Follow-up: ho sostituito il FFT fisso / float che avrei usato con uno a virgola mobile completo (che non produce zeri quando i livelli sono bassi) e l'utilità dell'entropia è andata più in basso nei tubi - no sembra fornire qualcosa di particolarmente utile.
Daniel R Hicks,

3

Forse le statistiche del dominio del tempo? Il russare sembra avere periodi relativamente lunghi di stato stazionario mentre l'energia del parlato cambia un po 'in brevi periodi di tempo. Ciò potrebbe essere combinato anche con l'analisi spettrale. Le vocali hanno un contenuto più a bassa frequenza e le consonanti a frequenze più alte. Durante il parlato lo spettro può rimbalzare rapidamente avanti e indietro tra quegli stati mentre la memorizzazione può rimanere in uno stato per periodi di tempo più lunghi.


Le statistiche di base nel dominio del tempo sono indistinguibili. Tuttavia, è un buon punto che potrei esaminare la variabilità a breve termine (che normalmente appianare). Anche la ricerca del "rimbalzo" tra le bande di frequenza è una buona idea ... Attualmente divido in 5 bande e rifiuto le bande con apparente basso S / N.
Daniel R Hicks,

@DanielRHicks Ho visto come calcolare da qualche altra parte l' involucro del ceppo , ma forse puoi usarlo come misura della tua variabilità spettrale anziché dello spettro puro che sarà più "rumoroso / nervoso" mentre il (i) ceppo tenderà a me più liscio . Ho anche sentito che il ceppo a Mel-Frequency è usato nel riconoscimento vocale, e sembra che possa esserti utile.
Spacey,

@DanielRHicks: indistinguibile con quale metodo? Sono certamente distinguibili per me.
endolito il

@endolith - Indistinguibile date le mie attuali metriche - la "differenza spettrale" più il livello generale di energia. Ma sono filtrati passa-basso con una costante temporale di circa 0,5 secondi. Penso che proverò a guardare un po 'i dati non filtrati.
Daniel R Hicks,

Ho provato a catturare le statistiche di breve durata. Alcuni "suggerimenti", ma niente di definitivo.
Daniel R Hicks,

1

Complessità spettrale nel tempo. Ipotizzerò che il linguaggio umano probabilmente utilizza più fonemi e con una complessità statistica molto maggiore nel loro sequenziamento rispetto alle sequenze di fonemi del russare.

Questo è probabilmente un problema molto più semplice del riconoscimento vocale continuo, poiché non sarà necessario riconoscere correttamente un particolare fonema o frase correttamente, solo il numero di segmenti spettrali che suonano fonemi e una misura della complessità statistica delle loro sequenze (un'entropia o test di compressibilità potrebbe funzionare). Quindi vedi se riesci a determinare una soglia affidabile per queste misure.


Il problema è che il russare è incredibilmente complesso / casuale e manca molto in termini di caratteristiche distinte quando viene esaminato il suo spettro.
Daniel R Hicks,

Sarebbe un'informazione interessante se una persona addormentata formasse altrettanti filtri e plosivi di formenti vocali (e digrafi e trigrafi di tale densità nel tempo) e inflessioni di tono (ecc.), Mentre dorme come quando è sveglio e parla.
hotpaw2,

La mancanza di funzionalità può essere una funzionalità significativa. Il discorso ha funzionalità.
hotpaw2,

Un problema è che il russare può variare immensamente, da un respiro all'altro. Un semplice respiro pesante è molto "bianco", ma un russare può avere dei picchi molto forti. È essenzialmente un'onda quadra, sebbene sia un'eccessiva semplificazione. E dobbiamo fare l'analisi in tempo reale su uno smartphone, quindi la complessità dell'algoritmo è limitata.
Daniel R Hicks il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.