У меня есть небольшое приложение в стиле караоке, где пользователь поет 4 строки песни, с интервалом в одну секунду между каждой строкой. Бэк-музыки нет, так что это только голос, надеюсь, облегчить проблему.
Я ищу наиболее надежный способ точно определить, где в моей записи пользователь начинает и заканчивает пение строки 1, начинает и заканчивает пение строки 2 и т. Д.
Я соединил простой алгоритм, который работает, когда в записи очень мало фонового шума (например, когда это происходит?), Но он распадается на части при наличии наименьшего шума.
Кто-нибудь может указать мне на что-то более крепкое?
audio
signal-detection
Майк Хоган
источник
источник
Ответы:
Если фоновый шум белый, вы можете измерить спектральную плоскостность и считать ее речевой, когда амплитуда выше некоторого порога, а спектральная плоскость ниже некоторого порога.
По сути, вы просто берете БПФ части сигнала, а затем делите среднее геометрическое значение спектра на среднее арифметическое.
Вы также можете использовать полосовой фильтр, чтобы выделить только частотные области, где обычно сидит человеческий голос (так же просто, как установить для нежелательных областей БПФ значение 0 до измерения спектральной плоскостности)
источник
Я использовал спектральный поток в прошлом, и это, кажется, работает хорошо. Основная идея заключается в том, чтобы создать спектрограмму вашего сигнала по всем интересующим вас диапазонам. Давайте предположим, что ваша частота находится на оси Y, а ваше время на оси X, вот так .
Это означает, что ваша спектрограмма является матрицей. Каждый столбец представляет абсолютное значение БПФ одного снимка во времени вашего сигнала, и каждый ряд представляет, как энергия одной полосы изменяется со временем.
Теперь просто возьмите разницу в столбцах. То есть возьмите столбец и вычтите из себя столбец перед ним, и сделайте для всех столбцов. (Оставляя только стартовые столбцы, очевидно). Затем сумма по всем группам. То есть просто сложите все строки вместе.
Вы будете в конечном итоге с 1-D сигнала , который кодирует сигнал вашего началами . Это скажет вам, где начинается ваш голос.
РЕДАКТИРОВАТЬ:
Теперь, когда вы обнаружили начала, если вы хотите обнаружить противоположное (то есть, когда сигнал переходит от активности к отсутствию), спектральный поток фактически дает вам эту информацию. Где бы у вас ни начался приступ, у вас будет положительный пик, а там, где у вас есть «отклонение» (из-за отсутствия лучшего слова), у вас будет отрицательный пик.
Я бы просто взял первый положительный пик и последний отрицательный пик, чтобы отметить общее время начала и окончания моего сигнала.
источник
Исходя из своего опыта, я бы попытался изучить коэффициенты Mel-Frequency-Cepstrum-Coefficients (MFCCs) . MFCC довольно легко реализовать, если у вас есть доступное FFT, и они довольно часто используются при обработке голоса.
С помощью MFCC вы сможете различать реальные голосовые данные от шума.
источник
« Спектральный поток » (также называемый «спектральной разностью») является распространенным методом «обнаружения начала». В основном вы берете последовательные БПФ сигнала и суммируете величины разностей блоков БПФ от одного семпла к другому. «Начало», как правило, будет представлено значительным «скачком» в этом значении.
Google "обнаружение начала" для других идей.
источник
Использование только спектрального потока может давать ложные срабатывания для определенных шумов, а также обнаруживать поющий голос.
Под пением обычно подразумевается содержание сигнала, содержащее высоту тона, поэтому вы можете использовать детектор или оценку высоты тона (кепстр и т. Д.). Вы можете проверить, какая доля энергии, которая определяется как высота тона, зависит от общей энергии сигнала, и что предполагаемая высота звука находится в пределах диапазона человеческого голоса. Это уменьшит частоту ложных срабатываний для несвязанного шума, а также музыкальных звуков за пределами нормального вокального диапазона.
источник