Определите, где пение начинается в записи только голоса

14

У меня есть небольшое приложение в стиле караоке, где пользователь поет 4 строки песни, с интервалом в одну секунду между каждой строкой. Бэк-музыки нет, так что это только голос, надеюсь, облегчить проблему.

Я ищу наиболее надежный способ точно определить, где в моей записи пользователь начинает и заканчивает пение строки 1, начинает и заканчивает пение строки 2 и т. Д.

Я соединил простой алгоритм, который работает, когда в записи очень мало фонового шума (например, когда это происходит?), Но он распадается на части при наличии наименьшего шума.

Кто-нибудь может указать мне на что-то более крепкое?

Майк Хоган
источник
Мой ответ может вам помочь - dsp.stackexchange.com/a/1543/440
Дипан Мехта
В некоторых записях голос является единственным инструментом, который воспроизводится с одинаковой амплитудой в обоих каналах. Вы можете использовать эту информацию для извлечения голоса из стереозаписи.
Джадер Диас

Ответы:

4

Если фоновый шум белый, вы можете измерить спектральную плоскостность и считать ее речевой, когда амплитуда выше некоторого порога, а спектральная плоскость ниже некоторого порога.

По сути, вы просто берете БПФ части сигнала, а затем делите среднее геометрическое значение спектра на среднее арифметическое.

Вы также можете использовать полосовой фильтр, чтобы выделить только частотные области, где обычно сидит человеческий голос (так же просто, как установить для нежелательных областей БПФ значение 0 до измерения спектральной плоскостности)

эндолиты
источник
Эндолит, по вашему опыту, имеет большое значение, если вы возьмете квадратичную величину против VS только величину, прежде чем измерить спектральную плоскость?
Спейси
@ Мохаммед: у меня нет никакого опыта с этим. :) Я задал предыдущий вопрос, потому что я не понимал спецификацию, и все еще не уверен, какой путь правильный. Я не думаю, что квадрат имеет какое-либо практическое значение, хотя. Если вы просто запускаете, когда он превышает пороговое значение, он должен реагировать одинаково, независимо от того, возведен ли он в квадрат или нет (при условии, что вы настраиваете пороговое значение, чтобы соответствовать), поэтому только величина в вычислительном отношении дешевле.
эндолит
@ Эндолит, это довольно далеко: вы знаете, как реализовать этот подход в Matlab? Я хочу протестировать все подходы, упомянутые здесь, в matlab (на самом деле октава), чтобы увидеть, какой из них лучше?
Майк Хоган
@MikeHogan: Нет, я давно не пользовался matlab. : / Также это потребовало бы выполнения реальной работы. :) У меня нет ничего заранее написанного. Разбейте сигнал на маленькие куски, выполните БПФ для каждого из них, и для каждого БПФ разделите среднее геометрическое значение на среднее арифметическое значение. более высокие числа являются шумными, более низкие числа являются тональными.
эндолит
3

Я использовал спектральный поток в прошлом, и это, кажется, работает хорошо. Основная идея заключается в том, чтобы создать спектрограмму вашего сигнала по всем интересующим вас диапазонам. Давайте предположим, что ваша частота находится на оси Y, а ваше время на оси X, вот так .

Это означает, что ваша спектрограмма является матрицей. Каждый столбец представляет абсолютное значение БПФ одного снимка во времени вашего сигнала, и каждый ряд представляет, как энергия одной полосы изменяется со временем.

Теперь просто возьмите разницу в столбцах. То есть возьмите столбец и вычтите из себя столбец перед ним, и сделайте для всех столбцов. (Оставляя только стартовые столбцы, очевидно). Затем сумма по всем группам. То есть просто сложите все строки вместе.

Вы будете в конечном итоге с 1-D сигнала , который кодирует сигнал вашего началами . Это скажет вам, где начинается ваш голос.

РЕДАКТИРОВАТЬ:

Теперь, когда вы обнаружили начала, если вы хотите обнаружить противоположное (то есть, когда сигнал переходит от активности к отсутствию), спектральный поток фактически дает вам эту информацию. Где бы у вас ни начался приступ, у вас будет положительный пик, а там, где у вас есть «отклонение» (из-за отсутствия лучшего слова), у вас будет отрицательный пик.

Я бы просто взял первый положительный пик и последний отрицательный пик, чтобы отметить общее время начала и окончания моего сигнала.

ошалевший
источник
Мухаммед, что ты имеешь в виду под "грести"?
Майк Хоган
@MikeHogan Пожалуйста, посмотрите мои изменения, я переписал ответ.
Спейси
Разве это не может найти начало чего-либо, хотя? Удары барабана или другой импульсный шум также будут обнаружены. Он не различает тональные звуки и шумные звуки.
эндолит
@endolith Вы подняли хороший вопрос - однако я верю, что он все еще может работать. Я рассуждаю так: в этом сценарии вы находитесь в состоянии голоса + музыки или просто в состоянии музыки. Таким образом, вычисляя спектральный поток, вы на самом деле просто вычисляете разницу между голосом + музыкой и просто музыкой. (Конечно, мне нужно было бы проанализировать это намного больше, но теперь я так думаю об этом) :-P
Spacey
1
@endolith Я только что перечитал, и ОП говорит, что есть только голос (очевидно, это простое приложение), так что в этом случае это будет просто голос против ничего.
Спейси
2

Исходя из своего опыта, я бы попытался изучить коэффициенты Mel-Frequency-Cepstrum-Coefficients (MFCCs) . MFCC довольно легко реализовать, если у вас есть доступное FFT, и они довольно часто используются при обработке голоса.

С помощью MFCC вы сможете различать реальные голосовые данные от шума.

эндолиты
источник
@endolith, эта ссылка совершенно за мной! Знаете ли вы о какой-либо реализации с открытым исходным кодом, которую я могу посмотреть, или более пошаговый рецепт, как это работает?
Майк Хоган
2

« Спектральный поток » (также называемый «спектральной разностью») является распространенным методом «обнаружения начала». В основном вы берете последовательные БПФ сигнала и суммируете величины разностей блоков БПФ от одного семпла к другому. «Начало», как правило, будет представлено значительным «скачком» в этом значении.

Google "обнаружение начала" для других идей.

Даниэль Р Хикс
источник
2

Использование только спектрального потока может давать ложные срабатывания для определенных шумов, а также обнаруживать поющий голос.

Под пением обычно подразумевается содержание сигнала, содержащее высоту тона, поэтому вы можете использовать детектор или оценку высоты тона (кепстр и т. Д.). Вы можете проверить, какая доля энергии, которая определяется как высота тона, зависит от общей энергии сигнала, и что предполагаемая высота звука находится в пределах диапазона человеческого голоса. Это уменьшит частоту ложных срабатываний для несвязанного шума, а также музыкальных звуков за пределами нормального вокального диапазона.

hotpaw2
источник