Сравните две спектрограммы, чтобы найти смещение, при котором они соответствуют алгоритму.

Я ежедневно записываю 2-минутную радиопередачу из Интернета. Всегда один и тот же начальный и конечный джингл. Поскольку точное время радиопередачи может варьироваться от более или менее 6 минут, мне нужно записать около 15 минут радио.

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

Я уже запустил приложение C#, в котором я декодирую MP3 в данные PCM и преобразовываю данные PCM в спектрограмму на основе http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx

Я попытался использовать алгоритм кросс-корреляции для данных PCM, но алгоритм очень медленный, около 6 минут с шагом 10 мс, и в некоторых случаях ему не удается найти время начала звонка.

Любые идеи алгоритмов для сравнения двух спектрограмм для совпадения? Или лучший способ найти время начала этого джингла?

Спасибо,

Обновление, извините за задержку

Во-первых, спасибо за все ответы, большинство из которых были актуальными и/или интересными идеями.

Я попытался реализовать алгоритм Shazam, предложенный фонзо. Но не удалось обнаружить пики на спектрограмме. Вот три спектрограммы стартового джингла с трех разных пластинок. Я попробовал AForge.NET с блоб-фильтром (но он не смог идентифицировать пики), чтобы размыть изображение и проверить разницу в высоте, свертки Лапласа, анализ наклона, чтобы обнаружить серию вертикальных полос (но было слишком много ложных положительный)...

Тем временем я попробовал алгоритм Хафа, предложенный Дейвом Аароном Смитом. Где я вычисляю RMS каждого столбца. Да, да, каждый столбец, это O (N * M), но M ‹‹ N (обратите внимание, что столбец составляет около 8 КБ выборки). Так что в целом все не так уж и плохо, все-таки алгоритм занимает около 3 минут, но еще ни разу не подвел.

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

FFT Запустить мелодию 1

FFT Start Jingle 2

FFT Start Jingle 3

Новое обновление

Наконец, я пошел с алгоритмом, описанным выше, я попытался реализовать алгоритм Shazam, но не смог найти правильные пики на спектрограмме, идентифицированные точки не были постоянными от одного звукового файла к другому. Теоретически алгоритм Shazam является решением такой проблемы. Алгоритм Хафа, предложенный Дэйвом Аароном Смитом, оказался более стабильным и эффективным. Я разделил около 400 файлов, и только 20 из них не удалось правильно разделить. Дисковое пространство, когда от 8GB до 1GB.

Спасибо за вашу помощь.


person Dominik Délisle-Ong    schedule 13.04.2011    source источник


Ответы (4)


Интересно, не могли бы вы использовать преобразование Хафа. Вы бы начали с каталогизации каждого шага вступительной последовательности. Допустим, вы используете шаги по 10 мс, а последовательность открытия длится 50 мс. Вы вычисляете некоторую метрику на каждом шаге и получаете

1 10 1 17 5

Теперь просмотрите свой звук и проанализируйте каждый шаг в 10 мс для одной и той же метрики. Назовите этот массив have_audio

8 10 8 7 5 1 10 1 17 6 2 10...

Теперь создайте новый пустой массив той же длины, что и have_audio. Назовите это start_votes. Он будет содержать «голоса» за начало вступительной последовательности. Если вы видите 1, возможно, вы находитесь на 1-м или 3-м этапе вступительной последовательности, поэтому у вас есть 1 голос за вступительную последовательность, начинающуюся 1 шаг назад, и 1 голос за вступительную последовательность, начинающуюся 3 шага назад. Если вы видите 10, у вас есть 1 голос за вступительную последовательность, начинающуюся 2 шага назад, 17 голосов за 4 шага назад и так далее.

Итак, для этого примера have_audio ваш votes будет выглядеть так:

2 0 0 1 0 4 0 0 0 0 0 1 ...

У вас много голосов на позиции 6, поэтому есть большая вероятность, что вступительная последовательность начнется именно там.

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

person Dave Aaron Smith    schedule 13.04.2011
comment
Привет, спасибо за ответ, сегодня я кое-что узнал. Но я действительно не знаю, какую метрику можно использовать для представления части сигнала. Спектрограмма представляет собой массив, я мог бы запустить этот алгоритм для разных частот, таких как 100, и суммировать голоса для каждой части. Однако я задаюсь вопросом о производительности. - person Dominik Délisle-Ong; 13.04.2011
comment
Да, преобразования Хафа используются в компьютерном зрении, а я мало что знаю об обработке аудиосигналов. Это умная идея для измерения конкретных частот, хотя для метрики. - person Dave Aaron Smith; 15.04.2011

Описание алгоритма, используемого службой shazam (который идентифицирует музыку по короткому, возможно, шумному образцу) здесь: http://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf
Насколько я понял, первое, что нужно сделать, это изолировать пики в спектрограмме (с некоторыми настройками для обеспечения равномерного покрытия), что даст «созвездие» пары значений (время; частота) из исходной спектрограммы. После этого выборочное созвездие сравнивается с созвездием полного трека путем перемещения окна длины выборки от начала до конца и подсчета количества коррелированных точек.
Затем в документе описывается техническое решение, которое они нашли для быть в состоянии сделать сравнение быстро даже с огромной коллекцией треков.

person jeremy-george    schedule 14.04.2011

Вот хороший пакет Python, который делает именно это:

https://code.google.com/p/py-astm/

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

Вот еще один пакет Python, который также можно использовать:

http://rudd-o.com/new-projects/python-audioprocessing/documentation/manuals/algorithms/butterscotch-signatures

person mattgattis    schedule 13.04.2011

Если вы уже знаете последовательность джинглов, вы можете проанализировать корреляцию с последовательностью вместо взаимной корреляции между полными 15-минутными треками.

Чтобы быстро рассчитать корреляцию с (короткой) последовательностью, я бы предложил использовать фильтр Wiener. .

Редактировать: фильтр Винера — это способ найти сигнал в последовательности с шумом. В этом приложении мы рассматриваем все, что «не звенит», как шум (вопрос к читателю: можем ли мы по-прежнему считать шум белым и некоррелированным?).

(Я нашел ссылку, которую искал! Формулы, которые я помнил, были немного неправильными, и я их сейчас уберу)

Соответствующая страница — Деконволюция Винера. Идея состоит в том, что мы можем определить систему, чья импульсная характеристика h(t) имеет ту же форму волны, что и джингл, и мы должны найти точку в зашумленной последовательности, где система получила импульс (т. е. издала цзиндже).

Поскольку звон известен, мы можем рассчитать его спектр мощности H(f), а поскольку мы можем предположить, что в записанной последовательности появляется одиночный звон, мы можем сказать, что неизвестный вход x(t) имеет форму импульса, плотность мощности которого S(f) постоянна. на каждой частоте.

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

person Coffee on Mars    schedule 13.04.2011
comment
Привет, спасибо за ответ. Я не уверен, что понимаю первую часть, которую я сейчас соотношу между полным 15-минутным треком и 10-секундным джинглом. Извините, я был неясен. Кроме того, фильтр Винера, по-видимому, является фильтром для удаления шума. Вы предполагаете, что причина, по которой иногда корреляция терпит неудачу, связана с шумом? Спасибо - person Dominik Délisle-Ong; 13.04.2011
comment
Получив последовательность джинглов, вы можете разделить весь клип на 10-секундные более короткие клипы и проверить перекрестную корреляцию джингла и каждого из клипов. Самый коррелируемый клип — это клип с джинглом (вопрос: что будет, если джингл разделить на два клипа?). - person Coffee on Mars; 13.04.2011
comment
Примечание: объяснение в ответе отличается от того, который я предложил в комментарии. - person Coffee on Mars; 13.04.2011
comment
Спасибо. На самом деле я в настоящее время делаю именно это, но шаг составляет 10 мс, а не 10 секунд с длиной клипа 10 секунд, поэтому они перекрываются. И тем не менее иногда алгоритм не возвращает хороший ответ. Тем не менее, я попробую ваше предложение, возможно, я смогу получить n лучших более коротких клипов и повторно выполнить алгоритм с меньшими шагами. Спасибо. - person Dominik Délisle-Ong; 13.04.2011
comment
Если у вас есть время, попробуйте также построить фильтр jingle-pass: будучи линейным фильтром, он не должен вызывать проблем с эффективностью. - person Coffee on Mars; 14.04.2011