코골이와 음성을 구별하는 방법?


22

배경 : 나는 잠자는 동안 코골이 / 호흡을 "듣고"수면 무호흡 징후 ( "수면 실험실"의 사전 화면으로 표시)를 결정 하는 iPhone 응용 프로그램 ( 여러 다른 게시물 에서 언급)에서 작업 하고 있습니다. 테스트). 이 응용 프로그램은 주로 코골이 / 호흡을 탐지하기 위해 "스펙트럼 차이"를 사용하며 수면 실험실 기록 (실제로는 시끄러운 소음)에 대해 테스트 할 때 상당히 효과적입니다 (약 0.85--0.90 상관 관계).

문제점 : 대부분의 "침실"소음 (팬 등) 여러 기술을 통해 걸러 낼 수 있으며 종종 사람의 귀가 감지 할 수없는 S / N 수준에서 호흡을 안정적으로 감지합니다. 문제는 음성 잡음입니다. 텔레비전이나 라디오가 백그라운드에서 실행되는 것 (또는 단순히 누군가가 멀리서 말하는 것)이 드문 일이 아니며, 목소리의 리듬이 호흡 / 코골음과 밀접하게 일치합니다. 사실, 필자는 필자 저자 인 빌 홀름 (Bill Holm)을 앱을 통해 녹음했으며, 리듬, 레벨 변동성 및 기타 여러 가지 방법으로 코골이하는 것과 본질적으로 구별 할 수 없었습니다. (물론 적어도 깨어있는 동안에는 수면 무호흡증이 없었습니다.)

그래서 이것은 약간 긴 샷 (그리고 아마도 포럼 규칙의 연장)이지만 음성을 구별하는 방법에 대한 아이디어를 찾고 있습니다. 우리는 어떻게 든 코골이를 걸러 낼 필요는 없지만 (좋은 것으로 생각 될 수도 있음) 오히려 지나치게 지나치게 오염 된 "너무 시끄러운"소리를 거부하는 방법이 필요합니다.

어떤 아이디어?

게시 된 파일 : dropbox.com에 일부 파일을 배치했습니다.

첫 번째는 다소 무작위적인 록 음악이고, 두 번째는 빌 홀름 말의 녹음입니다. 둘 다 (소음의 샘플로 사용되는 코골이와 구별됨) 두 가지 신호를 혼동시키기 위해 노이즈와 혼합되었습니다. (이것으로 파일을 식별하는 작업이 훨씬 더 어려워집니다.) 세 번째 파일은 첫 번째 1/3이 대부분 호흡하고 중간 3 분의 1이 혼합 호흡 / 코골이이고 마지막 3 분의 1이 상당히 안정적인 코골이를 기록하는 10 분 분량의 기록입니다. (여러분은 기침을합니다.)

많은 브라우저에서 wav 파일을 다운로드하기가 어렵 기 때문에 세 파일 모두 ".wav"에서 "_wav.dat"로 이름이 바뀌 었습니다. 다운로드 후 ".wav"로 다시 이름을 바꾸십시오.

업데이트 : 엔트로피가 나를 위해 "트릭을하는 것"이라고 생각했지만, 내가 사용하고있는 테스트 사례의 특성과 너무 잘 설계되지 않은 알고리즘으로 밝혀졌습니다. 일반적으로 엔트로피는 나를 위해 거의하지 않습니다.

그런 다음 초당 약 8 번 샘플링 된 전체 신호 크기 (전력, 스펙트럼 플럭스 및 기타 여러 측정 값)의 FFT (여러 다른 창 기능 사용)를 계산하는 기술을 시도했습니다 (주 FFT 사이클에서 통계 가져 오기) 1024/8000 초마다). 1024 개 샘플의 경우 약 2 분의 시간 범위가 포함됩니다. 나는 코골이 / 호흡 대 음성 / 음악의 느린 리듬으로 인해 이것에서 패턴을 볼 수 있기를 바 랐고 (또한 " 변이성 "문제 를 해결하는 더 좋은 방법 일 수 있음 ) 힌트가 있지만 여기저기서 패턴을 만들 수 있습니다.

( 추가 정보 : 경우에 따라 신호 크기의 FFT는 약 0.2Hz에서 강한 피크와 계단 형 고조파를 갖는 매우 뚜렷한 패턴을 생성하지만 패턴은 대부분 거의 구별되지 않으며 음성과 음악은 덜 뚜렷하게 생성 될 수 있습니다. 성능 지수에 대한 상관 관계 값을 계산할 수있는 방법이있을 수 있지만 약 4 차 다항식에 대한 곡선 맞춤이 필요하고 전화기에서 1 초에 한 번 수행하는 것은 실용적이지 않은 것으로 보입니다.)

또한 스펙트럼을 나눈 5 개의 개별 "대역"에 대해 동일한 평균 진폭의 FFT를 시도했습니다. 밴드는 4000-2000, 2000-1000, 1000-500 및 500-0입니다. 처음 4 개의 대역에 대한 패턴은 일반적으로 전체 패턴과 유사하지만 (실제 "스탠드 아웃"대역이없고 종종 고주파 대역에서 소멸하는 작은 신호가 있지만) 500-0 대역은 일반적으로 임의입니다.

바운티 : 나단에게 지금까지 가장 생산적인 제안 이었기 때문에 새로운 것을 제공하지는 않았지만 나단에게 바운티 를 줄 것입니다. 그래도 좋은 아이디어를 얻었 으면 다른 사람에게 기꺼이 수여 할 몇 가지 요점이 있습니다.


2
대표적인 스펙트로 그램을 게시 할 수 있습니까? "데이터 차이를 말합시다." "스펙트럼 차이"를 어떻게 계산합니까?
Emre

"스펙트럼 차이"는 때때로 "스펙트럼 플럭스"및 몇 가지 다른 용어로 지칭된다. 기본적으로 사운드의 연속적인 FFT에서 개별 차이의 제곱의 합입니다.
Daniel R Hicks

2
오디오 클립이 더 나을 것입니다. 설명해 주셔서 감사합니다.
Emre

최고의 프레젠테이션이 무엇인지 파악하려고합니다. 짧은 샘플에 대해 스펙트럼 (실제 FFT 제외)을 수행 할 멋진 소프트웨어가 없습니다 .Audacity는 개별 사운드의 스펙트럼을 캡처하기에는 너무 긴 샘플이 필요합니다. 그리고 실제 환자 소리를 게시 할 때 일부 의료 프라이버시 문제가 있습니다.
Daniel R Hicks

1
@DanielRHicks TV + 스노 어가있는 스펙트로 그램과 코골이 또는 그와 비슷한 것이 실제로 먼 길을 갈 것입니다.
Spacey

답변:


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의 기침에 해당하는 스파이크가 있습니다. 무시하십시오. 우리는 각 코골이 동안 노치를 볼 수 있습니다. 뿐만 아니라 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로 확대 / 축소합니다.

이번에는 주파수 축이 Hertz로 표시되었습니다. 이제 노치는 매우 분명합니다. 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 인 경향이 있음)를 취소합니다. "이 서브 밴드의 에너지를 기준으로 신호를 분류합시다"라고 말할 때 무슨 의미인지 잘 모르겠습니다. 무슨 서브 밴드를 말하고 있습니까?
Daniel R Hicks

아, 알다시피, 당신은 800Hz 이하에 대해 이야기하고 있습니다.
Daniel R Hicks

상단 차트를 보면 상단 근처에 약간의 정보가 있고 중간 바로 아래에 다른 밴드가 있음을 알 수 있습니다. 그리고이 대역들은 경쟁 소음이 훨씬 적습니다. 내 현재 체계는 스펙트럼을 슬라이스하고 각 슬라이스의 SNR을 평가 한 다음 그에 따라 가중치를 부여합니다.
Daniel R Hicks

선택 서브 밴드의 에너지, 스펙트럼 평탄도 등과 같은 여러 특징을 연결하여 임시 특징 벡터를 생성 할 수 있습니다. 그런 다음 마지막 백서에서 설명한대로 PCA를 수행하여 가장 중요한 것을 찾으십시오.
Emre

PCA의 엄격함이 없다면 기본적으로 내가하고있는 일입니다.
다니엘 R,

9

여기에 모든 가능성을 다루기 위해 이것을 던지면 엔트로피를 사용할 수 있습니다. 코골이 대 언어의 엔트로피 수준이 무엇인지 알지 못하지만 그것이 충분히 다른 경우에는 효과가 있습니다. http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf


나는 내가하고있는 일을 완전히 이해하지 못하지만 (정보 이론은 머리를 폭발시킨다), 나는 조잡한 엔트로피 계산을 구현하고, 완전히 이론이 아닌 정규화를 던졌으며 작동하는 것처럼 보인다. 음악과 음성은 엔트로피가 낮고 코골이는 훨씬 높습니다. 그리고 일반적으로 백그라운드 노이즈는 (음수) 값을 낮추는 것처럼 보이므로 꽤 좋은 성능 수치를 제공합니다. 그러나 더 많은 실험이 필요했습니다.
Daniel R Hicks

주의해야 할 한 가지는 간단한 레벨 게이트도 포함해야한다는 것입니다. 왜냐하면 당신이 통과하려고하는 물건과 일치 할 수있는 매우 낮은 레벨의 백 노이즈를 가질 수 있기 때문에 내 경험은 낮은 레벨에서는 가능한 샘플 값의 수가 줄어들고 엔트로피만으로는 진폭의 차이를 고려하지 않기 때문에 극단적 인 낮은 레벨의 노이즈는 신호의 차수를 증가시킬 수 있습니다.
Nathan Day

그래, 나는 정기적으로 소음과 싸우고 있으며, 그것을 별도로 측정하는 좋은 방법이 있습니다. 소음이 특정 수준을 초과하면 나는 펀트합니다. (실제로 소음을 측정하는 것은 놀랍습니다.)
Daniel R Hicks

아아, 나는 내 조잡한 엔트로피 계산으로 측정하는 것의 많은 부분이 계산의 인공물 (테스트 데이터의 0으로 인해)이라는 것을 발견했다. 그것은 내 필요에 따라 작동하지만 처음 생각했던 것만 큼 훌륭하지는 않습니다.
Daniel R

후속 조치 : 사용중인 고정 / 부동 FFT를 전체 부동 소수점 1로 대체하고 (레벨이 낮을 때 0을 생성하지 않음) 엔트로피의 유용성이 튜브 아래로 내려갔습니다. 특히 유용한 것을 제공하는 것으로 보입니다.
Daniel R은

3

아마도 시간 영역 통계? 코골이는 비교적 오랜 기간 동안 안정된 상태를 유지하는 반면, 음성 에너지는 단기간에 걸쳐 상당히 변합니다. 이것은 스펙트럼 분석과 결합 될 수도 있습니다. 모음은 더 낮은 주파수 내용과 더 높은 자음을 갖습니다. 스피치 동안, 스펙트럼은 이들 상태들 사이에서 빠르게 앞뒤로 튀어 나오는 반면, 저장은 더 오랜 기간 동안 하나의 상태로 유지 될 수있다.


기본 시간 영역 통계는 구분할 수 없습니다. 그러나 단기 변동성 (보통 부드럽게 처리)을 볼 수있는 것이 좋습니다. 주파수 대역 사이의 "수신 거부"를 찾는 것도 좋은 생각입니다. 저는 현재 5 개의 대역으로 나누고 S / N이 낮은 대역을 거부합니다.
Daniel R Hicks

@DanielRHicks 나는 다른 곳 에서 두피 봉투 를 계산하는 방법을 보았지만 아마도 더 시끄럽고 들쭉날쭉 한 순수한 스펙트럼 대신 스펙트럼 변동성의 척도로 사용할 수 있습니다. 두뇌는 더 매끄 럽습니다. . 또한 Mel-Frequency cepstrum 이 음성 녹음에 사용된다고 들었습니다. 이것이 여러분에게 유용 할 것 같습니다.
Spacey

@DanielRHicks : 어떤 방법으로 구별 할 수 없습니까? 그들은 저에게 확실히 구별됩니다.
endolith

@endolith-나의 현재 측정 항목과 구별 할 수없는 "스펙트럼 차이"+ 전체 에너지 레벨. 그러나 약 0.5 초의 시간 상수로 저역 통과 필터링됩니다. 필터링되지 않은 데이터를 조금 보려고합니다.
Daniel R은

단기 시간 통계를 캡처했습니다. 일부는 "힌트"이지만 결정적인 것은 없습니다.
다니엘 R cks

1

시간이 지남에 따라 스펙트럼 복잡성. 나는 인간의 말이 아마도 더 많은 음소를 사용하고, 코골이 음소 시퀀스보다 시퀀싱에서 통계적으로 훨씬 더 복잡하다는 가설을 세울 것이다.

실제로 특정 음소 나 문장을 정확하게 인식 할 필요가없고 음소가 들리는 스펙트럼 세그먼트의 수와 시퀀스의 통계적 복잡성 측정 (엔트로피 또는 압축성 테스트가 작동 할 수 있습니다). 그런 다음 이러한 측정 값에 대한 신뢰할 수있는 임계 값을 결정할 수 있는지 확인하십시오.


문제는 코골이가 엄청나게 복잡하고 무작위 적이며 스펙트럼을 조사 할 때 뚜렷한 특징이 부족하다는 것입니다.
Daniel R은

잠든 사람이 깨어 있고 말을 할 때처럼 잠을 자면서 다른 모음 모음 필터와 파열음 (그리고 시간이 지남에 따라 밀도와 같은 이력서와 삼 변형)과 음높이 변화 (등) 등을 형성했다면 흥미로운 정보가 될 것입니다.
hotpaw2

기능 부족은 중요한 기능 일 수 있습니다. 연설에는 기능이 있습니다.
hotpaw2

한 가지 문제는 코골이가 호흡마다 크게 다를 수 있다는 것입니다. 간단한 심한 호흡은 "백색"이지만 코골이는 매우 강한 스파이크를 가질 수 있습니다. 그것은 본질적으로 구형파이지만 지나치게 단순화 된 것입니다. 또한 스마트 폰에서 실시간으로 분석을 수행해야하므로 알고리즘의 복잡성이 제한됩니다.
다니엘 R
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.