Làm thế nào để phân biệt giọng nói với ngáy?


22

Bối cảnh: Tôi đang làm việc trên một ứng dụng iPhone (được nhắc đến trong một số bài đăng khác ) rằng "nghe" ngáy / thở khi đang ngủ và xác định xem có dấu hiệu ngưng thở khi ngủ không (như một màn hình trước cho "phòng thí nghiệm ngủ" kiểm tra). Ứng dụng chủ yếu sử dụng "sự khác biệt quang phổ" để phát hiện tiếng ngáy / hơi thở và nó hoạt động khá tốt (tương quan khoảng 0,85--0,90) khi thử nghiệm với các bản ghi trong phòng thí nghiệm ngủ (thực sự khá ồn).

Vấn đề: Hầu hết tiếng ồn "phòng ngủ" (quạt, v.v.) tôi có thể lọc qua một số kỹ thuật và thường phát hiện hơi thở một cách đáng tin cậy ở mức S / N mà tai người không thể phát hiện ra. Vấn đề là tiếng ồn. Không có gì lạ khi có tivi hoặc radio chạy ở chế độ nền (hoặc đơn giản là có ai đó nói chuyện từ xa), và nhịp điệu của giọng nói rất khớp với nhịp thở / ngáy. Trên thực tế, tôi đã chạy một bản ghi âm của tác giả / người kể chuyện quá cố Bill Holm thông qua ứng dụng và về cơ bản nó không thể phân biệt được với ngáy theo nhịp điệu, sự thay đổi mức độ và một số biện pháp khác. (Mặc dù tôi có thể nói rằng rõ ràng anh ta không bị ngưng thở khi ngủ, ít nhất là trong khi không tỉnh táo.)

Vì vậy, đây là một chút của một cú sút xa (và có lẽ là một loạt các quy tắc diễn đàn), nhưng tôi đang tìm kiếm một số ý tưởng về cách phân biệt giọng nói. Chúng ta không cần phải lọc những tiếng ngáy bằng cách nào đó (nghĩ rằng điều đó sẽ tốt), nhưng chúng ta chỉ cần một cách để từ chối vì âm thanh "quá ồn" bị ô nhiễm quá mức với giọng nói.

Có ý kiến ​​gì không?

Các tệp được xuất bản: Tôi đã đặt một số tệp trên dropbox.com:

Đầu tiên là một bản nhạc rock (tôi đoán) khá ngẫu nhiên, và thứ hai là bản thu âm của bài phát biểu muộn của Bill Holm. Cả hai (mà tôi sử dụng làm mẫu "nhiễu" của tôi được phân biệt với tiếng ngáy) đã được trộn lẫn với tiếng ồn để làm nhiễu tín hiệu. . (Bạn bị ho vì tiền thưởng.)

Tất cả ba tệp đã được đổi tên từ ".wav" thành "_wav.dat", vì nhiều trình duyệt khiến việc tải xuống các tệp wav trở nên khó khăn một cách điên cuồng. Chỉ cần đổi tên chúng thành ".wav" sau khi tải xuống.

Cập nhật: Tôi nghĩ rằng entropy là "thực hiện mánh khóe" đối với tôi, nhưng hóa ra chủ yếu là đặc thù của các trường hợp thử nghiệm mà tôi đang sử dụng, cộng với một thuật toán được thiết kế quá tốt. Trong trường hợp chung, entropy đang làm rất ít cho tôi.

Sau đó, tôi đã thử một kỹ thuật trong đó tôi tính toán FFT (sử dụng một số chức năng cửa sổ khác nhau) về cường độ tín hiệu tổng thể (tôi đã thử công suất, thông lượng quang phổ và một số biện pháp khác) lấy mẫu khoảng 8 lần một giây (lấy số liệu thống kê từ chu kỳ FFT chính đó là cứ sau 1024/8000 giây). Với 1024 mẫu, điều này bao gồm một phạm vi thời gian khoảng hai phút. Tôi đã hy vọng rằng tôi có thể nhìn thấy các mô hình trong trường hợp này do nhịp điệu chậm của tiếng ngáy / hơi thở so với giọng nói / âm nhạc (và đó cũng có thể là một cách tốt hơn để giải quyết vấn đề " thay đổi "), nhưng trong khi có những gợi ý của một mô hình ở đây và ở đó, không có gì tôi thực sự có thể bám vào.

( Thông tin thêm: Đối với một số trường hợp, FFT của cường độ tín hiệu tạo ra một mẫu rất khác biệt với cực đại mạnh ở khoảng 0,2Hz và hài bậc cầu thang. Nhưng hầu hết thời gian, mẫu và âm nhạc có thể tạo ra ít khác biệt hơn Các phiên bản của một mẫu tương tự. Có thể có một số cách để tính giá trị tương quan cho một bằng khen, nhưng có vẻ như sẽ yêu cầu đường cong phù hợp với đa thức bậc 4, và làm điều đó một lần trong điện thoại có vẻ không thực tế.)

Tôi cũng đã cố gắng thực hiện cùng một FFT biên độ trung bình cho 5 "dải" riêng lẻ mà tôi đã chia phổ thành. Các băng tần là 4000-2000, 2000-1000, 1000-500 và 500-0. Mẫu cho 4 băng tần đầu tiên nhìn chung tương tự như mẫu tổng thể (mặc dù không có băng tần "nổi bật" thực sự và tín hiệu nhỏ thường biến mất ở các dải tần số cao hơn), nhưng băng tần 500-0 nói chung chỉ là ngẫu nhiên.

Bounty: Tôi sẽ mang lại cho Nathan tiền thưởng, mặc dù anh ta không đưa ra bất cứ điều gì mới, cho rằng đó là gợi ý hữu ích nhất cho đến nay. Tuy nhiên, tôi vẫn có một vài điểm tôi sẵn sàng trao cho người khác, nếu họ thông qua một số ý tưởng hay.


2
Bạn có thể gửi một số quang phổ đại diện? (Hãy để dữ liệu nói chuyện.) Bạn đang tính toán "sự khác biệt phổ" như thế nào?
Emre

"Sự khác biệt phổ" đôi khi được gọi là "thông lượng quang phổ" và một vài thuật ngữ khác. Về cơ bản, nó là tổng của các bình phương của sự khác biệt cá nhân trong các FFT liên tiếp của âm thanh.
Daniel R Hicks

2
Hãy nghĩ về nó, clip âm thanh sẽ còn tốt hơn. Cảm ơn bạn đã làm rõ.
Emre

Tôi đang cố gắng tìm ra bài thuyết trình tốt nhất sẽ là gì. Tôi không có phần mềm ưa thích để thực hiện phổ (trừ FFT thực tế của tôi) cho các mẫu ngắn - Audacity yêu cầu mẫu quá dài để thu được phổ của âm thanh riêng lẻ. Và có một số vấn đề riêng tư y tế với việc đăng âm thanh bệnh nhân thực tế.
Daniel R Hicks

1
@DanielRHicks Quang phổ với TV + ngáy và chỉ ngáy hoặc đôi khi như thế sẽ thực sự đi một chặng đường dài.
Spacey

Câu trả lời:


10

Lý lịch

Theo các bài báo dưới đây, ngáy được đặc trưng bởi một đỉnh ở khoảng 130Hz và tập trung hoàn toàn dưới 12kHz:

Hãy xem liệu chúng ta có thể tận dụng điều này.

Ví dụ MATLAB

Chúng tôi có một bản ghi kém của một đứa trẻ ngáy ; một tệp WAV đơn âm 10 phút, 8 bit. Tốc độ lấy mẫu là 8KHz, có nghĩa là băng thông của tín hiệu âm thanh là 4KHz. Mức độ rất thấp vì vậy tôi sẽ hoàn thành nó trước.

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

Toàn phổ

Trục y được chuẩn hóa theo băng thông, 4KHz, do đó, mức độ bạn nhìn thấy ở 0,1 tương ứng với tần số 400Hz. Có một đột biến tương ứng với ho ở ~ 186s; bỏ qua điều đó Chúng ta có thể mơ hồ nhìn thấy các rãnh trong mỗi lần ngáy. Không chỉ vậy, nhưng chúng dường như tập trung dưới 0,2 x 4KHz = 800Hz. Hãy xem xét kỹ hơn.

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

Thu phóng phổ đến 0-800Hz.

Lần này trục tần số được dán nhãn bằng Hertz. Bây giờ các rãnh khá rõ ràng. Chúng ta thậm chí có thể thấy các âm bội của nhiễu dòng điện bắt đầu ở 60Hz (180Hz, 300Hz, 420Hz). Bây giờ đến bản chất của thuật toán: hãy phân loại tín hiệu dựa trên năng lượng trong băng con này, với nhiễu đường truyền được loại bỏ.

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

Nếu chúng ta muốn có được sự ưa thích, chúng ta có thể loại bỏ các gai quá khổ:

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

Âm mưu của năng lượng trong băng con có dấu 0-800Hz

Kết quả cuối cùng

SNR thấp, biểu hiện ở sự khó khăn trong việc làm sáng tỏ tín hiệu trong âm mưu đầu tiên, có nghĩa là chúng ta có độ trễ chỉ bằng một nửa độ lệch chuẩn (giá trị là 4,1). Các thân cây đánh dấu ngáy.


Vâng, thuật toán hiện tại của tôi loại bỏ tiếng ồn hum và tiếng ồn hài hòa khác (tiếng ồn của máy thở có xu hướng khoảng 110Hz) bằng cách loại bỏ các thùng FFT ở mức độ ít nhiều không đổi. Tôi không rõ ý của bạn khi bạn nói "hãy phân loại tín hiệu dựa trên năng lượng trong băng con này" - bạn đang đề cập đến băng con nào?
Daniel R Hicks

Ồ, tôi hiểu rồi, bạn đang nói về khoảng dưới 800 Hz - Tôi đã bỏ lỡ chút đó.
Daniel R Hicks

Nếu bạn nhìn vào biểu đồ phía trên của bạn, bạn sẽ thấy rằng có khá nhiều thông tin ở gần đầu và một ban nhạc khác ngay dưới giữa. Và các ban nhạc có tiếng ồn cạnh tranh ít hơn nhiều. Lược đồ hiện tại của tôi cắt phổ và cố gắng đánh giá SNR của từng lát, sau đó cân chúng cho phù hợp.
Daniel R Hicks

Bạn có thể ghép một số tính năng, chẳng hạn như năng lượng trong các băng con được chọn, độ phẳng của quang phổ, v.v để tạo ra một vectơ đặc trưng dự kiến. Sau đó thực hiện PCA để tìm ra cái nào quan trọng nhất, như được giải thích trong bài báo trước.
Emre

Về cơ bản đó là những gì tôi đang làm, vắng mặt sự nghiêm ngặt của PCA.
Daniel R Hicks

9

Chỉ cần ném cái này vào đây để bao quát tất cả các khả năng, bạn có thể sử dụng entropy, tôi không biết mức độ entropy của ngáy so với lời nói là gì nhưng nếu nó đủ khác có thể hoạt động. http://www.ee.columbia.edu/~dpwe/ con /ShenHL98-endpoint.pdf


Tôi hoàn toàn không hiểu những gì tôi đang làm với nó (lý thuyết thông tin làm cho đầu tôi nổ tung), nhưng tôi đã thực hiện một phép tính entropy thô thiển, ném vào một chút bình thường hóa hoàn toàn phi lý thuyết, và nó dường như đang hoạt động. Âm nhạc và giọng nói có một entropy thấp (tiêu cực), trong khi ngáy cao hơn đáng kể. Và tiếng ồn nền nói chung dường như làm giảm giá trị (âm), do đó nó cung cấp một công đức khá tốt. Cần nhiều thử nghiệm hơn, mặc dù.
Daniel R Hicks

Một điều cần cẩn thận là bạn cũng cần bao gồm một cổng mức đơn giản vì bạn có thể có tiếng ồn trở lại mức cực thấp có thể phù hợp với những gì bạn đang cố gắng vượt qua, cũng như kinh nghiệm của tôi cho thấy định lượng số nhiễu mức cực thấp có thể làm tăng khoảng thứ tự trong tín hiệu, vì ở mức thấp, số lượng giá trị mẫu có thể giảm và riêng entropy không xem xét sự khác biệt về biên độ.
Ngày của

Vâng, tôi thường xuyên chiến đấu với tiếng ồn, và có một cách khá hay để đánh giá riêng điều đó. Khi tiếng ồn vượt quá một mức nhất định tôi punt. (Thật sự rất khó để đo tiếng ồn.)
Daniel R Hicks

Than ôi, tôi đã phát hiện ra rằng phần lớn những gì tôi đang đo bằng phép tính entropy thô của tôi là một sự giả tạo của phép tính (do các số không trong dữ liệu thử nghiệm). Nó sắp xếp theo nhu cầu của tôi, nhưng không độc đáo như tôi nghĩ đầu tiên.
Daniel R Hicks

Theo dõi: Tôi đã thay thế FFT cố định / thả nổi mà tôi đang sử dụng bằng một điểm nổi hoàn toàn (không tạo ra số không khi mức thấp) và tính hữu ích của entropy đã đi sâu hơn vào các ống - không xuất hiện để cung cấp bất cứ điều gì đặc biệt hữu ích.
Daniel R Hicks

3

Thống kê miền thời gian có lẽ? Ngáy dường như có trạng thái ổn định tương đối dài trong khi năng lượng giọng nói thay đổi khá nhiều trong khoảng thời gian ngắn. Điều này có thể được kết hợp với phân tích quang phổ là tốt. Nguyên âm có nội dung tần số thấp hơn và phụ âm tần số cao hơn. Trong khi nói, phổ có thể nhanh chóng bật qua lại giữa các trạng thái đó trong khi lưu trữ có thể ở một trạng thái trong thời gian dài hơn.


Các thống kê miền thời gian cơ bản không thể phân biệt. Tuy nhiên, đó là một điểm tốt mà tôi có thể nhìn vào sự biến động ngắn hạn (mà tôi thường làm dịu đi). Tìm kiếm sự "nảy" giữa các dải tần số cũng là một ý tưởng hay ... Tôi hiện đang chia thành 5 dải và loại bỏ các dải có S / N thấp rõ ràng.
Daniel R Hicks

@DanielRHicks Tôi đã thấy cách tính đường bao cepstral ở một nơi khác, nhưng có lẽ bạn có thể sử dụng nó như một thước đo độ biến thiên phổ của bạn thay vì quang phổ thuần túy sẽ 'ồn ào / lởm chởm' hơn trong khi cepstrum . Tôi cũng đã nghe cepstrum Mel-Tần số được sử dụng trong recog giọng nói, và điều này nghe có vẻ như tôi có thể sử dụng cho bạn.
Spacey

@DanielRHicks: Không thể phân biệt bằng phương pháp nào? Họ chắc chắn có thể phân biệt với tôi.
endolith

@endolith - Không thể phân biệt được với các số liệu hiện tại của tôi - "sự khác biệt phổ" cộng với mức năng lượng tổng thể. Nhưng chúng được lọc thông thấp với hằng số thời gian 0,5 giây. Tôi nghĩ rằng tôi sẽ thử nhìn vào dữ liệu chưa được lọc một chút.
Daniel R Hicks

Tôi đã có một cơ hội để nắm bắt các số liệu thống kê thời gian ngắn. Một số "gợi ý", nhưng không có gì dứt khoát.
Daniel R Hicks

1

Độ phức tạp phổ theo thời gian. Tôi sẽ đưa ra giả thuyết rằng lời nói của con người có thể sử dụng nhiều âm vị hơn và với độ phức tạp thống kê lớn hơn nhiều trong trình tự của họ so với trình tự âm vị của tiếng ngáy.

Đây có lẽ là một vấn đề dễ dàng hơn nhiều so với nhận dạng giọng nói liên tục, vì bạn sẽ không thực sự nhận ra bất kỳ âm vị hoặc câu cụ thể nào một cách chính xác, chỉ có số phân đoạn phổ âm vị âm thanh và một số phép đo độ phức tạp thống kê của các chuỗi của chúng (một entropy hoặc kiểm tra độ nén có thể làm việc). Sau đó xem nếu bạn có thể xác định một ngưỡng đáng tin cậy cho các biện pháp này.


Vấn đề là ngáy rất phức tạp / ngẫu nhiên và thiếu nhiều tính năng khác biệt khi phổ của nó được kiểm tra.
Daniel R Hicks

Sẽ là một thông tin thú vị nếu một người ngủ hình thành nhiều bộ lọc và nguyên âm giả khác nhau (và các bản tóm tắt và phân tích như vậy với mật độ theo thời gian), và bơm hơi (v.v.), trong khi ngủ như khi thức và nói.
hotpaw2

Việc thiếu các tính năng có thể là một tính năng quan trọng. Bài phát biểu có tính năng.
hotpaw2

Một vấn đề là ngáy có thể thay đổi rất nhiều, từ hơi thở này sang hơi thở tiếp theo. Một hơi thở nặng nề đơn giản là rất "trắng", nhưng một tiếng ngáy có thể có một số gai rất mạnh. Nó thực chất là một sóng vuông, mặc dù đó là một sự đơn giản hóa quá mức. Và chúng ta cần thực hiện phân tích trong thời gian thực trên điện thoại thông minh, do đó độ phức tạp của thuật toán bị hạn chế.
Daniel R Hicks
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.