Распознавание музыки и обработка сигналов - PullRequest
13 голосов
/ 15 января 2010

Я хочу построить что-то похожее на Tunatic или Midomi (опробуйте их, если вы не уверены, что они делают), и мне интересно какие алгоритмы мне придется использовать; У меня есть идея о работе таких приложений:

  1. большая база данных с несколькими песнями
  2. для каждой песни в 1. снизить качество / битрейт (например, до 64 Кбит / с) и вычислить «хэш» звука
  3. есть звук / отрывок музыки, которую вы хотите идентифицировать
  4. для песни в 3. уменьшить качество / битрейт (снова до 64kbps) и вычислить "хэш" звука
  5. если 4. звуковой хэш находится в любом из 2. звуковых хешей, возвращающих соответствующую музыку

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

Я на правильном пути? Может ли кто-нибудь предоставить мне конкретную документацию или примеры ? Мидори, кажется, даже распознает hum's, это очень впечатляет! Как они это делают?

Существуют ли звуковые хеши или это что-то, что я только что придумал? Если они делают, как я могу их рассчитать? И что еще более важно, как я могу проверить, находится ли child-hash в father-hash?

Как бы я занялся построением аналогичной системы с Python (может быть, встроенным модулем) или PHP ?

Некоторые примеры (желательно на Python или PHP) будут высоко оценены. Заранее спасибо!

Ответы [ 9 ]

11 голосов
/ 15 января 2010

Я занимаюсь поиском музыкальной информации (MIR). Основополагающая статья о музыкальной дактилоскопии принадлежит Хайтсме и Калкеру в 2002-03 гг. Google должен получить это.

Я прочитал раннюю (очень раннюю; до 2000 года) белую книгу о методе Шазама. В этот момент они просто в основном обнаруживали спектрально-временные пики, а затем хэшировали пики. Я уверен, что процедура эволюционировала.

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

Материалы ISMIR свободно доступны в Интернете. Там можно найти ценные вещи: http://www.ismir.net/

Я согласен с использованием существующей библиотеки, такой как Marsyas. Зависит от того, чего вы хотите. Я думаю, что Numpy / Scipy здесь незаменим. Простые вещи можно написать на Python самостоятельно. Черт возьми, если вам нужны такие вещи, как STFT, MFCC, я могу отправить вам код по электронной почте.

10 голосов
/ 15 января 2010

Я работал на периферии крутого фреймворка, который реализует несколько методов поиска музыкальной информации. Я вряд ли эксперт (правка: на самом деле я не близко к эксперту, просто чтобы уточнить), но я могу сказать, что быстрое преобразование Фурье используется повсеместно с этим материалом. Анализ Фурье дурацкий, но его применение довольно простое. В основном вы можете получить много информации об аудио, когда анализируете его в частотной области, а не во временной области. Это то, что дает вам анализ Фурье.

Это может быть немного не по теме от того, что вы хотите сделать. В любом случае, в проекте есть несколько классных инструментов, с которыми можно поиграть, а также просмотреть исходный код самой базовой библиотеки: http://marsyas.sness.net

4 голосов
/ 06 июня 2014

Недавно я перенес свою систему распознавания отпечатков пальцев на Python:

https://github.com/dpwe/audfprint

Он может распознавать небольшие (5-10 секунд) фрагменты из справочной базы данных, содержащей 10 с тысяч треков, и достаточно устойчив к шуму и искажениям канала. Используются комбинации локальных спектральных пиков, аналогичные системе Shazam.

Это может соответствовать только одной и той же дорожке, так как оно основано на мелких деталях частот и разницы во времени - оно даже не будет соответствовать различным дублям, конечно же, не для кавер-версий или шумов. Насколько я понимаю, Midomi / SoundHound работает путем подбора шумов друг к другу (например, через динамическое искажение времени ), а затем имеет набор человеческих связей между наборами гумов и предполагаемой музыкальной дорожкой.

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

3 голосов
/ 15 января 2010

MFCC, извлеченный из музыки, очень полезен для нахождения тембрового сходства между песнями ... это чаще всего используется для поиска похожих песен. Как отметил Даррен, Marsyas - это инструмент, который можно использовать для извлечения MFCC и поиска похожих песен путем преобразования MFCC в одно векторное представление.

Кроме MFCC, Rhythm также используется для поиска сходства песен. В Mirex 2009

представлено несколько работ.

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

2 голосов
/ 10 ноября 2012

Проект MusicBrainz поддерживает такую ​​базу данных. Вы можете делать запросы к нему на основе отпечатка пальца.

Проект существует уже некоторое время и в прошлом использовались разные отпечатки пальцев. См. здесь для списка.

Последний использованный ими отпечаток пальца - AcoustId . Существует библиотека Chromaprint (также с привязками Python), где вы можете создавать такие отпечатки пальцев. Вы должны кормить его необработанными данными PCM.

Недавно я написал библиотеку на Python, которая выполняет декодирование (используя FFmpeg) и предоставляет такие функции, как создание отпечатка AcoustId (используя Chromaprint) и другие вещи (также для воспроизведения потока через PortAudio). См. здесь .

1 голос
/ 17 января 2010

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

Что касается метода Акселя, я думаю, вам не стоит беспокоиться о запросе, будь то пение или просто гудение, поскольку вы не реализуете программу распознавания речи. Но мне любопытно, что ваш метод использует хеш-функции. Не могли бы вы объяснить это мне?

1 голос
/ 15 января 2010

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

1 голос
/ 15 января 2010

Прошло много времени с тех пор, как я последний раз занимался обработкой сигналов, но вместо понижающей дискретизации вы должны смотреть на представления в частотной области (например, FFT или DCT). Затем вы можете создать своего рода хеш и найти песню базы данных с такой последовательностью в.

Хитрая часть делает этот поиск быстрым (возможно, некоторые статьи по поиску генов могут быть интересны). Я подозреваю, что iTunes также обнаруживает инструменты, чтобы сузить поиск.

0 голосов
/ 15 сентября 2015

Для запроса с функцией гудения, это сложнее, чем решение для снятия отпечатков пальцев, сложность исходит от:

  • как эффективно собрать базу данных мелодий в реальных приложениях? Многие демо-системы используют midi для сборки, но стоимость решения midi крайне недоступна для компании.
  • как бороться с дисперсией времени, например, пользовательский гул может быть быстрым или медленным. использовать DTW? да, DTW - очень хорошее решение для работы с временными рядами с временным отклонением, НО это стоит слишком большой нагрузки на процессор.
  • как сделать индекс временных рядов?

Вот демонстрационный запрос с гудением проекта с открытым исходным кодом, https://github.com/EmilioMolina/QueryBySingingHumming, может быть ссылкой.

...