Вы когда-нибудь задумывались, как работает ваше любимое приложение для поиска музыки? Что ж, это правильное место, чтобы узнать.

С детства я увлекался музыкой и техникой. Большую часть дня я слушал музыку и читал о технологиях. Иногда я слушал какую-то новую песню, которая играла вокруг меня, и она мне нравилась. Я хотел сыграть в нее, но не всегда поиска в Google было достаточно, чтобы найти песню. Затем появилось приложение Shazam, и на тот момент это было для меня отличным подарком. После того, как я обнаружил, что некоторые из моих любимых песен играют, моя техническая сторона вмешалась и захотела узнать, как это работает. После некоторого исследования я обнаружил, что он использует машинное обучение для сопоставления музыки. Проведя дополнительные исследования, я овладел концепциями. Что позже побудило меня поделиться этой идеей с другими людьми.

Итак, я представляю вам краткое понимание концепции приложений для музыкальных совпадений, таких как Shazam. Здесь мы создадим простой прототип приложения для поиска музыки с использованием Deep Learning. К концу статьи вы получите полное представление о приложениях для поиска музыки.

Некоторые основные понятия

Кратковременное преобразование Фурье

Кратковременное преобразование Фурье (STFT) - это преобразование Фурье, используемое для определения синусоидальной частоты и фазового содержания локальных участков сигнала по мере его изменения во времени. . Применяя STFT, мы можем разложить звуковую волну на ее частоты. Результат этого называется спектрограммой. Спектрограмму можно представить как набор стеков быстрого преобразования Фурье, расположенных друг над другом. Это способ визуального представления громкости или амплитуды звука.

Спектрограмма Мела

Мел-спектрограмма - это спектрограмма, в которой частоты переведены в мел-шкалу. На изображении ниже показана мел-спектрограмма звукового клипа.

Сиамские нейронные сети

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

Нейронные сети N1 и N2 по сути имеют одинаковую архитектуру. Когда входные векторы подаются в сеть, они оба генерируют функцию, которая также известна как встраивание в определенной литературе. Эти нейронные сети имеют одинаковые веса и обучены таким образом, что они генерируют такие вложения, что при вычислении расстояния для этих двух вложений расстояние будет минимальным для одинаковых векторов и максимальным для разных векторов.

Обзор

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

Музыкальные поисковые системы работают по принципу акустического сопоставления отпечатков пальцев в большой базе песен. Всякий раз, когда мы записываем какой-то звук, музыка обрабатывается алгоритмом, который, проще говоря, преобразует музыку в какой-то акустический отпечаток пальца или особенность. Эта функция сочетается с функциями песни, хранящейся в большой базе данных песен, которая содержит почти все популярные песни в мире. В результате возвращается песня, фишка которой имеет максимальное сходство, и все довольны.

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

Статья будет разделена на три части: -

  1. Построение и обучение сиамской нейронной сети.
  2. Создание нейронной сети с использованием весов из этой сиамской сети, которая оптимизирует поиск.
  3. Осуществляем поиск.

Создание и обучение сиамской нейронной сети

Для обучения любой модели очень важно получить соответствующие данные. Здесь я использую свою музыкальную коллекцию в качестве набора данных для проекта. Для реального проекта нам может потребоваться создать набор данных по-другому, но, чтобы все было просто и понятно для большинства читателей, я постарался сделать все как можно проще.

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

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

А теперь давайте построим сиамскую сеть.

Сначала мы построим кодировщик сиамской сети на предыдущем рисунке, блоки N1 и N2 называются кодировщиками сиамских сетей, потому что они кодируют входные векторы или изображение в некое вложение фиксированной длины.

Здесь мы построим кодировщик, который будет иметь 4 сверточных слоя с ядром 3x3 с фильтрами порядка 32,64,64,64. В конце за ними последует глобальный слой maxpooling2D.

Создав функцию кодировщика, давайте теперь построим сиамскую сеть. Здесь мы создадим два экземпляра кодировщика, которые будут иметь одинаковый вес, и создадим два вложения. Результат этих вложений будет передан на слой, который вычисляет евклидово расстояние между двумя вложениями. Выходные данные слоя расстояний будут переданы в плотный слой с активацией сигмовидной формы, который вычисляет оценку сходства.

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

Давайте реализуем вышеуказанные концепции в коде.

Теперь создадим генератор данных и другие служебные функции.

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

Когда генератору предлагается сгенерировать пакет изображений, этот пакет содержит данные, как показано выше. Пусть размер пакета равен n, тогда n / 2 пакета будет содержать пару похожих изображений и их label будет 1, в то время как оставшиеся n // 2 будут иметь пару разных изображений, помеченных как 0.

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

Функция load_img загружает изображения спектрограммы mel и изменяет их размер.

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

В приведенном ниже коде мы читаем каждый файл песни один за другим, используя библиотеку librosa, и сохраняем спектрограмму всего трека, разделенную на 10 секунд каждый. Таким образом, во время поиска песни пользователю необходимо иметь запись не менее 10 секунд.

В моем случае песни находятся в папке D: / Songs /.

При этом генерируется спектрограмма всех аудиосегментов и сохраняется в папке спектрограмм в том же рабочем каталоге.

Теперь давайте обучим сиамскую сеть на этих изображениях спектрограммы mel, используя раннюю остановку и контрольную точку модели с разделением на поезд и тест 75% и 25% соответственно.

Теперь мы успешно обучили нашу сиамскую сеть, и она готова к проверке наших песен, но существует серьезная проблема, заключающаяся в том, что запуск сиамской сети каждый раз на наших спектрограммах для проверки сходства является очень трудоемким и дорогостоящим в вычислительном отношении процессом. Сами по себе нейронные сети очень дороги в вычислительном отношении. Поэтому в следующем разделе мы воспользуемся весом этой модели и построим еще одну оптимальную сеть. Мы также применим трюк, который снизит временную сложность с O (n²) до O (n).

Создание нейронной сети с использованием весов из этой сиамской сети, которая оптимизирует поиск

Поскольку сиамская сеть должна будет запускаться каждый раз, когда будет проводиться сравнение, это окажется огромной вычислительной нагрузкой для нашей системы. В этом разделе мы предлагаем идею оценки расстояния между особенностями фрагмента песни. Таким образом, нейронная сеть должна будет запускаться только один раз за весь поисковый процесс.

Идея состоит в том, что, поскольку сиамская сеть имеет одинаковые веса между сетями, мы можем получить эти веса и создать единую сеть, имеющую ту же архитектуру, что и блоки N1 и N2 в нашей сиамской сети, и перенести веса из нашей предыдущей сети. к нему. Полученная сеть сможет создавать вложения фрагментов песен, которые будут храниться в нашей базе данных. Когда пользователь запрашивает песню, она преобразуется во вложения, хранящиеся в нашей базе данных, и возвращается песня, имеющая максимальное сходство или минимальное расстояние.

Позвольте мне разобрать эту идею на следующих этапах.

Давайте импортируем все необходимые библиотеки. Также давайте позаимствуем несколько вспомогательных функций из предыдущих разделов.

Примечание: -Все эти коды принадлежат другому файлу с именем test.

Теперь давайте загрузим обученную сиамскую модель и посмотрим на ее представление в Keras с помощью функции summary класса модели.

Поскольку сиамская сеть имеет одинаковые веса для блоков N1 и N2, Керас использует один и тот же слой для прогнозирования как вектора 1, так и вектора 2, что очевидно из резюме модели. Следовательно, мы можем взять этот слой из сиамской модели, который будет действовать как наша новая модель для генерации встраивания.

Используя атрибут model.layers класса модели, мы можем получить слои модели в виде списка. Если мы обратим внимание на сводку модели, то увидим, что нужный нам слой представлен как индекс 2. Следовательно, мы можем получить этот слой, как показано ниже. Также мы рассмотрим сводку этой новой модели.

Из резюме модели ясно, что новая модель имеет ту же структуру, что и блок N1 или N2 сиамской модели, и, следовательно, ее можно использовать для создания встраивания фрагмента песни. Кроме того, поскольку модель была получена из обученной сиамской модели, она имеет все свои веса.

Теперь, как и в предыдущем разделе, где мы создали спектрограммы для фрагментов песен для обучения модели, здесь мы также создадим спектрограмму и сохраним их в другой папке под названием Test_Spectrograms. Вскоре после того, как мы создадим файл с помощью функции create_spectrogram, мы также откроем этот файл и будем использовать модель встраивания для генерации встраивания для него. Также в то же время мы добавляем название обрабатываемой песни в качестве ключа в словарь songsspecdict. Значение ключа - это массив, содержащий все встраиваемые фрагменты этой песни.

Здесь нас интересует словарь, полученный выше. Для простоты я решил хранить встраиваемые песни в словаре, а не в базе данных, чтобы большинство наших читателей это поняли.

Также после создания словаря мы сохраняем его с помощью библиотеки pickle для дальнейшего использования.

Наш словарь выглядит так: -

{‘Song1’: [frag1_embedding, frag2_embedding,… .fragN_embedding], ’song2’: [frag1_embedding, frag2_embedding,… .fragN_embedding], ……}.

Теперь загрузим словарь для поиска.

Теперь мы готовы к поиску.

Выполнение поиска

Здесь мы загрузим первые 10 секунд песни Тейлор Свифт лучшего дня и создадим ее спектрограмму. Затем мы будем использовать нашу модель встраивания, чтобы сгенерировать для него встраивание. Это вложение будет сравниваться с теми, которые хранятся в нашем словаре, и с вложением, расстояние до которого минимально, тогда его ключ будет возвращен в качестве названия песни.

В моей папке test_songs были следующие песни:

13 Breathe (с участием Колби Кайлата) .m4a

14 Скажи мне, почему.m4a

15 Тебе не жаль.m4a

16 Как я тебя любил.m4a

18 The Best Day.m4a

Тейлор Свифт - Бесстрашный - Mp3indir.ML.mp3.

Результат был: -

Улучшение системы

Здесь, как вы можете заметить, мы использовали часть исходной записанной дорожки для поиска, но в реальном мире запись может включать в себя различные фоновые шумы, такие как гудки автомобилей, разговоры людей и т. Д. Кроме того, первые 10 секунд записи могут или может не включать полное содержание, которое должно было присутствовать, вместо этого, скажем, мы записали через 2 секунды после того, как песня была воспроизведена, поэтому это выравнивание трека может отсутствовать в реальном случае. Поскольку я хотел объяснить концепцию наиболее простым способом, я создал очень простой набор данных, поскольку создание одного только полноценного набора данных является очень трудоемкой задачей. Я только что создал набор данных, достаточный для объяснения концепции.

  • Можно использовать лучший набор данных, который содержит записи песен в различных условиях.
  • Возможно увеличение данных.
  • После получения подходящего набора данных сама модель может быть настроена путем добавления дополнительных слоев, сохраняя компромисс смещения и дисперсии.

Ссылки и дополнительная литература





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

Ссылка на записные книжки jupyter: -