Pull to refresh

EchoPrint — открытая система распознавания музыки

Reading time4 min
Views248K
Наверняка многие из вас слышали и знают про системы идентификации музыки вроде TrackID, Shazam, MusicBrainz или онлайновой Audiotag.info, позволяющие по записанному отрывку песни узнать ее название. Все они в достаточной степени хороши, но имеют общий недостаток — закрытый код и, соответственно, ограниченную сферу применения. TrackID вы можете использовать только на телефонах Sony Ericsson, Shazam — тоже только на телефонах, хотя и на более обширном списке платформ, а Music Brainz вообще неясно, работает ли вообще.

Ребята же из компании Echo Nest, решили, что распознавание музыки должно быть таким же доступным миру явлением, как электронная почта или DNS :), и выпустили своё детище полностью под MIT License. А детище, надо сказать, у них очень серьёзное — еще бы, если основателями компании являются доктора наук из MIT Media Lab .

Тот зверьфункционал, который они выпустили на свободу, не ограничивается только распознаванием музыки по записанному отрывку, но и позволяет делать такие вещи, как поиски дубликатов музыки, массовое распознавание и заполнение тэгов в музыкальных коллекциях, проверка аудио/видео на содержание того или иного материала, синхронизация коллекций из различных музыкальных пространств (iTunes <-> Last.fm <-> Spotify, например) и много чего еще.


Как это работает?


Вкратце — на стороне клиента запускается кодогенератор, формирующий уникальный отпечаток записанной части песни, и отправляет его на сервер на опознание.

Клиент

Клиент, он же echoprint-codegen, поставляется в виде кроссплатформенной библиотеки и бинарника. Вот типичный пример использования — проверить 20 секунд из mp3 файла, начиная с 10-й секунды:
echoprint-codegen ./recorded.mp3 10 20 | \
curl -F "query=@-" http://developer.echonest.com/api/v4/song/identify?api_key=MY_API_KEY
{"response"{"status"{"version""4.2""code"0"message""Success"},
"songs"[{"tag"0"score"66"title""Creep""message""OK (match type 6)",
"artist_id""ARH6W4X1187B99274F""artist_name""Radiohead""id""SOPQLBY12A6310E992"}]}}

А если вы хотите использовать это в своей программе, то тоже несложно:
Codegen * pCodegen = new Codegen(const float* pcm, uint numSamples, int start_offset);
string code = pCodegen->getCodeString(); 

Как становится ясно, прикрутить это к своему любимому языку/проекту совсем несложно — лишь бы фантазии хватило. Кстати, для самых активных ребята устроили даже конкурс с призом в 10000$ на самое интересное и новаторское музыкальное приложение, использующее возможности EchoNest API в полной мере. А API у них довольно обширное, связывающее музыкальные композиции по всем мыслимым и немыслимым связям — от основного географического расположения и года рождения артиста до уровня танцевальности композиции.

Для получения цифрового отпечатка песни используется собственный алгоритм, The Echo Nest Musical Fingerprint aka ENMFP, который компания давно и успешно использует для других своих сервисов — вроде поиска похожих песен, подсчета BPM и прочего. Сами ребята заявляют, что они собаку съели именно на анализе песен (не просто звуков, а именно музыкальных композиций).
Про API подробнее можно узнать на портале для разработчиков.

Сервер

Код серверной части также находится в открытом доступе на github, так что, при желании, можете поднять собственный сервер — Echo Nest даже выложили в общий доступ несколько гигабайт уже обработанных данных. Движок сервера основан на базе поискового сервера Apache Solr, в качестве базы данных используется Tokyo Tyrant.

Пока что данных на их сервере сравнительно немного — около 150 000 песен, но по заявлениям компании, они импортируют многомиллионную коллекцию 7digital, активно сотрудничают с MusicBrainz (который даже поднял свой echoprint-сервер для интеграции со своими данными), а также предоставляют функционал для загрузки новых песен пользователями.

Использование



Разумеется, одной из основных функций использования остается все таки распознавание услышанной музыки. Услышал хорошую песню, достал телефон, нажал кнопку — и узнал кто поёт. Я быстренько написал echoprint-клиент для Maemo/Meego, и в ходе тестирования пока могу сказать следующее:
  • некоторые исполнители распознаются с очень большой вероятностью, а некоторые через раз
  • 20 секунд это минимальный период записи. увеличение времени записи повышает шанс распознавания
  • громкость почти не влияет на результат — алгоритм достаточно хорошо нормализирует звук
  • Metallica распознается лучше, чем Бетховен :-D
  • Иногда ошибается :(

Более того, они даже утверждают, что алгоритм позволяет найти похожие версии — вроде Live выступлений или похожих каверов.
Пока что, конечно, рано называть echoprint убийцей Shazam'а, но это лишь дело времени. Такие проекты, будучи выпущены на свободу, начинают развиваться на порядки быстрее.

Выводы

Главное, что мне хотелось бы донести, помимо простого обзора этого замечательного open-source проекта — это тот факт, что компания действительно создает нечто важное (не для всех конечно). Это не просто «ещё один алгоритм обработки музыки», это целая энциклопедия музыки, позволяющая найти, описать и объединить все когда либо выпущенные композиции. В отличие от того же Shazam, в базе данных Echo Nest может быть информация и о малоизвестных группах — хоть свои собственные песни загружайте. Кроме того, один из проектов, под кодовым названием Rosetta Stone, призван объединить различные пространства идентификаторов — например, той же MusicBrainz ID или Napster Artist ID.

Вобщем, своего рода музыкальная Wikipedia, которая благодаря открытости обещает вырости в нечто поистине грандиозное.
Tags:
Hubs:
Total votes 89: ↑87 and ↓2+85
Comments37

Articles