Комментарии 22
В посте про Shazam без этой картинки не обойтись
Спасибо! Как раз интересует смежный вопрос: существует ли готовое десктопное решение — софт или библиотека — аналог Шазама? Хочется скормить ему пару терабайт музыки с локального HDD, той о которой Эвери Ли Чунь Вонг ни сном ни духом…
если я правильно помню, что когда то была tunatic для десктопа
Когда я сидел на винде, то наводил порядок в музыке с помощью программы TagScanner — прям полностью всё ей скормить вряд ли получится, но вообще она довольно здорово ищет инфу для всяких там «Track 2» в сети, особенно если речь не об отдельном треке, а об альбоме.
Кажется я плохо сформулировал запрос… Мне нужно а) создать базу данных по 2 ТБ музыки с локального HDD, б) пробить 20-секундный отрывок по этой базе. Всё на одном локальном компьютере. То есть делать ровно то же что делает Шазам, серверная + клиентская часть.
Вот, кстати, ещё одна частная разработка — audiotag.info от создателя websound.ru, но опять же это — грустный веб-сервис, только клиент.
А тагсканнер ищет по CDDB — это неинтересно.
Вот, кстати, ещё одна частная разработка — audiotag.info от создателя websound.ru, но опять же это — грустный веб-сервис, только клиент.
А тагсканнер ищет по CDDB — это неинтересно.
НЛО прилетело и опубликовало эту надпись здесь
Есть еще the.echonest.com — недавно купленное Spotify'ем решение. В документации API есть вариант со скармливанием музыки и ее определением. Не просто конечно, но как вариант.
В открытом MusicBrainz Picard есть схожая функция.
Если кому интересно, есть еще более подробная статья о принципах работы Shazam, начиная с основ звука и музыки: http://coding-geek.com/how-shazam-works/
Статья имеет такое же отношение к алгоритмам по которым Shazam работает, как фраза «автомобили собирают из железа» к производству автомобилей. То что написал постом выше nile1 куда ближе. Но всё равно далеко.
Ещё ближе, но уже не очень далеко — писал Яндекс в своём блоге: habrahabr.ru/company/yandex/blog/181219
В реальности, как я подозреваю, всё куда сложнее. И куда интереснее настроено. Например, мне кажется, что для сравнения двух спектрограмм могут неплохо зайти свёрточные сети. Но боюсь, что реально как устроен Шазам только Шазам и может статью написать.
Ещё ближе, но уже не очень далеко — писал Яндекс в своём блоге: habrahabr.ru/company/yandex/blog/181219
В реальности, как я подозреваю, всё куда сложнее. И куда интереснее настроено. Например, мне кажется, что для сравнения двух спектрограмм могут неплохо зайти свёрточные сети. Но боюсь, что реально как устроен Шазам только Шазам и может статью написать.
Описанный алгоритм точно работает. Конечно в шазаме всё сложнее. Но базовый алгоритм именно такой (или как минимум был таким). Я использовал данный подход для автоматического определения стандартных приветствий автоответчиков. На российских операторах мобильной связи работает «на отлично». Преимущественно из-за того, что приветствия голосовых почтовых ящиков изменять нельзя (или никто этого не делает).
Этот алгоритм не будет работать на записях музыки поле нескольких десятков, максимум сотен сэмплов. Особенно зашумлённых. Не смущайте людей, а то попробуют сделать. Парочку записей автоответчиков вы им, безусловно, распознаете.
А базовый алгоритм не такой, а через поиск отпечатка на спектрограмме. Как в статье, что привёл nile1 или я.
А базовый алгоритм не такой, а через поиск отпечатка на спектрограмме. Как в статье, что привёл nile1 или я.
Даже и не думал смущать никого.
Как уже написал чуть ниже — год назад реализовал данный алгоритм для продукта Naumen Phone.
Он по первым нескольким секундам (не 20-30, как шазам) телефонного разговора определяет является ли удалённая сторона шаблонным приветствием какого либо оператора связи (всякие абонент недоступен и тп). Шаблонов и правда немного — несколько десятков. Но работает всё прекрасно. Основное отличие — сравнение «потока частотных характеристик» с шаблоном (а не «фингерпринта») сделано для уменьшения длительности требуемого участка звука.
Код по понятным причинам опубликовать не могу… :)
Как уже написал чуть ниже — год назад реализовал данный алгоритм для продукта Naumen Phone.
Он по первым нескольким секундам (не 20-30, как шазам) телефонного разговора определяет является ли удалённая сторона шаблонным приветствием какого либо оператора связи (всякие абонент недоступен и тп). Шаблонов и правда немного — несколько десятков. Но работает всё прекрасно. Основное отличие — сравнение «потока частотных характеристик» с шаблоном (а не «фингерпринта») сделано для уменьшения длительности требуемого участка звука.
Код по понятным причинам опубликовать не могу… :)
теперь понятно, почему шазам ни фига не распознает :(
Прекрасная статья, спасибо!
Есть одно небольшое замечание — я бы слова «вот этот программист» заменил на что-нибудь более уважительное. Год назад писал библиотеку для распознавания приветствий стандартных автоответчиков операторов связи для продукта Naumen Phone и статья, на которую вы ссылаетесь, буквально howto. И, насколько я могу судить по вашему коду, она вам тоже очень помогла. Не сочтите за «наезд» — просто мнение и очень трепетное отношение к «нетикету»
Кстати «вот этот программист» долго бодался чтобы эта статья не была «выпилена» самим шазамом — можете почитать соседние посты в блоге. Дорогого стоит.
Есть одно небольшое замечание — я бы слова «вот этот программист» заменил на что-нибудь более уважительное. Год назад писал библиотеку для распознавания приветствий стандартных автоответчиков операторов связи для продукта Naumen Phone и статья, на которую вы ссылаетесь, буквально howto. И, насколько я могу судить по вашему коду, она вам тоже очень помогла. Не сочтите за «наезд» — просто мнение и очень трепетное отношение к «нетикету»
Кстати «вот этот программист» долго бодался чтобы эта статья не была «выпилена» самим шазамом — можете почитать соседние посты в блоге. Дорогого стоит.
Ох сколько там еще под капотом, даже сверх описанного тут. Особенно поиск по базе интересен становится…
Интереснее было бы услышать о SoundHound. Алгоритмы, скорее всего, схожи, но SoundHound умеет распознавать даже напевание определенной песни (понятно, что напевающий должен уметь петь). Или шазам тоже уже этому научился?
Я предполагал что там используется не простой БПФ а вэйвлет-преобразования или типа того.
Это учитывало бы не тольоко спектр а и его изменение на временном промежутке.
Это учитывало бы не тольоко спектр а и его изменение на временном промежутке.
Интересно, а есть ли связь алгоритма и высокочастотной торговли? То есть, можно ли составив базу по торгам достоверно предсказывать поведение рынка? Ведь задача весьма и весьма похожа.
Практическая значимость статьи — думаю ok.)
Я лишь хотел высказать правду про математику под капотом.
Мне очень не нравится, что людям кто не очень в теме приподносится неправильные фундаментальные штуки:
1. Про преобразования
ДПФ, Ряды Фурье, Фурьеринье (интегро-дифференциальный оператор)-- три соверешенно разные операции, работающие с разными видами сигналов — кортеж, периодический сигнал, просто сигнал соотвественно. (Опуская вопрос о существовании таковых для последних двух)
«С его помощью можно преобразовать конечный набор образцов сигнала, взятых с равными промежутками времени, в список коэффициентов конечной комбинации комплексных синусоид, упорядоченных по частоте, принимая во внимание, что эти синусоиды были дисретизированы с одной и той же частотой. „
1. Комплексных синусоид — ни о каких sin-ах от комплексных величин речи не идёт (Если есть предложение как ввести эту операцию — скажите пожалуйста). Если вы имееты ввиду комплексные экспоненты — то выражайтесь правильно.
2. Дискретное преобразование Фурье — это просто операция на векторах длины N состоящих из скаляров.
3. Вы подумайте сами о чём говорите — семлы взяты на отрезке [0,L] лежащие друг от друга на расстоянии 1/2B для сигнала. Вы работаете с непериодическим сигналом — и вы говорите, что какие-то cos-сы (непрерывные функции) в линейной комбинации представляют кортеж. Чушь.
Про ДПФ:
Первая точка зрения происходящую ситуацию:
Это преобразование не соответствует обычному преобразованию Фурье. Это отображения из вектора конечной длины N с действительными числами в вектор такой же длинны N но с комплексными числами. Но оно часто обладает теми же важными свойствами, которыми обладает непрерывный аналог.
Вторая точка зрения на происходящую ситуацию:
Если очень постараться, и применить некоторые, строго говоря неверные, приближения, то всё таки можно “свести” дискретное преобразование к обычному.
2. Про Фурье
“В 19 веке Жан Батист Джозеф Фурье сделал выдающееся открытие. Заключается оно в том, что любой сигнал во временной области эквивалентен сумме некоторого количества (возможно, бесконечного) простых синусоидальных сигналов, при условии, что каждая синусоида имеет определённую частоту, амплитуду и фазу. „
первое замечание: Жан Батист Джозеф Фурье ошибался
второе замечание: Вы даже треугольный сигнал (sawtooth) не можете представить таким рядом.
Фурье заложил основы, но к этому преобразованию приложили свои руки: Риман, Лебега, Шварц, Хевисайд (в неявном виде)
p.s. Я из-за отрициательной кармы не могу писать полноценные статьи на этом ресурсе, где я как понимаю можно писать научно-популярные статьи, но я не парюсь по этому поводу, и залил себе на хоум пейдж:
https://sites.google.com/site/burlachenkok/articles/faq_ft
Пишите на burlachenkok@gmail.com — если что.
Я лишь хотел высказать правду про математику под капотом.
Мне очень не нравится, что людям кто не очень в теме приподносится неправильные фундаментальные штуки:
1. Про преобразования
ДПФ, Ряды Фурье, Фурьеринье (интегро-дифференциальный оператор)-- три соверешенно разные операции, работающие с разными видами сигналов — кортеж, периодический сигнал, просто сигнал соотвественно. (Опуская вопрос о существовании таковых для последних двух)
«С его помощью можно преобразовать конечный набор образцов сигнала, взятых с равными промежутками времени, в список коэффициентов конечной комбинации комплексных синусоид, упорядоченных по частоте, принимая во внимание, что эти синусоиды были дисретизированы с одной и той же частотой. „
1. Комплексных синусоид — ни о каких sin-ах от комплексных величин речи не идёт (Если есть предложение как ввести эту операцию — скажите пожалуйста). Если вы имееты ввиду комплексные экспоненты — то выражайтесь правильно.
2. Дискретное преобразование Фурье — это просто операция на векторах длины N состоящих из скаляров.
3. Вы подумайте сами о чём говорите — семлы взяты на отрезке [0,L] лежащие друг от друга на расстоянии 1/2B для сигнала. Вы работаете с непериодическим сигналом — и вы говорите, что какие-то cos-сы (непрерывные функции) в линейной комбинации представляют кортеж. Чушь.
Про ДПФ:
Первая точка зрения происходящую ситуацию:
Это преобразование не соответствует обычному преобразованию Фурье. Это отображения из вектора конечной длины N с действительными числами в вектор такой же длинны N но с комплексными числами. Но оно часто обладает теми же важными свойствами, которыми обладает непрерывный аналог.
Вторая точка зрения на происходящую ситуацию:
Если очень постараться, и применить некоторые, строго говоря неверные, приближения, то всё таки можно “свести” дискретное преобразование к обычному.
2. Про Фурье
“В 19 веке Жан Батист Джозеф Фурье сделал выдающееся открытие. Заключается оно в том, что любой сигнал во временной области эквивалентен сумме некоторого количества (возможно, бесконечного) простых синусоидальных сигналов, при условии, что каждая синусоида имеет определённую частоту, амплитуду и фазу. „
первое замечание: Жан Батист Джозеф Фурье ошибался
второе замечание: Вы даже треугольный сигнал (sawtooth) не можете представить таким рядом.
Фурье заложил основы, но к этому преобразованию приложили свои руки: Риман, Лебега, Шварц, Хевисайд (в неявном виде)
p.s. Я из-за отрициательной кармы не могу писать полноценные статьи на этом ресурсе, где я как понимаю можно писать научно-популярные статьи, но я не парюсь по этому поводу, и залил себе на хоум пейдж:
https://sites.google.com/site/burlachenkok/articles/faq_ft
Пишите на burlachenkok@gmail.com — если что.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Shazam: алгоритмы распознавания музыки, сигнатуры, обработка данных