Як відрізнити голос від хропіння?


22

Передумови: я працюю над додатком iPhone (на який згадується в кількох інших публікаціях ), який "слухає" хропіння / дихання, коли один спить, і визначає, чи є ознаки апное сну (як попередній екран для "лабораторії сну" тестування). У програмі, в основному, використовується «спектральна різниця» для виявлення хропіння / вдиху, і вона працює досить добре (кореляція приблизно 0,85–0,90) під час тестування на записи в лабораторії сну (які насправді є досить галасливими).

Проблема: Більшість «спальних» шумів (вентилятори тощо) я можу відфільтрувати за допомогою декількох прийомів і часто надійно виявляти дихання на рівні S / N, де людське вухо не може його виявити. Проблема - голосовий шум. Незвично мати телевізор або радіо, що працюють у фоновому режимі (або просто когось розмовляти вдалині), а ритм голосу тісно відповідає диханню / хропінню. Насправді я запустив запис пізнього автора / оповідача Білла Холма через додаток, і це було, по суті, невідрізним від хропіння в ритмі, мінливості рівня та кількох інших заходів. (Хоча я можу сказати, що, мабуть, у нього не було апное сну, принаймні, не прокинувшись.)

Тож це трохи тривалий знімок (і, мабуть, розтягнення правил форуму), але я шукаю деякі ідеї, як розрізнити голос. Нам не потрібно якось фільтрувати хропіння (думав, що це було б добре), а нам просто потрібен спосіб відхилити як "занадто галасливий" звук, надмірно забруднений голосом.

Будь-які ідеї?

Опубліковані файли: я розмістив кілька файлів на dropbox.com:

Перший - це досить випадковий твір рок (я думаю), а другий - запис про покійного Білла Холма. Обидва (які я використовую як мої зразки "шуму" відрізняються від хропіння) змішуються зі шумом, щоб узагальнити сигнал. (Це ускладнює завдання їх виявлення значно складніше.) Третій файл - це десять хвилин справжнього вашого запису, де перша третина в основному дихає, середня третина - змішане дихання / хропіння, а остання третина - досить стійкий хропіння. (Ви отримуєте кашель за бонус.)

Всі три файли були перейменовані з ".wav" на "_wav.dat", оскільки багато браузерів ускладнюють завантаження файлів wav. Просто перейменуйте їх назад у ".wav" після завантаження.

Оновлення: я подумав, що ентропія «робить фокус» для мене, але виявилося, що це здебільшого особливості тестових випадків, які я використовував, плюс алгоритм, який не надто добре розроблений. В цілому ентропія для мене робить дуже мало.

Згодом я спробував методику, коли я обчислював FFT (використовуючи декілька різних віконних функцій) загальної величини сигналу (я намагався потужність, спектральний потік та кілька інших заходів), відбирав пробу приблизно 8 разів на секунду (беручи статистику з основного циклу FFT що кожні 1024/8000 секунд). Що стосується 1024 зразків, це охоплює часовий діапазон близько двох хвилин. Я сподівався, що мені вдасться побачити закономірності цього через повільний ритм хропіння / дихання проти голосу / музики (і що це також може бути кращим способом вирішити питання про " мінливість "), але поки є підказки малюнка тут і там, немає нічого, на що я дійсно можу причепитися.

( Додаткова інформація: У деяких випадках FFT величини сигналу створює дуже чіткий малюнок із сильним піком приблизно на 0,2 ГГц та сходовими гармоніками. Але ця картина майже не така виразна більшість часу, і голос та музика можуть генерувати менш чітко. версії подібного шаблону. Можливо, є якийсь спосіб обчислити значення кореляції для показника заслуги, але, здається, знадобиться прилягання кривої приблизно до поліному четвертого порядку, і робити це раз на секунду в телефоні здається недоцільним.)

Я також спробував зробити ту саму середню амплітуду FFT для 5 окремих "смуг", на які я поділив спектр. Діапазони - 4000-2000, 2000-1000, 1000-500 і 500-0. Шаблон для перших 4 діапазонів був загалом схожий на загальну схему (хоча не було справжньої "виділяється" смуги і часто зникав малий сигнал у діапазонах високої частоти), але діапазон 500-0 взагалі був просто випадковим.

Баунті: Я збираюся дати Натану щедрість, навіть якщо він не запропонував нічого нового, враховуючи, що його було найпродуктивнішою пропозицією на сьогоднішній день. У мене ще є кілька балів, які я був би готовий нагородити ще кимось, якщо б вони пережили якісь хороші ідеї.


2
Чи можете ви розмістити якісь представницькі спектрограми? (Нехай дані говорять.) Як ви обчислюєте "спектральну різницю"?
Емре

"Спектральну різницю" іноді називають "спектральним потоком" та кількома іншими термінами. В основному це сума квадратів індивідуальних відмінностей в послідовних FFT звуків.
Даніель Р Хікс

2
Подумайте, аудіокліпи були б ще кращими. Дякуємо за роз’яснення.
Емре

Я намагаюся розібратися, якою буде найкраща презентація. У мене немає фантазійного програмного забезпечення, щоб робити спектри (крім моїх фактичних FFT) для коротких зразків - Audacity вимагає занадто довгої вибірки, щоб захопити спектр окремого звуку. І є деякі проблеми щодо конфіденційності медичних засобів із розміщенням фактичних звуків пацієнта.
Даніель Р Хікс

1
@DanielRHicks Спектрограми з ТВ + хропінням та просто хропінням чи подібними подібними дійствами дійсно пройдуть довгий шлях.
Космічний

Відповіді:


10

Фон

Згідно з наведеними нижче документами, хропіння характеризується піком приблизно 130 ГГц і повністю сконцентровано нижче 12 кГц:

Подивимось, чи можемо ми скористатися цим.

Приклад MATLAB

У нас поганий показник хропіння дитини ; 10-хвилинний 8-розрядний моно WAV-файл. Частота дискретизації - 8 кГц, що означає пропускну здатність аудіосигналу - 4 кГц. Рівень дуже низький, тому я спершу його порівняю .

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

Повна спектрограма

Вісь y нормалізується на пропускну здатність, 4 КГц, так що висічка, яку ви бачите на рівні 0,1, відповідає частоті 400 ГГц. Виник шип, що відповідає кашлю в ~ 186s; ігноруйте це. Ми можемо розпливчасто бачити виїмки під час кожного хропіння. Мало того, але вони здаються сконцентрованими нижче 0,2 х 4 кГц = 800 ГГц. Давайте докладніше розглянемо.

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

Масштаб спектрограми до 0-800Гц.

Цього разу вісь частоти була позначена в Герц. Тепер виїмки цілком зрозумілі. Ми навіть можемо бачити обертони шуму ліній електропередач, починаючи з 60 Гц (180 Гц, 300 Гц, 420 Гц). Тепер приходить суть алгоритму: класифікуємо сигнал на основі енергії в цій піддіапазоні, при цьому видаляється шум лінії.

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

Якщо ми хочемо пофантазувати, ми можемо відкинути великі шипи:

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

Діаграма енергії у підрізаній смузі 0-800Гц

Кінцевий результат

Низький показник SNR, що виявляється у труднощах розпізнавання сигналу на першому сюжеті, означає, що ми маємо лише половину стандартного відхилення (значення якого було 4,1). Стебла відзначають хропіння.


Так, мій поточний алгоритм скасовує гул та інший гармонічний шум (шум вентилятора, як правило, близько 110 Гц), занулюючи відро FFT, які знаходяться на більш-менш постійному рівні. Мені незрозуміло, що ви маєте на увазі, коли ви говорите "давайте класифікуємо сигнал на основі енергії в цій піддіапазоні" - на який піддіапазон ви звертаєтесь?
Даніель Р Хікс

О, я бачу, ви говорите про менше 800 Гц - я пропустив цей шматочок.
Даніель Р Хікс

Якщо ви подивитеся на верхню діаграму, то побачите, що біля верху є досить багато інформації, а інша смуга трохи нижче середини. А у цих гуртів значно менше конкуруючих шумів. Моя поточна схема розрізає спектр і намагається оцінити SNR кожного фрагмента, а потім зважить їх відповідно.
Даніель Р Хікс

Ви можете об'єднати кілька функцій, таких як енергія у виділених піддіапазонах, спектральна плоскості тощо, щоб створити орієнтовний векторний ознака. Потім виконайте PCA, щоб з’ясувати, які з них найбільш важливі, як пояснено в останньому документі.
Емре

Це в основному те, що я роблю, відсутня суворість PCA.
Даніель Р Хікс

9

Просто кинувши це сюди, щоб охопити всі можливості, ви могли б використовувати ентропію, я не знаю, який рівень ентропії хропіння проти мови, але якщо він досить інший, що може працювати. http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf


Я не зовсім розумію, що я з цим роблю (теорія інформації змушує мою голову вибухнути), але я здійснив сирий розрахунок ентропії, вклав трохи нетеоретичну нормалізацію, і, здається, це працює. У музики та голосу низька (негативна) ентропія, в той час як хропіння значно вище. А фоновий шум в цілому, здається, зменшує (негативне) значення, тому він забезпечує досить хороший показник достоїнств. Хоча більше експериментів потрібно.
Даніель Р Хікс

Слід бути обережним - вам також потрібно включити прості ворота рівня, тому що ви можете мати надзвичайно низький рівень шуму, який може відповідати речам, які ви намагаєтеся пропустити, а також, як видається, мій досвід говорить про кількісну кількісну оцінку надзвичайно низький рівень шуму може збільшити приблизно порядок у сигналі, оскільки при низьких рівнях зменшена кількість можливих вибіркових значень і лише ентропія не враховує різниці в амплітуді.
День Натана

Так, я регулярно боюсь із шумом і маю досить непоганий спосіб окремо оцінити це. Коли шум перевищує певний рівень, я молюся. (Насправді, насправді важко виміряти шум.)
Даніель Р Хікс

На жаль, я виявив, що велика частина того, що я вимірював моїм розрахунком із сирою ентропією, був артефактом обчислення (через нулі в тестових даних). Це сорти працює для моєї потреби, але не так добре, як я вперше подумав.
Даніель Р Хікс

Спостереження: я замінив FFT / float FFT, який я використовував, на повну плаваючу крапку (яка не дає нулів, коли рівень низький), і корисність ентропії пішла далі вниз по трубах - не як видається, забезпечують щось особливо корисне.
Даніель Р Хікс

3

Можливо, статистика часового домену? Здається, що хропіння має відносно тривалий час у стаціонарному стані, тоді як енергія мовлення досить коротко змінюється за короткий проміжок часу. Це також може поєднуватися зі спектральним аналізом. Голосні мають більш низький вміст, а приголосні - більш високі частоти. Під час промови спектр може швидко відскакувати між цими станами, а зберігання може залишатися в одному стані довший час.


Основні статистичні показники часової області не відрізняються. Однак, це добре, що я міг би переглянути короткочасну мінливість (яку я зазвичай згладжую). Шукаю "підстрибування" між частотними діапазонами - це також гарна ідея ... В даний час я ділюсь на 5 діапазонів і відхиляю діапазони з явно низьким S / N.
Даніель Р Хікс

@DanielRHicks Я бачив, як обчислити цепстральну оболонку десь в іншому місці, але, можливо, ви можете використовувати це як міру вашої спектральної мінливості замість чистого спектру, який буде більш "галасливим / нерівним", тоді як цепструм (и) мають тенденцію до мене більш плавним . Я також чув, що мел-частотна труба використовується в голосовому розпізнаванні, і це звучить так, що я можу вам скористатися для вас.
Спейси

@DanielRHicks: чим можна відрізнити, яким методом? Вони, безумовно, відрізняють мене.
ендоліт

@endolith - Непомітно з урахуванням моїх поточних показників - "спектральна різниця" плюс загальний рівень енергії. Але вони фільтруються з низьким проходом із постійною постійною часом 0,5 секунди. Я думаю, я спробую трохи переглянути нефільтровані дані.
Даніель Р Хікс

Я мав піти на отримання короткотривалої статистики часу. Деякі «натяки», але нічого остаточного.
Даніель Р Хікс

1

Спектральна складність у часі. Я буду гіпотезувати, що людська мова, ймовірно, використовує більше фонем і має значно більшу статистичну складність у їх послідовності, ніж фонематичні послідовності хропіння.

Це, мабуть, набагато простіша проблема, ніж постійне розпізнавання мовлення, оскільки вам не потрібно буде фактично розпізнавати якусь конкретну фонему чи пропозицію, лише кількість спектральних сегментів звучання фонеми та деякий показник статистичної складності їх послідовностей (ентропія чи Тест на стиск може працювати). Потім подивіться, чи можете ви визначити надійний поріг для цих заходів.


Проблема полягає в тому, що хропіння є надзвичайно складним / випадковим, і йому не вистачає значних особливостей при дослідженні його спектру.
Даніель Р Хікс

Цікавою інформацією було б, якби спляча людина утворювала стільки різних фільтрів і голосистих голосних фільтрів (а також графіки та триграфи таких густин) та нахилів (тощо) під час сну, як коли не спить і розмовляє.
hotpaw2

Відсутність можливостей може бути суттєвою ознакою. Мовлення має особливості.
hotpaw2

Одна з проблем полягає в тому, що хропіння може змінюватись надзвичайно, від одного дихання до іншого. Простий важкий вдих дуже "білий", але при хропінні можуть бути дуже сильні шипи. По суті це квадратна хвиля, хоча це надмірне спрощення. І нам потрібно робити аналіз в режимі реального часу на смарт-телефоні, тому складність алгоритму обмежена.
Даніель Р Хікс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.