如何区分声音与打nor?


22

背景: 我正在开发一个iPhone应用程序( 其他几篇 文章中都有介绍),该应用程序在一个人入睡时“听着”打呼//呼吸,并确定是否存在睡眠呼吸暂停的迹象(作为“睡眠实验室”的预屏幕)测试)。该应用程序主要使用“频谱差异”来检测打sn /呼吸,并且在针对睡眠实验室记录(实际上是非常嘈杂的)进行测试时,效果很好(大约为0.85--0.90)。

问题: 我可以通过多种技术过滤掉大多数“卧室”噪音(风扇等),并且经常以人耳无法检测到的S / N级别可靠地检测到呼吸。问题是语音噪音。在后台运行电视或广播(或者只是在远处说话的人)并不罕见,并且声音的节奏与呼吸/打呼closely紧密匹配。实际上,我通过该应用程序记录了已故作者/讲故事者比尔·霍尔姆(Bill Holm)的录音,与打的节奏,水平变化和其他几种测量方法基本上没有区别。(尽管我可以说他显然没有睡眠呼吸暂停,至少在清醒时没有。)

因此,这是一个远景(可能是一系列的论坛规则),但是我正在寻找一些有关如何区分声音的想法。我们不需要以某种方式过滤掉打ore声(这会很好),但是我们只需要一种方法来拒绝被声音过度污染的“太吵”的声音。

有任何想法吗?

发布的文件:我已经在dropbox.com上放置了一些文件:

第一个是相当随机的摇滚(我猜)音乐,第二个是已故的Bill Holm讲话的录音。两者(我将其作为“噪声”样本从打nor中区分出来)都与噪声混合在一起,以使信号模糊。(这使识别它们的任务变得更加困难。)第三档是您的录音的十分钟,真正的三分之一是呼吸,打middle混合,最后三分之一是稳定的打nor。(您咳嗽会得到奖金。)

这三个文件都已从“ .wav”重命名为“ _wav.dat”,因为许多浏览器都使下载wav文件异常困难。下载后,只需将它们重命名为“ .wav”即可。

更新:我以为熵对我来说就是“把戏”,但事实证明,这主要是我所使用的测试用例的特殊性,以及设计得不太好的算法。在一般情况下,熵对我无能为力。

随后,我尝试了一种技术,该技术可以计算每秒采样约8次的整体信号幅度(我尝试过功率,频谱通量和其他多种测量方法)的FFT(使用几种不同的窗口函数)(取自主要FFT周期的统计信息)这是每1024/8000秒)。对于1024个样本,这涵盖了大约两分钟的时间范围。我希望由于打/呼吸与声音/音乐的节奏较慢,我能够看到这种模式(而且它可能也是解决“ 可变性 ”问题的更好方法),但是尽管有提示到处都是模式,没有什么我可以真正锁定的。

进一步的信息:在某些情况下,信号幅度的FFT会产生一个非常明显的模式,在0.2Hz处有一个很强的峰值,并产生阶跃谐波。可能有某种方法可以计算品质因数的相关值,但似乎需要对约4阶多项式进行曲线拟合,而在手机中每秒进行一次拟合似乎是不切实际的。)

我还尝试对将频谱划分为5个单独的“频段”进行相同的平均幅度FFT。波段是4000-2000、2000-1000、1000-500和500-0。前4个频段的模式通常与总体模式相似(尽管没有真正的“突出”频段,并且在较高频段中的信号通常消失得很小),但500-0频段通常只是随机的。

赏金: 鉴于内森(Nathan)是迄今为止最有成效的建议,尽管纳森(Nathan)没有提供任何新的东西,我还是要给予赏金。但是,如果他们提出了一些好主意,我仍然愿意将其奖励给其他人。


2
您可以张贴一些代表性的频谱图吗?(让数据开始讨论。)您如何计算“光谱差异”?
Emre 2012年

有时将“光谱差异”称为“光谱通量”和其他一些术语。基本上,它是声音的连续FFT中个体差异的平方和。
Daniel R Hicks 2012年

2
想一想,音频片段会更好。感谢您的澄清。
Emre 2012年

我正在尝试找出最好的演示文稿。我没有花哨的软件来为短样本制作频谱(我的实际FFT除外)-Audacity需要太长的样本才能捕获单个声音的频谱。发布实际的患者声音存在一些医疗隐私问题。
Daniel R Hicks 2012年

1
@DanielRHicks带有电视+打no的频谱图,只是打呼sn或类似的东西真的会走很长一段路。
Spacey 2012年

Answers:


10

背景

根据下面的论文,打的特征是在大约130Hz处出现一个峰值,并且完全集中在12kHz以下:

让我们看看是否可以利用这一点。

MATLAB示例

我们记录了一个孩子打呼 ;的记录 ; 一个10分钟的8位单声道WAV文件。采样率为8KHz,这意味着音频信号的带宽为4KHz。级别很低,因此我将首先对其进行压扩

[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轴针对带宽4KHz进行了归一化,因此您在0.1处看到的陷波对应于400Hz的频率。在〜186s出现一个对应于咳嗽的尖峰;忽略那个。我们可以隐约看到每次打ly时的刻痕。不仅如此,而且它们似乎集中在0.2 x 4KHz = 800Hz以下。让我们仔细看看。

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-800Hz。

这次,频率轴以赫兹标记。现在的缺口很清楚。我们甚至可以看到电源线噪声的泛音始于60Hz(180Hz,300Hz,420Hz)。现在是算法的本质:让我们根据该子带中的能量对信号进行分类,并消除线路噪声。

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-800Hz中的能量图

最终结果

低SNR表现为难以分辨第一张图中的信号,这意味着我们只有标准偏差的一半(其值为4.1)。茎上有打the声。


是的,我目前的算法通过将处于大致恒定水平的FFT桶归零,消除了嗡嗡声和其他谐波噪声(通风机噪声往往约为110Hz)。我不清楚当您说“让我们根据该子带中的能量对信号进行分类”时的意思-您指的是哪个子带?
Daniel R Hicks

哦,我明白了,您说的是低于800 Hz的频率-我错过了。
Daniel R Hicks 2012年

如果您看一下上方的图表,您会发现顶部附近有很多信息,而中间区域则有另一个频段。这些频段的竞争噪音要小得多。我当前的方案对频谱进行切片,并尝试评估每个切片的SNR,然后对它们进行加权。
Daniel R Hicks

您可以连接多个特征,例如选定子带中的能量,频谱平坦度等,以创建一个暂定的特征向量。然后执行PCA以找出最重要的部分,如上一论文所述。
Emre

基本上没有PCA的严格要求,这就是我正在做的事情。
Daniel R Hicks 2012年

9

只是将其放入此处以涵盖所有可能性,您也许可以使用熵,但我不知道打vs声与语音的熵水平是多少,但是如果打different与语音的熵水平足够大,则可以起作用。 http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf


我不完全理解我在做什么(信息理论使我大跌眼镜),但是我实现了一个粗略的熵计算,并进行了一些完全非理论上的归一化,并且似乎正在起作用。音乐和语音的熵低(负),而打则明显高。通常,背景噪声似乎会降低(负)值,因此它提供了很好的品质因数。不过,还需要更多的实验。
Daniel R Hicks 2012年

要注意的一件事是,您还需要包括一个简单的电平门,因为您可能会遇到极低的电平后向噪声,可能与您尝试让其通过的东西相匹配,而且我的经验似乎也暗示了极低的电平噪声会增加信号的阶数,因为在低电平时,可能的采样值数量会减少,并且仅熵就不会考虑幅度差异。
弥敦道日

是的,我经常与噪音作斗争,并且有一种很好的方法来单独进行测量。当噪音超过一定水平时,我会打unt。(实际上,测量噪声非常困难。)
Daniel R Hicks

las,我发现我的原始熵计算所测量的大部分内容都是计算的假象(由于测试数据为零)。它可以满足我的需求,但不如我最初想象的那么好。
Daniel R Hicks

后续:我用一个完整的浮点1替换了我一直使用的固定/浮点FFT(当电平低时不会产生零),并且熵的有用性进一步降低了-不似乎提供了任何特别有用的东西。
Daniel R Hicks

3

时域统计也许?打似乎具有相对较长的稳定状态,而语音能量在短时间内会发生很大变化。这也可以与频谱分析结合。元音的低频成分更多,辅音的高频成分更多。在语音期间,频谱可能会在这些状态之间快速来回反弹,而存储可能会在一种状态下保留更长的时间。


基本的时域统计信息无法区分。但是,我可以考虑一下短期可变性(我通常会对此进行平滑处理)是一个很好的观点。寻找频带之间的“跳动”也是一个好主意……我目前分为5个频带,并拒绝具有明显较低S / N的频带。
Daniel R Hicks

@DanielRHicks我在其他地方看到了如何计算倒谱包络,但是也许您可以将其用作频谱变异性的度量,而不是纯频谱,因为纯频谱会更“嘈杂/呈锯齿状”,而倒频谱往往使我更平滑。我也听说过在语音Recog中使用了Mel倒谱,这听起来像对您有用。
Spacey 2012年

@DanielRHicks:用什么方法无法区分?他们对我当然是有区别的。
endlith 2012年

@endolith-在我当前的度量标准下无法区分-“光谱差异”加总能量水平。但是它们经过约0.5秒时间常数的低通滤波。我想我会尝试查看未过滤的数据。
Daniel R Hicks,2012年

我可以尝试获取短时统计信息。一些“提示”,但没有确定的含义。
Daniel R Hicks 2012年

1

随时间变化的光谱复杂度。我假设人类的语音可能比打s的音素序列使用更多的音素,并且在音序方面的统计复杂性更高。

与连续语音识别相比,这可能是一个容易得多的问题,因为您将不需要真正正确地识别任何特定的音素或句子,只需识别音素频谱段的音素数量,以及它们序列的某些统计复杂性度量(熵或可压缩性测试可能会起作用)。然后查看是否可以确定这些措施的可靠阈值。


问题是打s非常复杂/随机,并且在检查其频谱时缺乏明显的特征。
Daniel R Hicks

如果一个睡觉的人在睡觉时像清醒和说话时一样,形成了许多不同的元音过滤器和爆破音(以及这样的二字和三音图,其密度随时间变化),音高变化(等),这将是一个有趣的信息。
hotpaw2 2012年

缺少功能可能是一个重要功能。语音具有特征。
hotpaw2 2012年

一个问题是打from可能会从一次呼吸到下一次呼吸而变化很大。一次简单的深呼吸会很“白”,但是打ore可能会有一些非常强烈的尖峰。本质上,这是一个方波,尽管这过于简化。而且我们需要在智能手机上实时进行分析,因此算法的复杂性受到限制。
Daniel R Hicks 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.