Cách đơn giản nhất để phát hiện nơi phong bì âm thanh bắt đầu và dừng lại


43

Dưới đây là một tín hiệu đại diện cho một bản ghi âm của một ai đó nói chuyện. Tôi muốn tạo ra một loạt các tín hiệu âm thanh nhỏ hơn dựa trên điều này. Ý tưởng là phát hiện khi nào âm thanh 'quan trọng' bắt đầu và kết thúc và sử dụng chúng cho các điểm đánh dấu để tạo ra đoạn âm thanh mới. Nói cách khác, tôi muốn sử dụng khoảng im lặng làm chỉ báo khi âm thanh 'chunk' bắt đầu hoặc dừng và tạo bộ đệm âm thanh mới dựa trên điều này.

Vì vậy, ví dụ, nếu một người ghi lại chính mình nói

Hi [some silence] My name is Bob [some silence] How are you?

sau đó tôi muốn làm ba clip âm thanh từ đây. Một mà nói Hi, một nói My name is Bobvà một nói How are you?.

Ý tưởng ban đầu của tôi là chạy qua bộ đệm âm thanh liên tục kiểm tra nơi có các khu vực có biên độ thấp. Có lẽ tôi có thể làm điều này bằng cách lấy mười mẫu đầu tiên, lấy giá trị trung bình và nếu kết quả thấp thì gắn nhãn là im lặng. Tôi sẽ tiến hành đệm xuống bằng cách kiểm tra mười mẫu tiếp theo. Tăng theo cách này tôi có thể phát hiện nơi phong bì bắt đầu và dừng lại.

Nếu bất cứ ai có lời khuyên về một cách tốt, nhưng đơn giản để làm điều này sẽ là tuyệt vời. Đối với mục đích của tôi, giải pháp thể khá thô sơ.

Tôi không phải là một chuyên gia tại DSP, nhưng hiểu một số khái niệm cơ bản. Ngoài ra, tôi sẽ thực hiện việc này theo chương trình để tốt nhất là nói về thuật toán và mẫu kỹ thuật số.

Cảm ơn vì sự giúp đỡ!

nhập mô tả hình ảnh ở đây


CHỈNH SỬA 1

Phản ứng tuyệt vời cho đến nay! Chỉ muốn làm rõ rằng đây không phải là âm thanh trực tiếp và tôi sẽ tự viết các thuật toán bằng C hoặc Objective-C để mọi giải pháp sử dụng thư viện không thực sự là một lựa chọn.


1
Có vẻ như bạn đang cố gắng phá vỡ nó bằng cách sử dụng các khoảng thời gian im lặng làm điểm dừng. Tại sao không chỉ sử dụng ngưỡng sức mạnh để xác định "im lặng" và có một ngưỡng thời gian để xác định xem nó có đủ lâu để cấu thành một khoảng nghỉ không?
Jim Clay

@JimClay Vâng, đó chính xác là những gì tôi đang cố gắng làm. Tôi chưa bao giờ nghe nói về sức mạnh, nhưng nó có vẻ như là thứ tôi có thể sử dụng. Nó có phức tạp không? Bạn có thể mở rộng về điều đó một chút?
Eric Brotto

@EricBrotto Có lẽ bạn nên cho chúng tôi biết một chút về những khả năng bạn có trong thư viện của mình. Điều đó sẽ cho phép chúng tôi xoa bóp phương pháp thực tế cho bạn tốt hơn.
Spacey

sự chấp thuận này để phát hiện sự im lặng là tốt hơn ?? những gì nên được giữ ở mức khác ngoài 0,05 x = wavread ('s1.wav'); i = 1; trong khi abs (x (i)) <0,05% Phát hiện im lặng i = i + 1; kết thúc x (1: i) = []; x (6000: 10000) = 0;
zeee

Câu trả lời:


26

Đây là vấn đề kinh điển của phát hiện lời nói . Điều đầu tiên cần làm là Google khái niệm. Nó được sử dụng rộng rãi trong truyền thông kỹ thuật số và đã có rất nhiều nghiên cứu được thực hiện về chủ đề này và có những bài báo hay.

Nói chung, tiếng ồn nền bạn phải xử lý càng nhiều thì phương pháp phát hiện giọng nói của bạn càng phức tạp. Nếu bạn đang sử dụng các bản ghi được thực hiện trong một căn phòng yên tĩnh, bạn có thể thực hiện nó rất dễ dàng (nhiều hơn về sau). Nếu bạn có đủ loại tiếng ồn trong khi ai đó đang nói chuyện (xe tải đi ngang qua, chó sủa, đập vỡ tấm, tấn công người ngoài hành tinh), bạn sẽ phải sử dụng thứ gì đó thông minh hơn nhiều.

Nhìn vào dạng sóng bạn đính kèm, tiếng ồn của bạn là tối thiểu, vì vậy tôi đề xuất như sau:

  1. Trích xuất tín hiệu phong bì
  2. Chọn một ngưỡng tốt
  3. Phát hiện những nơi mà cường độ phong bì vượt quá ngưỡng

Tất cả điều này có nghĩa là gì? Đường bao của tín hiệu là một đường cong mô tả cường độ của nó theo thời gian, độc lập với cách nội dung tần số của nó làm cho nó dao động (xem hình ảnh bên dưới).

nhập mô tả hình ảnh ở đây

{1,45,6,2,43,2}{1,45,6,2,43,2} có thể được tìm thấy bằng thực nghiệm và có thể phụ thuộc vào một số điều như tỷ lệ lấy mẫu của bạn.

Bạn có thể thấy từ hình ảnh mà bạn không có nhiều nhiễu, đường bao tín hiệu của bạn sẽ luôn ở trên một ngưỡng nhất định (mức độ to) và bạn có thể coi các vùng đó là vùng phát hiện lời nói .


3
Tôi đã thực sự triển khai nó như là một trong những plugin trong winamp tốt. Những gì bạn đang mô tả là tốt nhưng không đủ. Thông thường có âm thanh phát ra (nguyên âm) và âm thanh không được phát âm (phụ âm). Nếu chỉ có âm thanh phát ra, những gì bạn đang mô tả sẽ hoạt động - nhưng âm thanh không được phát ra có năng lượng rất thấp và chúng không hoàn toàn phân biệt được với tiếng ồn nói chung. Và điều kiện không có tiếng ồn cũng rất hiếm ngay cả trong các studio.
Dipan Mehta

Làm thế nào để đạt được điều này trong python?
kRazzy R

26

Những gì bạn thực sự muốn làm về cơ bản được gọi là Phát hiện hoạt động giọng nói hoặc phát hiện giọng nói.

Về cơ bản, bất kỳ tín hiệu lời nói thuần túy (không chứa âm nhạc) đều có ba phần.

  1. Âm thanh giọng nói - về cơ bản là do Nguyên âm
  2. Âm thanh không được phát ra - có chứa phụ âm.

Đặc điểm của âm thanh con người là trong khi rất nhiều năng lượng được sử dụng trong âm thanh có tiếng thì thông tin thực sự được chứa trong phụ âm. Ngoài ra, âm thanh giọng nói thường có tần số thấp hơn trong đó âm thanh không có sóng là tần số cao hơn. [Nói chính xác là tất cả âm thanh giọng nói được cộng hưởng ít nhiều tần số không đổi cho một người nhất định là âm vực của anh ấy / cô ấy].

Bây giờ, như bất kỳ hệ thống có tiếng ồn. Âm thanh giọng nói thường khá mạnh đến mức có thể phân biệt được. Tuy nhiên, khi bạn áp dụng bộ lọc tần số thấp hơn, có thể thu được cường độ tốt của âm thanh giọng nói, âm thanh không được truyền phát (với tất cả thông tin phong phú) sẽ bị mất.

Đến với câu hỏi làm thế nào để giải quyết nó:

Bí quyết nằm ở chỗ âm thanh không được phát ra vẫn đến từ một nguồn cộng hưởng; và vốn đã bị hạn chế trong một tần số nhất định. Như là, tiếng ồn là khá đồng đều. Vì vậy, một biện pháp đơn giản để phân biệt cả ba là "sức mạnh cục bộ" hoặc cách khác nhưng tương đương là lấy tương quan tự động cửa sổ.

Nếu bạn thực hiện tại một thời điểm 100 mẫu - và tự động tương quan với chính nó, nếu nó chỉ có nhiễu, kết quả sẽ khá nhiều (đây là đặc tính của nhiễu trắng) trong đó đối với tín hiệu giọng nói, cường độ này sẽ có thể quan sát được vì tín hiệu vẫn có cấu trúc tốt hơn. Điều này đã làm việc cho tôi trong quá khứ.

VAD đã là một lĩnh vực nghiên cứu tích cực - bởi vì hầu hết tất cả các liên lạc trên điện thoại di động đều muốn phát hiện phần không nói và loại bỏ chúng khỏi mã hóa. Nhưng nếu họ loại bỏ lời nói không lên tiếng thì điều này sẽ khiến điện thoại trở nên vô dụng.

Tiêu chuẩn G.729 tính toán VAD dựa trên các tính năng như: tần số phổ vạch, năng lượng toàn dải, năng lượng băng tần thấp (<1 kHz) và tốc độ truyền qua không.

Tiêu chuẩn GSM hoạt động như sau: Tùy chọn 1 tính toán SNR theo chín băng tần và áp dụng ngưỡng cho các giá trị này. Tùy chọn 2 tính toán các thông số khác nhau: công suất kênh, số liệu giọng nói và công suất nhiễu. Sau đó, nó ngưỡng các số liệu giọng nói bằng cách sử dụng ngưỡng thay đổi theo SNR ước tính. (từ wikipedia)

Đối với các kỹ thuật nâng cao hơn, tôi liệt kê một số tài liệu tham khảo về chủ đề này.

  1. Tài liệu tham khảo nhiều nhất: Jongseo Sohn; Nam Soo Kim; Wonyong Sung; "Phát hiện hoạt động giọng nói dựa trên mô hình thống kê" Thư xử lý tín hiệu, IEEE, tháng 1 năm 1999, Tập: 6 Số phát hành: 1 Trang: 1-3

  2. Phù hợp nhất với bạn: Mark Marzinzik và Birger Kollmeier "Phát hiện tạm dừng lời nói để ước lượng phổ nhiễu bằng cách theo dõi động lực của phong bì công suất" 10, SỐ 2, THÁNG 2 NĂM 2002 Trang.109

  3. Ramírez, J.; JM Górriz, JC Segura (2007). "Phát hiện hoạt động giọng nói. Nguyên tắc cơ bản và hệ thống nhận dạng giọng nói Mạnh mẽ". Trong M. Grimm và K. Kroschel. Nhận biết và hiểu lời nói mạnh mẽ. trang 1 Tiếng22. Sê-ri 980-3-902613-08-0.

  4. Giới thiệu: Jonathan Kola, Carol Espy-Wilson và Tarun Pruthi "Phát hiện hoạt động giọng nói"


Làm thế nào để đạt được điều này trong python?
kRazzy R

9

Tôi hoàn toàn sẽ ủng hộ Jim Clay theo cách tiếp cận của anh ấy, nhưng thay đổi một chút hương vị bằng cách sử dụng phong bì:

Chúng tôi biết rằng lời nói chủ yếu xảy ra khoảng 1-2kHz. Lấy mẫu dữ liệu của bạn có thể là 44kHz (điều này phụ thuộc vào thiết bị ghi của bạn). Vì vậy, điều tôi sẽ làm đầu tiên là trung bình di động của tín hiệu bình phương trong thời gian thực trên 10 điểm, để có một đường bao của công suất tín hiệu. Điều đó sẽ gây ra sự chậm trễ trong việc phát hiện, vì vậy bạn muốn giữ mức thấp này.

Sau đó, tôi sẽ thêm một giai đoạn hiệu chỉnh trên hệ thống của bạn: yêu cầu người dùng giữ im lặng, nhấn nút và ghi lại tiếng ồn xung quanh trong 10 giây. Lấy biên độ trung bình hoặc trung bình của đường bao, nhân 2 để có độ an toàn và điều đó sẽ cho bạn ngưỡng mà Jim đã nói, tự động.

Nếu nó không phải là ghi thời gian thực, bạn có thể thấy hữu ích khi sử dụng trung bình di chuyển 0 pha để giảm bớt sự khó chịu do độ trễ gây ra. Hãy cho chúng tôi nếu nó làm việc cho bạn như nó là.


9

Eric

Nếu bạn thực sự theo đuổi thứ gì đó nhanh chóng và bẩn thỉu, điều đầu tiên bạn phải nhận là phong bì, và tôi sẽ làm điều này đơn giản (trong MATLAB) bằng cách:

 envelope = abs(hilbert(yourSignal));

Vào thời điểm đó, tôi chỉ đơn giản là ngưỡng và 'giọng nói tồn tại' nếu bạn ở trên một ngưỡng nhất định.

Đây là một giải pháp rất đơn giản btw, nhưng nó có thể làm việc cho bạn.


1
+1. Có lẽ bạn có thể giải thích về phương pháp đằng sau dòng mã này? Tôi chắc chắn OP không quen với việc trích xuất phong bì thông qua Hilbert Transform.
Phonon

@Mohammad Cảm ơn! Nhưng vui lòng xem EDIT của tôi 1. Tôi chắc chắn muốn nhanh chóng và bẩn thỉu, nhưng cũng cần phải tự mình thực hiện các thuật toán :)
Eric Brotto

@EricBrotto À, được rồi, tôi có thể cho bạn biết cách triển khai biến áp hilbert, nhưng tôi giả sử bạn có khả năng thực hiện FFT trong thư viện C / Obj-C của mình? Nếu không đó sẽ là một vấn đề ... :-)
Spacey

Làm thế nào để đạt được điều này trong python?
kRazzy R

Bạn có thể chỉ cho tôi tài nguyên về cách thức thực hiện hilbert này trong Python không?
kRazzy R

6

Tôi cho rằng bạn đang xử lý các tín hiệu thực tế, không phức tạp - nếu đó không phải là trường hợp, hãy cho tôi biết và tôi có thể sửa đổi câu trả lời.

Công suất được định nghĩa là bình phương của tín hiệu (tức là các mẫu tín hiệu nhân với chính chúng). Bạn có thể so sánh sức mạnh với một số ngưỡng để xác định xem có lời nói hay không. Bạn có thể sẽ cần phải thực hiện một số phép đo trên bản ghi của mình để tìm ra một ngưỡng tốt.

Nếu bản ghi của bạn "sạch" (nghĩa là không có nhiều tiếng ồn), tôi có thể sẽ đơn giản nhất có thể bằng cách so sánh công suất tức thời (tức là một mẫu) với ngưỡng. Điều này có nghĩa là bạn thậm chí không phải bình phương nếu bạn không muốn, bạn chỉ cần giá trị tuyệt đối và so sánh nó với căn bậc hai của ngưỡng công suất, có thể được tính toán trước. Khi bạn phát hiện lời nói, hãy lấy nó và một số lượng ghi âm trước nó, để đảm bảo bạn có được tất cả các bài phát biểu (có thể là 1/10 giây?). Tiếp tục đi cho đến khi bạn tìm thấy một khoảng thời gian dài không có mẫu nào vượt quá ngưỡng. Một lần nữa, độ dài của thời kỳ sẽ cần phải được xác định theo kinh nghiệm.

Rửa sạch và lặp lại.


4

Tôi đã viết một lớp phát hiện hoạt động trong Java. Đây là một phần của bộ sưu tập Java DSP mã nguồn mở của tôi . Bạn có thể sử dụng chương trình thử nghiệm WavSplitter.java để kiểm tra xem nó với tệp WAV làm đầu vào.


Hãy nhớ rằng OP đặc biệt nói rằng anh ta cần phải tự viết các thuật toán bằng C.
Sam Maloney

Rất dễ dàng để chuyển đổi các thuật toán như vậy từ Java sang C.
Christian d'Heureuse

Thưa ông, làm thế nào để đạt được điều này ở trăn?
kRazzy R
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.