Как отличить голос от храпа?


22

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

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

Так что это немного далеко (и, вероятно, часть правил форума), но я ищу некоторые идеи о том, как отличить голос. Нам не нужно как-то отфильтровывать храп (подумал, что это было бы неплохо), но нам просто нужен способ отвергнуть слишком «шумный» звук, который чрезмерно загрязнен голосом.

Любые идеи?

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

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

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

Обновление: я думал, что энтропия "делает свое дело" для меня, но это оказалось в основном особенностями тестовых случаев, которые я использовал, плюс алгоритм, который не был слишком хорошо разработан. В общем случае энтропия делает для меня очень мало.

Впоследствии я попробовал метод, в котором я вычисляю БПФ (используя несколько различных оконных функций) общей величины сигнала (я пробовал мощность, спектральный поток и несколько других мер), сэмплированных примерно 8 раз в секунду (беря статистику из основного цикла БПФ) что каждые 1024/8000 секунд). Для 1024 сэмплов это время составляет около двух минут. Я надеялся, что смогу увидеть закономерности в этом из-за медленного ритма храпа / дыхания против голоса / музыки (и что это также может быть лучшим способом решения проблемы « изменчивости »), но пока есть намеки паттерна здесь и там, я ничего не могу запереть

( Дополнительная информация: В некоторых случаях БПФ величины сигнала дает очень четкий паттерн с сильным пиком на частоте около 0,2 Гц и гармониками ступеньки. Но в большинстве случаев паттерн почти не настолько различен, и голос и музыка могут генерировать менее отчетливые версии аналогичного паттерна. Может быть какой-то способ вычислить значение корреляции для добродетели, но, похоже, для этого потребуется подгонка кривой к полиному 4-го порядка, и делать это раз в секунду в телефоне кажется нецелесообразным.)

Я также попытался сделать то же самое БПФ со средней амплитудой для 5 отдельных «полос», на которые я разделил спектр. Полосы 4000-2000, 2000-1000, 1000-500 и 500-0. Схема для первых 4 полос была в целом аналогична общей схеме (хотя в полосах более высоких частот отсутствовала реальная «выделяющаяся» полоса и часто исчезающе малый сигнал), но полоса 500-0 в целом была просто случайной.

Щедрость: Я собираюсь дать Натану награду, даже если он не предложил ничего нового, учитывая, что его предложение было самым продуктивным на сегодняшний день. У меня все еще есть несколько баллов, которые я хотел бы наградить кому-то еще, если бы они пришли с некоторыми хорошими идеями.


2
Можете ли вы опубликовать некоторые репрезентативные спектрограммы? (Пусть данные говорят.) Как вы вычисляете "спектральную разницу"?
Эмре

«Различие в спектре» иногда называют «спектральным потоком» и несколькими другими терминами. По сути, это сумма квадратов индивидуальных различий в последовательных БПФ звука.
Даниэль Р Хикс

2
Если подумать, аудиоклипы были бы еще лучше. Благодарю за разъяснение.
Эмре

Я пытаюсь понять, какой будет лучшая презентация. У меня нет необычного программного обеспечения для создания спектров (кроме моих реальных БПФ) для коротких сэмплов - 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);

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

Ось у нормализована к полосе пропускания 4 кГц, поэтому отметка 0,1 соответствует частоте 400 Гц. При 186 с появляется кашель, соответствующий кашлю; игнорируй это. Мы можем смутно видеть выемки во время каждого храпа. Мало того, они кажутся сконцентрированными ниже 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 Гц

Конечный результат

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


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

О, я понимаю, вы говорите о частотах ниже 800 Гц - я пропустил это.
Даниэль Р Хикс

Если вы посмотрите на верхнюю диаграмму, то увидите, что рядом с вершиной есть довольно много информации, а чуть ниже середины - другая полоса. И у этих полос намного меньше конкурирующих шумов. Моя текущая схема разрезает спектр и пытается оценить SNR каждого среза, а затем взвешивает их соответственно.
Даниэль Р Хикс

Вы можете объединить несколько элементов, таких как энергия в выбранных поддиапазонах, спектральная плоскостность и т. Д., Чтобы создать предварительный вектор признаков. Затем выполните PCA, чтобы выяснить, какие из них наиболее важны, как описано в последнем документе.
Эмре

Это в основном то, что я делаю, за исключением строгости PCA.
Даниэль Р Хикс

9

Просто добавив это здесь, чтобы охватить все возможности, вы можете использовать энтропию, я не знаю, каков уровень энтропии храпа против речи, но если он достаточно отличается, это может сработать. http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf


Я не совсем понимаю, что я делаю с этим (теория информации заставляет мою голову взорваться), но я реализовал грубое вычисление энтропии, добавил немного не теоретической нормализации, и это, похоже, работает. Музыка и голос имеют низкую (отрицательную) энтропию, в то время как храп значительно выше. А фоновый шум в целом, по-видимому, уменьшает (отрицательное) значение, поэтому он обеспечивает довольно хороший показатель качества. Однако нужно больше экспериментов.
Даниэль Р Хикс

Одна вещь, о которой следует быть осторожным, это то, что вы также должны включить простые затворы уровня, поскольку у вас может быть очень низкий уровень обратного шума, который может соответствовать материалу, который вы пытаетесь пропустить, также мой опыт, кажется, предполагает количественное определение числа Чрезвычайно низкий уровень шума может увеличить порядка сигнала в сигнале, поскольку на низких уровнях число возможных значений выборки уменьшается, и только энтропия не учитывает различия в амплитуде.
Натан Дэй

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

Увы, я обнаружил, что большая часть того, что я измерял с помощью своего грубого вычисления энтропии, была артефактом расчета (из-за нулей в тестовых данных). Это работает для меня, но не так хорошо, как я думал.
Даниэль Р Хикс

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

3

Возможно, статистика временного домена? Храп, по-видимому, имеет относительно длительные периоды устойчивого состояния, в то время как речевая энергия довольно мало меняется за короткие промежутки времени. Это можно сочетать и со спектральным анализом. Гласные имеют более низкочастотное содержание, а согласные - более высокие частоты. Во время речи спектр может быстро подпрыгивать назад и вперед между этими состояниями, в то время как сохранение может оставаться в одном состоянии в течение более длительных периодов времени.


Базовая статистика во временной области неразличима. Тем не менее, это хороший момент, что я мог бы взглянуть на кратковременную изменчивость (которую я обычно сглаживаю). Поиск "подпрыгивания" между полосами частот также является хорошей идеей ... В настоящее время я делю на 5 полос и отклоняю полосы с очевидным низким отношением сигнал / шум.
Даниэль Р Хикс

@DanielRHicks Я видел, как вычислить кепстральную оболочку где-то еще, но, возможно, вы можете использовать это как меру вашей спектральной изменчивости вместо чистого спектра, который будет более «шумным / неровным», тогда как кепстр (ы) стремятся ко мне более гладко , Я также слышал, что Mel-Frequency cepstrum используется в распознавании голоса, и это звучит так, как будто я могу вам пригодиться.
Спейси

@DanielRHicks: Какой метод нельзя отличить? Они, безусловно, различимы для меня.
эндолит

@endolith - неразличимо, учитывая мои текущие показатели - «спектральная разница» плюс общий уровень энергии. Но они фильтруются нижними частотами с постоянной времени около 0,5 секунды. Я думаю, что я попытаюсь немного взглянуть на нефильтрованные данные.
Даниэль Р Хикс

Я попытался захватить кратковременную статистику. Некоторые «намеки», но ничего определенного.
Даниэль Р Хикс

1

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

Это, вероятно, гораздо более простая проблема, чем непрерывное распознавание речи, поскольку вам не нужно фактически правильно распознавать какую-либо конкретную фонему или предложение, только количество спектральных сегментов, звучащих фонемой, и некоторую статистическую меру сложности их последовательностей (энтропия или может сработать тест на сжимаемость). Затем посмотрите, сможете ли вы определить надежный порог для этих мер.


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

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

Отсутствие функций может быть важной особенностью. Речь имеет особенности.
hotpaw2

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