Xác định nơi hát bắt đầu bằng giọng nói


14

Tôi có một ứng dụng kiểu karaoke nhỏ, trong đó người dùng hát 4 dòng của một bài hát, với khoảng cách một giây giữa mỗi dòng. Không có nhạc nền, vì vậy chỉ có giọng nói, hy vọng làm cho vấn đề dễ giải quyết hơn.

Tôi đang tìm cách mạnh mẽ nhất để phát hiện chính xác nơi ghi âm của tôi, người dùng bắt đầu và kết thúc hát dòng 1, bắt đầu và kết thúc dòng hát 2, v.v.

Tôi đã kết hợp một thuật toán có đầu óc đơn giản, hoạt động khi có rất ít nhiễu nền trong bản ghi âm (như khi nào điều đó xảy ra?), Nhưng nó rơi thành từng mảnh khi có tiếng ồn nhỏ nhất.

Bất cứ ai có thể chỉ cho tôi hướng tới một cái gì đó mạnh mẽ hơn?


Câu trả lời của tôi có thể giúp bạn - dsp.stackexchange.com/a/1543/440
Mehta

Trong một số bản ghi âm, giọng nói là nhạc cụ duy nhất được phát với cùng biên độ ở cả hai kênh. Bạn có thể sử dụng thông tin này để trích xuất giọng nói từ bản ghi âm thanh nổi.
Jader Dias

Câu trả lời:


4

Nếu nhiễu nền là trắng-ish, bạn có thể đo độ phẳng phổ và coi đó là giọng nói khi biên độ vượt quá ngưỡng nào đó và độ phẳng phổ nằm dưới ngưỡng nào đó.

Về cơ bản, bạn chỉ cần lấy một FFT của một đoạn tín hiệu, sau đó chia giá trị trung bình hình học của độ lớn của phổ cho trung bình số học.

Bạn cũng có thể sử dụng bộ lọc thông dải để chỉ nhấn mạnh các vùng tần số mà giọng nói của con người thường nằm (đơn giản như đặt các vùng không mong muốn của FFT thành 0 trước khi đo độ phẳng phổ)


Endolith, theo kinh nghiệm của bạn, nó có tạo ra sự khác biệt lớn không nếu bạn lấy độ lớn bình phương VS chỉ là độ lớn trước khi bạn đo độ phẳng của quang phổ?
Spacey

@Mohammad: Tôi không có bất kỳ kinh nghiệm nào với nó. :) Tôi đã hỏi một câu hỏi trước đó vì tôi không hiểu thông số kỹ thuật, và tôi vẫn không chắc cách nào là đúng. Tôi không nghĩ rằng bình phương làm cho bất kỳ sự khác biệt thực tế, mặc dù. Nếu bạn chỉ kích hoạt khi vượt qua một ngưỡng, nó sẽ phản ứng giống hệt nhau cho dù bình phương hay không (giả sử bạn điều chỉnh ngưỡng cho phù hợp), do đó, chỉ cường độ sẽ rẻ hơn về mặt tính toán.
endolith

@Endolith, đây là một chút khó khăn: bạn có biết cách thực hiện phương pháp này trong matlab không? Tôi muốn kiểm tra tất cả các phương pháp được đề cập ở đây trong matlab (thực tế quãng tám) để xem cái nào là tốt nhất?
Mike Hogan

@MikeHogan: Không, tôi đã không sử dụng MATLAB trong một thời gian dài. : / Cũng sẽ yêu cầu làm việc thực sự. :) Tôi không có bất cứ điều gì được viết sẵn. Chia tín hiệu thành các phần nhỏ, thực hiện FFT của từng phần và cho mỗi FFT, chia trung bình hình học của độ lớn cho giá trị trung bình số học của độ lớn. số cao hơn là ồn ào, số thấp hơn là âm.
endolith

3

Tôi đã sử dụng quang phổ trong quá khứ và nó dường như hoạt động tốt. Ý tưởng cơ bản là, tạo ra một phổ tín hiệu của bạn, trên các dải bạn quan tâm. Giả sử rằng tần số của bạn nằm trên trục y và thời gian của bạn nằm trên trục x, như vậy .

Điều này có nghĩa là quang phổ của bạn là một ma trận. Mỗi cột biểu thị giá trị tuyệt đối của FFT của một lần chụp nhanh theo thời gian của tín hiệu của bạn và mỗi hàng biểu thị mức năng lượng từ một dải thay đổi theo thời gian.

Bây giờ, chỉ cần lấy sự khác biệt của các cột. Đó là, lấy một cột và trừ đi chính nó trước cột đó và thực hiện cho tất cả các cột. (Rời khỏi cột bắt đầu một mình rõ ràng). Sau đó tổng hợp trên tất cả các ban nhạc. Đó là, chỉ cần tổng hợp tất cả các hàng với nhau.

Bạn sẽ kết thúc với một tín hiệu 1-D mà hệ thống hóa tín hiệu của bạn thời gian bắt đầu . Điều này sẽ cho bạn biết giọng nói của bạn bắt đầu từ đâu.

BIÊN TẬP:

Bây giờ bạn đã phát hiện các bộ dữ liệu, nếu bạn muốn phát hiện ngược lại, (nghĩa là khi tín hiệu chuyển từ không có hoạt động sang không), thông lượng quang phổ thực sự cung cấp cho bạn thông tin đó. Bất cứ khi nào bạn có một khởi phát, bạn sẽ có một đỉnh tích cực và bất cứ nơi nào bạn có một 'deset' (vì không có từ nào tốt hơn), bạn sẽ có một đỉnh âm.

Tôi chỉ đơn giản là lấy đỉnh dương đầu tiên và đỉnh âm cuối cùng, để đánh dấu tổng thời gian bắt đầu và dừng của tín hiệu của tôi.


Mohammad, ý của bạn là "hàng" là gì?
Mike Hogan

@MikeHogan Xin vui lòng xem các chỉnh sửa của tôi, tôi đã viết lại câu trả lời.
Spacey

Điều này sẽ không tìm thấy các tập tin của bất cứ điều gì, mặc dù? Tiếng trống hoặc tiếng ồn xung khác cũng sẽ được phát hiện. Nó không phân biệt giữa âm thanh và âm thanh ồn ào.
endolith

@endolith Bạn nêu lên một điểm tốt - tuy nhiên tôi tin rằng nó vẫn có thể hoạt động. Lý do của tôi là trong kịch bản này, bạn ở trạng thái giọng nói + âm nhạc hoặc chỉ ở trạng thái âm nhạc. Vì vậy, khi tính toán thông lượng quang phổ, bạn thực sự chỉ tính toán đồng bằng giữa giọng nói + âm nhạc và chỉ âm nhạc. (Tất nhiên tôi sẽ cần phải phân tích nó nhiều hơn nữa nhưng đó là cách tôi nghĩ về nó bây giờ) :-P
Spacey

1
@endolith Tôi vừa đọc lại và OP đang nói chỉ có giọng nói, (rõ ràng đây là một ứng dụng đơn giản), vì vậy trong trường hợp này nó sẽ chỉ là giọng nói VS không có gì.
Spacey

2

Từ kinh nghiệm của mình, tôi sẽ thử tìm hiểu về Mel-Tần số-Cepstrum-Coefficents (MFCC) . MFCC khá dễ thực hiện nếu bạn có sẵn FFT và được sử dụng khá phổ biến trong xử lý giọng nói.

Với MFCC, bạn sẽ có thể phân biệt dữ liệu giọng nói thực tế với tiếng ồn.


@endolith, liên kết đó hoàn toàn nằm ngoài tôi! Bạn có biết bất kỳ triển khai nguồn mở nào tôi có thể xem xét, hoặc một công thức từng bước nhiều hơn về cách thức hoạt động của nó không?
Mike Hogan

2

"Thông lượng quang phổ " (còn được gọi là "sự khác biệt phổ") là một phương pháp phổ biến để "phát hiện khởi phát". Về cơ bản, bạn lấy các FFT tuần tự của tín hiệu và tính tổng độ lớn của sự khác biệt của các thùng FFT từ mẫu này sang mẫu khác. "Khởi phát" nói chung sẽ được biểu thị bằng một "bước nhảy" đáng kể trong giá trị này.

Google "phát hiện khởi phát" cho các ý tưởng khác.


2

Chỉ sử dụng thông lượng quang phổ có thể tạo ra dương tính giả cho một số tiếng ồn nhất định cũng như phát hiện giọng hát.

Ca hát thường ngụ ý một nội dung tín hiệu có chứa cao độ, vì vậy bạn có thể sử dụng máy phát hiện âm lượng hoặc công cụ ước tính (cepstrum, v.v.). Bạn có thể kiểm tra tỷ lệ năng lượng được phát hiện là cao độ so với tổng năng lượng tín hiệu và cường độ ước tính nằm trong phạm vi giọng nói của con người. Điều đó sẽ làm giảm tỷ lệ dương tính giả cho tiếng ồn không bị cản trở cũng như âm thanh âm nhạc bên ngoài phạm vi giọng hát bình thường.

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.