Сравните две спектрограммы, чтобы найти смещение, где они соответствуют алгоритму - PullRequest
5 голосов
/ 13 апреля 2011

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

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

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

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

Есть идеи алгоритмов сравнения двух спектрограмм на совпадение?Или лучший способ найти время начала звонка?

Спасибо,

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

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

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

Тем временем я попробовал алгоритм Хо, предложенный Дейвом Аароном Смитом.Где я рассчитываю среднеквадратичное значение каждого столбца.Да, да, каждый столбец, это O (N * M), но M << N (обратите внимание, что столбец составляет около 8 тыс. Выборок).Так что в целом все не так плохо, алгоритм все равно занимает около 3 минут, но никогда не выходит из строя.</p>

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

FFT Start Jingle 1

FFT Start Jingle 2

FFT Start Jingle 3

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

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

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

Ответы [ 4 ]

4 голосов
/ 14 апреля 2011

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

2 голосов
/ 13 апреля 2011

Интересно, не могли бы вы использовать преобразование Хафа .Вы начнете с каталогизации каждого шага последовательности открытия.Допустим, вы используете шаги 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 секунд.

2 голосов
/ 13 апреля 2011

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

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

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

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

http://rudd -o.com / new-projects / python-аудиопроцессинг / документация / руководства / алгоритмы / ириски-подписи

1 голос
/ 13 апреля 2011

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

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

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

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

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

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

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

...