Bagaimana membedakan suara dari mendengkur?

22

Latar belakang: Saya sedang mengerjakan aplikasi iPhone (disinggung dalam beberapa posting lain ) yang "mendengarkan" dengkuran / pernapasan saat seseorang tertidur dan menentukan apakah ada tanda-tanda sleep apnea (sebagai pra-layar untuk "lab tidur" pengujian). Aplikasi ini pada dasarnya menggunakan "perbedaan spektral" untuk mendeteksi dengkuran / napas, dan berfungsi dengan baik (korelasi 0,85--0,90) ketika diuji terhadap rekaman lab tidur (yang sebenarnya cukup berisik).

Masalah: Sebagian besar kebisingan "kamar tidur" (kipas angin, dll.) Saya dapat menyaring melalui beberapa teknik, dan seringkali dapat mendeteksi pernapasan pada tingkat S / N di mana telinga manusia tidak dapat mendeteksinya. Masalahnya adalah suara. Bukanlah hal yang aneh jika televisi atau radio diputar di latar belakang (atau sekadar meminta seseorang berbicara di kejauhan), dan irama suara sangat cocok dengan pernapasan / dengkuran. Bahkan, saya menjalankan rekaman almarhum penulis / pendongeng Bill Holm melalui aplikasi dan itu pada dasarnya tidak bisa dibedakan dari mendengkur dalam ritme, tingkat variabilitas, dan beberapa langkah lainnya. (Meskipun aku bisa mengatakan bahwa dia tampaknya tidak menderita sleep apnea, setidaknya tidak ketika bangun.)

Jadi ini agak sulit (dan mungkin serangkaian aturan forum), tapi saya mencari beberapa ide tentang cara membedakan suara. Kita tidak perlu menyaring dengkuran entah bagaimana (pikir itu akan menyenangkan), tetapi kita hanya perlu cara untuk menolak sebagai suara "terlalu berisik" yang terlalu tercemar oleh suara.

Ada ide?

File yang diterbitkan: Saya telah menempatkan beberapa file di dropbox.com:

Yang pertama adalah musik rock yang agak acak (kurasa), dan yang kedua adalah rekaman almarhum Bill Holm. Keduanya (yang saya gunakan sebagai sampel "noise" saya dibedakan dari mendengkur) telah dicampur dengan noise untuk mengaburkan sinyal. (Ini membuat tugas mengidentifikasi mereka secara signifikan lebih sulit.) File ketiga adalah sepuluh menit dari rekaman Anda benar-benar di mana sepertiga pertama sebagian besar bernafas, sepertiga tengah campuran pernapasan / mendengkur, dan sepertiga terakhir adalah mendengkur yang cukup mantap. (Anda mendapatkan batuk untuk bonus.)

Ketiga file telah diubah namanya dari ".wav" menjadi "_wav.dat", karena banyak browser membuatnya sangat sulit untuk mengunduh file wav. Ubah nama mereka kembali menjadi ".wav" setelah mengunduh.

Pembaruan: Saya pikir entropi adalah "melakukan trik" untuk saya, tetapi ternyata sebagian besar merupakan kekhasan dari kasus uji yang saya gunakan, ditambah algoritma yang tidak dirancang dengan terlalu baik. Secara umum, entropi tidak banyak membantu saya.

Saya kemudian mencoba teknik di mana saya menghitung FFT (menggunakan beberapa fungsi jendela berbeda) dari keseluruhan sinyal (saya mencoba kekuatan, fluks spektral, dan beberapa ukuran lain) sampel sekitar 8 kali per detik (mengambil statistik dari siklus FFT utama yaitu setiap 1024/8000 detik). Dengan 1024 sampel, ini mencakup rentang waktu sekitar dua menit. Saya berharap bahwa saya akan dapat melihat pola dalam hal ini karena irama lambat dari mendengkur / bernafas vs suara / musik (dan itu mungkin juga cara yang lebih baik untuk mengatasi masalah " variabilitas "), tetapi sementara ada petunjuk dari sebuah pola di sana-sini, tidak ada yang benar-benar dapat saya kaitkan.

( Info lebih lanjut: Untuk beberapa kasus, FFT besarnya sinyal menghasilkan pola yang sangat berbeda dengan puncak yang kuat di sekitar 0,2 Hz dan harmonik tangga. Tetapi polanya hampir tidak terlalu berbeda pada sebagian besar waktu, dan suara dan musik dapat menghasilkan kurang berbeda versi dari pola yang sama. Mungkin ada beberapa cara untuk menghitung nilai korelasi untuk angka pantas, tetapi tampaknya akan membutuhkan kurva yang cocok dengan sekitar polinomial orde 4, dan melakukan hal itu satu detik di telepon tampaknya tidak praktis.)

Saya juga berusaha melakukan FFT yang sama dengan amplitudo rata-rata untuk 5 "band" individual yang telah saya bagi spektrumnya. Band-band tersebut adalah 4000-2000, 2000-1000, 1000-500, dan 500-0. Pola untuk 4 pita pertama umumnya mirip dengan pola keseluruhan (meskipun tidak ada pita "nyata" nyata, dan sering kali semakin kecil sinyal di pita frekuensi yang lebih tinggi), tetapi pita 500-0 umumnya hanya acak.

Bounty: Saya akan memberi Nathan hadiah, meskipun dia tidak menawarkan sesuatu yang baru, mengingat bahwa itu adalah saran yang paling produktif hingga saat ini. Saya masih memiliki beberapa poin, saya akan bersedia memberikan kepada orang lain, jika mereka datang dengan beberapa ide bagus.

Daniel R Hicks
sumber
2
Bisakah Anda memposting beberapa spektogram representatif? (Biarkan data berbicara.) Bagaimana Anda menghitung "perbedaan spektral"?
Emre
"Perbedaan spektral" kadang-kadang disebut sebagai "fluks spektral" dan beberapa istilah lainnya. Pada dasarnya ini adalah jumlah kuadrat dari perbedaan individu dalam FFT berturut-turut dari suara.
Daniel R Hicks
2
Kalau dipikir-pikir, klip audio akan lebih baik. Terimakasih atas klarifikasinya.
Emre
Saya mencoba mencari tahu apa presentasi terbaik yang akan terjadi. Saya tidak memiliki perangkat lunak mewah untuk melakukan spektra (selain FFT saya yang sebenarnya) untuk sampel pendek - Audacity membutuhkan sampel terlalu lama untuk menangkap spektrum suara individu. Dan ada beberapa masalah privasi medis dengan memposting suara pasien yang sebenarnya.
Daniel R Hicks
1
@DanielRHicks Spectrograms dengan TV + mendengkur dan hanya mendengkur atau sesuatu seperti itu akan sangat bermanfaat.
Spacey

Jawaban:

10

Latar Belakang

Menurut makalah di bawah ini, mendengkur ditandai dengan puncak sekitar 130Hz, dan sepenuhnya terkonsentrasi di bawah 12kHz:

Mari kita lihat apakah kita dapat memanfaatkan ini.

Contoh MATLAB

Kami memiliki catatan yang buruk tentang mendengkur anak ; file WAV 10 menit, 8-bit mono. Tingkat pengambilan sampel adalah 8KHz, yang berarti bandwidth sinyal audio adalah 4KHz. Levelnya sangat rendah jadi saya akan meminta terlebih dahulu.

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

Spektrogram penuh

Sumbu y dinormalisasi ke bandwidth, 4KHz, sehingga takik yang Anda lihat di 0,1 sesuai dengan frekuensi 400Hz. Ada lonjakan yang berhubungan dengan batuk pada ~ 186s; abaikan itu. Secara samar-samar kita bisa melihat takik pada setiap dengkuran. Bukan hanya itu, tetapi mereka tampaknya terkonsentrasi di bawah 0,2 x 4KHz = 800Hz. Mari kita lihat lebih dekat.

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 spektogram ke 0-800Hz.

Kali ini sumbu frekuensi diberi label dalam Hertz. Sekarang takik cukup jelas. Kita bahkan dapat melihat nada suara dari gangguan saluran listrik mulai dari 60Hz (180Hz, 300Hz, 420Hz). Sekarang tiba esensi dari algoritma: mari kita mengklasifikasikan sinyal berdasarkan energi dalam subband ini, dengan derau garis dihilangkan.

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

Jika kita ingin menjadi mewah, kita dapat membuang paku yang terlalu besar:

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

Plot energi dalam subband berlekuk 0-800Hz

Hasil akhir

SNR rendah, bermanifestasi dalam kesulitan dalam membedakan sinyal di plot pertama, berarti kita memiliki kelonggaran hanya setengah standar deviasi (nilainya 4,1). Batang menandai dengkuran.

Emre
sumber
Ya, algoritme saya saat ini membatalkan dengung dan kebisingan harmonik lainnya (kebisingan ventilator cenderung sekitar 110Hz) dengan memusatkan perhatian pada bucket FFT yang berada pada level yang kurang lebih konstan. Saya tidak jelas apa yang Anda maksud ketika Anda mengatakan "mari kita mengklasifikasikan sinyal berdasarkan energi dalam subband ini" - subband apa yang Anda maksud?
Daniel R Hicks
Oh, begitu, yang Anda bicarakan di bawah 800 Hz - Saya melewatkan sedikit itu.
Daniel R Hicks
Jika Anda melihat grafik atas Anda, Anda akan melihat bahwa ada sedikit informasi di dekat bagian atas, dan band lain tepat di bawah tengah. Dan band-band ini memiliki noise yang jauh lebih sedikit bersaing. Skema saya saat ini mengiris spektrum dan mencoba untuk mengevaluasi SNR dari setiap irisan, kemudian menimbang mereka sesuai.
Daniel R Hicks
Anda dapat menggabungkan beberapa fitur, seperti energi di subband pilih, kerataan spektral, dan sebagainya untuk membuat vektor fitur sementara. Kemudian lakukan PCA untuk mencari tahu mana yang paling penting, seperti yang dijelaskan dalam makalah terakhir.
Emre
Itu pada dasarnya apa yang saya lakukan, tidak ada kerasnya PCA.
Daniel R Hicks
9

Hanya melempar ini ke sini untuk menutupi semua kemungkinan, Anda mungkin dapat menggunakan entropi, saya tidak tahu apa level entropi dari dengkuran vs ucapan, tetapi apakah itu cukup berbeda yang mungkin berhasil. http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf

Nathan Day
sumber
Saya tidak sepenuhnya mengerti apa yang saya lakukan dengan itu (teori informasi membuat kepala saya meledak), tetapi saya menerapkan perhitungan entropi mentah, melemparkan sedikit normalisasi yang sepenuhnya non-teoritis, dan tampaknya berfungsi. Musik dan suara memiliki entropi (negatif) rendah, sedangkan dengkuran jauh lebih tinggi. Dan kebisingan latar belakang secara umum tampaknya mengurangi nilai (negatif), sehingga memberikan angka jasa yang cukup bagus. Diperlukan lebih banyak eksperimen.
Daniel R Hicks
Satu hal yang harus diperhatikan adalah Anda juga perlu memasukkan gerbang level yang sederhana juga, karena Anda dapat memiliki tingkat kebisingan yang sangat rendah yang mungkin cocok dengan hal-hal yang Anda coba lewati, juga pengalaman saya tampaknya menyarankan kuantisasi digit dari noise tingkat rendah yang ekstrem dapat meningkatkan tingkat keteraturan dalam sinyal, karena pada level rendah terdapat penurunan jumlah nilai sampel yang mungkin dan entropi saja tidak mempertimbangkan perbedaan amplitudo.
Nathan Day
Ya, saya secara teratur melakukan pertempuran dengan kebisingan, dan memiliki cara yang cukup bagus untuk mengukurnya secara terpisah. Ketika kebisingan melebihi tingkat tertentu saya menyepak bola. (Sebenarnya sangat sulit untuk mengukur kebisingan.)
Daniel R Hicks
Sayangnya, saya telah menemukan bahwa sebagian besar dari apa yang saya ukur dengan perhitungan entropi minyak mentah saya adalah artefak dari perhitungan (karena nol dalam data uji). Agak cocok untuk kebutuhan saya, tetapi tidak sebagus yang saya pikirkan.
Daniel R Hicks
Tindak lanjut: Saya mengganti FFT tetap / mengambang yang telah saya gunakan dengan titik mengambang penuh (yang tidak menghasilkan nol ketika level rendah), dan kegunaan entropi semakin menuruni tabung - tidak tampaknya memberikan sesuatu yang sangat berguna.
Daniel R Hicks
3

Statistik domain waktu mungkin? Mendengkur tampaknya memiliki periode stabil yang relatif lama sedangkan energi bicara berubah sedikit selama periode waktu yang singkat. Ini bisa dikombinasikan dengan analisis spektral juga. Vokal memiliki konten frekuensi lebih rendah dan konsonan frekuensi lebih tinggi. Selama pidato, spektrum dapat dengan cepat memantulkan bolak-balik antara negara-negara tersebut sementara penyimpanan dapat tetap dalam satu negara untuk periode waktu yang lebih lama.

Hilmar
sumber
Statistik domain waktu dasar tidak dapat dibedakan. Namun, ada baiknya saya melihat variabilitas jangka pendek (yang biasanya saya hilangkan). Mencari "memantul" di antara band-band frekuensi juga merupakan ide yang bagus ... Saya saat ini membagi menjadi 5 band dan menolak band-band dengan S / N rendah yang jelas.
Daniel R Hicks
@DanielRHicks Saya melihat bagaimana menghitung amplop cepstral di tempat lain, tetapi mungkin Anda dapat menggunakannya sebagai ukuran variabilitas spektral Anda alih-alih spektrum murni yang akan lebih 'berisik / bergerigi' sedangkan cepstrum cenderung membuat saya lebih lancar . Saya juga pernah mendengar cepstrum Mel-Frequency digunakan dalam voice recog, dan ini sepertinya saya gunakan untuk Anda.
Spacey
@DanielRHicks: Tidak bisa dibedakan dengan metode apa? Mereka jelas dibedakan bagi saya.
endolith
@endolith - Tidak dapat dibedakan karena metrik saya saat ini - "perbedaan spektral" ditambah tingkat energi keseluruhan. Tetapi mereka low-pass disaring dengan sekitar waktu konstan 0,5 detik. Saya pikir saya akan mencoba melihat data tanpa filter sedikit.
Daniel R Hicks
Saya mencoba menangkap statistik waktu singkat. Beberapa "petunjuk", tetapi tidak ada yang pasti.
Daniel R Hicks
1

Kompleksitas spektral dari waktu ke waktu. Saya akan berhipotesis bahwa ucapan manusia mungkin menggunakan lebih banyak fonem, dan dengan kompleksitas statistik yang lebih besar dalam urutannya daripada urutan mendengkur fonem.

Ini mungkin masalah yang jauh lebih mudah daripada pengenalan ucapan terus-menerus, karena Anda tidak perlu benar-benar mengenali fonem atau kalimat tertentu dengan benar, hanya jumlah segmen spektral yang terdengar fonem, dan beberapa kompleksitas ukuran statistik dari urutannya (entropi atau uji kompresibilitas mungkin berhasil). Kemudian lihat apakah Anda dapat menentukan ambang batas yang dapat diandalkan untuk tindakan ini.

hotpaw2
sumber
Masalahnya adalah mendengkur sangat kompleks / acak, dan tidak memiliki banyak fitur yang berbeda ketika spektrumnya diperiksa.
Daniel R Hicks
Akan menjadi informasi yang menarik jika seseorang yang tidur membentuk sebanyak mungkin filter dan plosif forment vokal yang berbeda (dan digraf dan trigraph dengan kepadatan seperti itu dari waktu ke waktu), dan infleksi nada (dll.), Sambil tidur seperti ketika bangun dan berbicara.
hotpaw2
Kurangnya fitur dapat menjadi fitur yang signifikan. Pidato memiliki fitur.
hotpaw2
Satu masalah adalah bahwa mendengkur bisa sangat bervariasi, dari satu nafas ke nafas berikutnya. Napas berat sederhana sangat "putih", tetapi mendengkur mungkin memiliki beberapa paku yang sangat kuat. Ini pada dasarnya adalah gelombang persegi, meskipun itu penyederhanaan berlebihan. Dan kita perlu melakukan analisis secara real time pada ponsel pintar, sehingga kompleksitas algoritma terbatas.
Daniel R Hicks