Как извлечь вокальную часть из стерео аудио сигнала?

15

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

Насколько я знаю, аудио кодируется в различные несочлененные поддиапазоны в MP3. Я думаю, что могу ограничить сигналы вокальным диапазоном через фильтр верхних и нижних частот с правильной настройкой частоты среза. Однако результат должен содержать части чистого музыкального сигнала в этом случае. Или после поиска в Google, я думаю, что я могу сначала вычислить фоновые сигналы (путем инвертирования одного канала, добавляемого с сигналами из другого канала, предполагая, что вокальная часть центрирована в стереофоническом аудио, называемом фазовым подавлением). После этого преобразования сигнал моно. Затем я должен слить оригинальное стерео в моно, из которого извлекается фоновый сигнал.

Учитывая эффективность, какой из них является предпочтительным (или любые другие решения :)? Если 2-й, пусть два канала A и B, будут ли (BA) или (AB) использоваться при вычислении фона? Как и при объединении двух каналов, арифметика означает достаточно точную? Или я могу уменьшить частоту дискретизации каждого канала в два раза и чередовать сигналы пониженной дискретизации как монофонический результат?

Спасибо и всего наилучшего.

Summer_More_More_Tea
источник

Ответы:

21

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

Сумма / разница - очень, очень простой прием для подавления голоса (не извлечение). Он основан на предположении, что вокал смешивается в центре стереополя, в то время как другие инструменты панорамируются в боковом направлении. Это редко правда. LR и RL будут звучать одинаково (человеческое ухо нечувствительно к глобальному фазовому сдвигу) и дадут вам монофонический микс без инструментов, смешанных в центре. Проблема в том, что, как только вы восстановите фон, что вы будете с ним делать? Попробуйте подавить его от центра (среднего) сигнала? Это не сработает, вы будете делать (L + R) / 2 - (L - R), это не очень интересно ... Вы можете попробовать любые линейные комбинации из них (усредненные и «удаленные по центру»), ничего выйдет из этого!

Относительно подходов фильтрации: f0 голоса редко превышает 1000 Гц, но его гармоники могут превысить это. Удаление самой высокой частоты сделает согласные (особенно sss, chhh) неприятными. Некоторые мужские голоса опускаются ниже 100 Гц. Вы можете безопасно сократить то, что ниже 50 или 60 Гц (бас, удар), хотя

Некоторые недавние разработки в области разделения голоса, которые стоит изучить:

  • Фоновая модель NMF + гармоническая гребенка> фильтра Джона Луи Дюррио . Код Python здесь .
  • Рафийский подход к извлечению фона . Легко кодировать и хорошо работает на компьютерной музыке с очень повторяющимися паттернами, такими как Electro, Hip-hop ...
  • Подход Хсу основан на обнаружении f0, отслеживании и маскировке. «Тандемный алгоритм извлечения высоты тона и отделения голоса от музыкального сопровождения» (не удается найти доступный PDF).
pichenettes
источник
4

Спасибо за ссылку! Вы забыли упомянуть свою работу по улучшению барабанов , которая также может представлять интерес для приложения Summer_More_More_Tea. Ну, это все зависит от того, что вы хотите с этим делать. Вы имеете в виду конкретное «конечное приложение»?

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

Чтобы ответить на ваши вопросы:

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

Как сказали пикенетки, ни одна из них, похоже, не удовлетворяет вашим потребностям: фильтрация нижних частот / верхних частот обязательно обречена на неудачу из-за гармонической структуры человеческого голоса (и, в более общем смысле, любого "интересного" звука - то есть чего-либо, кроме синусоид ... ).

Если 2-й, пусть два канала A и B, будут ли (BA) или (AB) использоваться при вычислении фона? Как и при объединении двух каналов, арифметика означает достаточно точную?

Опять же, второй метод, который вы упомянули, не подходит, потому что вы можете только удалить сигнал, находящийся в центре, но не извлечь его. Другими словами, даже вокал находится в «центре», нет простой математики, чтобы получить сигнал только вокала.

Или я могу уменьшить частоту дискретизации каждого канала в два раза и чередовать сигналы пониженной дискретизации как монофонический результат?

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

Правильная понижающая дискретизация каждого канала означает, что вы сначала применяете фильтр нижних частот (с частотой среза sampling_rate / 4 в вашем случае), а затем можете безопасно брать каждые 2 сэмпла. Однако не так много можно сказать о чередовании каналов с пониженной дискретизацией: в большинстве общих случаев это нарушает спектральные характеристики вашего сигнала. Вы, вероятно, не хотите этого.

Действительно, операция низкочастотной фильтрации сопровождается установкой 0 на каждые 2 выборки и сохранением этих 0 выводов в области Фурье для «зеркального отображения» низкочастотных компонентов, которые были сохранены на высокочастотных. Помните, уроки обработки сигналов по теории дискретизации: умножение на последовательность импульсов (или дираков) приводит к свертке с другой последовательностью дираков в области Фурье, т. Е. В этом случае частотный спектр сигнала повторяется (периодизируется) вдоль оси частот, с периодом, равным частоте дискретизации.

Обычно при понижающей дискретизации вы удаляете нули (потому что вы принимаете новую частоту дискретизации). Но здесь их хранение приводит к очень раздражающим дополнительным высокочастотным компонентам. Чередование этих сигналов не исправит это.

Ну, в общем, короткий ответ: не делай этого . :-)

Наконец, я мог бы также предложить вам использовать графический интерфейс, который я разработал для конференции LVAICA 2012: для этого есть git-репо . Я все еще отлаживаю и улучшаю его, поэтому комментарии приветствуются: D

Надеюсь, это поможет!

Жан-Луи Дюррио
источник