いびきと音声を区別する方法は?


22

背景: 私は(に言及したiPhoneアプリに取り組んでいる中で 、いくつかの の記事)その1が眠っていると判断しながら呼吸/いびき「に耳を傾ける」「スリープラボ」の前の画面として(睡眠時無呼吸の兆候がある場合テスト)。アプリケーションは、主にいびき/息を検出するために「スペクトル差」を使用し、睡眠ラボの録音(実際には非常にノイズが多い)に対してテストすると、非常にうまく機能します(約0.85--0.90相関)。

問題: ほとんどの「ベッドルーム」ノイズ(ファンなど)をいくつかの手法でフィルタリングし、人間の耳では検出できないS / Nレベルで呼吸を確実に検出できることがよくあります。問題は音声ノイズです。バックグラウンドでテレビやラジオを走らせることは珍しくありません(または単に誰かが遠くで話していることもあります)。また、声のリズムは呼吸/いびきとほぼ一致します。実際、私はこのアプリを介して故作者/ストーリーテラーのビル・ホルムの録音を実行しましたが、それは本質的にリズム、レベルの変動性、および他のいくつかの測定のいびきと区別できませんでした。(少なくとも彼が起きている間は、睡眠時無呼吸がなかったようです。)

ですから、これは少し長めのショット(そしておそらくフォーラムのルールの延長)ですが、私は音声を区別する方法についていくつかのアイデアを探しています。いびきをなんとかフィルタリングする必要はありません(それはいいと思います)が、音声で過度に汚染された「ノイズが多すぎる」サウンドとして拒否する方法が必要なだけです。

何か案は?

公開されたファイル: dropbox.comにいくつかのファイルを配置しました:

最初の曲はかなりランダムなロック(おそらく)音楽で、2番目の曲は故ビルホルムのスピーチの録音です。両方(いびきと区別するために「ノイズ」のサンプルとして使用します)は、信号を難読化するためにノイズと混合されています。(これにより、それらを識別する作業は非常に困難になります。)3番目のファイルは、真に最初の3分の1がほとんど呼吸し、真ん中の3分の1が呼吸/いびきの混合で、最後の3分の1はかなり安定したいびきです。(ボーナスで咳が出ます。)

多くのブラウザではwavファイルのダウンロードが非常に難しくなるため、3つのファイルはすべて「.wav」から「_wav.dat」に名前が変更されました。ダウンロード後、名前を「.wav」に戻すだけです。

更新:エントロピーは私にとって「トリックをやっている」と思っていましたが、それは主に使用しているテストケースの特性であり、あまりにもうまく設計されていないアルゴリズムでした。一般的な場合、エントロピーは私にとってほとんど役に立たない。

その後、1秒間に約8回サンプリングされた(メインFFTサイクルから統計情報を取得して)信号全体の振幅(パワー、スペクトルフラックス、その他のいくつかの測定を試しました)のFFT(いくつかの異なるウィンドウ関数を使用)を計算する手法を試しましたこれは1024/8000秒ごとです)。1024サンプルでは、​​これは約2分の時間範囲をカバーします。いびき/呼吸対音声/音楽のリズムが遅いためにこのパターンを見ることができることを望んでいました(また、「変動性」問題に対処するより良い方法かもしれません)あちこちにあるパターンの、私が本当にラッチできるものは何もありません。

詳細:場合によっては、信号振幅のFFTは、約0.2Hzに強いピークと階段高調波を持つ非常に明確なパターンを生成します。しかし、ほとんどの場合、パターンはそれほど明確ではなく、音声と音楽はあまり明確に生成できません性能指数の相関値を計算する方法はあるかもしれませんが、約4次の多項式にカーブフィッティングする必要があり、電話で1秒に1回実行することは実用的ではないようです)

また、スペクトルを分割した5つの個別の「バンド」に対して、同じ平均振幅のFFTを実行しようとしました。バンドは4000-2000、2000-1000、1000-500、および500-0です。最初の4つのバンドのパターンは全体的なパターンとほぼ同じでした(ただし、実際の「目立つ」バンドはなく、より高い周波数帯域ではほとんど無視できるほど小さい信号でしたが)。

バウンティ: 彼がこれまでで最も生産的な提案であったことを考えると、彼は新しいものを何も提供していませんが、ネイサンにバウンティを与えるつもりです。しかし、他の誰かが良いアイデアを思いついたら、他の誰かに喜んで表彰したいと思ういくつかのポイントがあります。


2
代表的なスペクトログラムを投稿できますか?(データについて話しましょう。)「スペクトルの違い」をどのように計算していますか?
エムレ

「スペクトルの違い」は、「スペクトルフラックス」と呼ばれることもあります。基本的には、サウンドの連続するFFTの個人差の平方の合計です。
ダニエルRヒックス

2
考えてみると、オーディオクリップはさらに良いでしょう。説明をありがとう。
エムレ

私は最高のプレゼンテーションが何であるかを把握しようとしています。短いサンプルのスペクトル(実際のFFT以外)を行うための派手なソフトウェアはありません-Audacityには、個々のサウンドのスペクトルをキャプチャするのに長すぎるサンプルが必要です。また、実際の患者の音を投稿することには、医療上のプライバシーの問題がいくつかあります。
ダニエルRヒックス

1
@DanielRHicksはスペクトログラムにテレビといびきをかき、いびきをかくこと、またはそのようなものは本当に長い道のりを歩むでしょう。
スペイシー

回答:


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の周波数に対応します。〜186秒で咳に対応するスパイクがあります。無視してください。各いびきの間のノッチを漠然と見ることができます。それだけでなく、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でした)。茎はいびきをマークします。


ええ、私の現在のアルゴリズムは、ほぼ一定のレベルにあるFFTバケットをゼロにすることで、ハムやその他の高調波ノイズ(人工呼吸器のノイズは約110Hzになる傾向があります)をキャンセルします。「このサブバンドのエネルギーに基づいて信号を分類しましょう」と言うときの意味がわかりません。どのサブバンドを参照していますか?
ダニエルRヒックス

ああ、私はあなたが800 Hz以下について話しているのを見る-私はそのビットを見逃した。
ダニエルRヒックス

上のチャートを見ると、上部近くにかなりの量の情報があり、中間部のすぐ下に別のバンドがあることがわかります。そして、これらのバンドは競合するノイズがはるかに少ないです。私の現在のスキームでは、スペクトルをスライスし、各スライスのSNRを評価してから、それに応じて重み付けを試みます。
ダニエルRヒックス

選択したサブバンドのエネルギー、スペクトルの平坦度など、いくつかの特徴を連結して、仮の特徴ベクトルを作成できます。次に、最後のペーパーで説明したように、PCAを実行して、最も重要なものを見つけます。
エムレ

それは基本的に私がやっていることで、PCAの厳密さはありません。
ダニエルRヒックス

9

すべての可能性をカバーするためにここに投げ込むだけで、エントロピーを使用できるかもしれません。いびきとスピーチのエントロピーレベルが何であるかはわかりませんが、それが十分に異なる場合は動作します。 http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf


私はそれで何をしているのか完全には理解していません(情報理論は頭を爆発させます)が、私は粗エントロピー計算を実装し、少し非完全に理論的な正規化を行い、機能しているようです。いびきが著しく高いのに対して、音楽と音声のエントロピーは低くなります。一般に、バックグラウンドノイズは(負の)値を減少させるように見えるため、かなり良い性能指数を提供します。ただし、さらに実験が必要です。
ダニエルRヒックス

注意すべきことの1つは、単純なレベルゲートも含める必要があることです。通過しようとしているものと一致する可能性のある非常に低いレベルのバックノイズが発生する可能性があるため、私の経験では、極端な低レベルノイズは、低レベルでは可能なサンプル値の数が減り、エントロピーだけでは振幅の違いが考慮されないため、信号の次数が増加する可能性があります。
ネイサンデイ

ええ、私は定期的にノイズとの戦いをしており、それを個別に測定するかなり良い方法があります。ノイズがあるレベルを超えるとパントします。(実際、ノイズを測定するのは驚くほど難しいです。)
ダニエルRヒックス

残念ながら、粗いエントロピー計算で測定していたものの多くは、計算のアーティファクトであることがわかりました(テストデータのゼロのため)。それは私の必要性のためにかなりうまくいきますが、最初に思ったほどうまくいきません。
ダニエルRヒックス

フォローアップ:使用していた固定/浮動FFTを完全な浮動小数点1(レベルが低い場合はゼロを生成しない)に置き換え、エントロピーの有用性はさらに下になりました-しません特に有用なものを提供するようです。
ダニエルRヒックス

3

おそらく時間領域の統計?いびきは比較的長い定常状態の期間を持っているようですが、音声エネルギーは短時間でかなり変化します。これは、スペクトル分析と組み合わせることもできます。母音は低周波成分が多く、子音は高周波が多くなります。スピーチ中、スペクトルはそれらの状態間をすばやく前後にバウンドする場合がありますが、保存は長期間にわたって1つの状態のままになる場合があります。


基本的な時間領域の統計は区別できません。ただし、短期的な変動(通常は平滑化)を確認できるのは良い点です。周波数帯域間の「跳ね返り」を探すことも良い考えです...私は現在5つの帯域に分割し、明らかに低いS / Nを持つ帯域を拒否します。
ダニエルRヒックス

@DanielRHicks ケプストラム包絡線をどこか他の場所で計算する方法を見ましたが、ケプストラムはより滑らかになる傾向がある一方、より「ノイズ/ギザギザ」になる純粋なスペクトルの代わりに、スペクトル変動性の尺度としてそれを使用できます。また、Mel-Frequencyケプストラムが音声認識で使用されていることも聞いたことがありますが、これはあなたにとって役に立つかもしれません。
スペイシー

@DanielRHicks:どの方法で区別できませんか?確かに私には区別できます。
endolith

@endolith-私の現在のメトリックを考えると、区別できません-「スペクトルの差」と全体的なエネルギーレベル。ただし、約0.5秒の時定数でローパスフィルター処理されます。フィルタリングされていないデータを少し見てみようと思います。
ダニエルRヒックス

短時間の統計情報をキャプチャすることに挑戦しました。いくつかの「ヒント」がありますが、決定的なものはありません。
ダニエルRヒックス

1

経時的なスペクトルの複雑さ。人間の音声はおそらくより多くの音素を使用し、いびきの音素シーケンスよりもシーケンスの統計的複雑さがはるかに大きいと仮定します。

これはおそらく、連続音声認識よりもはるかに簡単な問題です。特定の音素または文を実際に正しく認識する必要はなく、音素サウンディングスペクトルセグメントの数、およびそれらのシーケンスの統計的複雑度測定(エントロピーまたは圧縮性テストが機能する可能性があります)。次に、これらの測定値の信頼できるしきい値を決定できるかどうかを確認します。


問題は、いびきが驚くほど複雑/ランダムであり、そのスペクトルを調べたとき、いびきがはっきりした特徴をほとんど持っていないことです。
ダニエルRヒックス

眠っている人が、目を覚まして話しているときのように眠っている間に、多くの異なる母音のフィルターと破裂音(および時間の経過とともにそのような有向グラフと三重グラフ)、およびピッチの変曲(など)を形成した場合、興味深い情報になります。
hotpaw2

機能の欠如は重要な機能になる可能性があります。音声には機能があります。
hotpaw2

問題の1つは、いびきが呼吸ごとに大きく異なる可能性があることです。単純な重い息は非常に「白」ですが、いびきには非常に強いスパイクがある場合があります。それは本質的に方形波ですが、それは単純化しすぎています。また、スマートフォンでリアルタイムに分析を行う必要があるため、アルゴリズムの複雑さが制限されます。
ダニエルRヒックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.