Как любителю музыки и данных идея объединить эти две вещи казалась заманчивой. Инновационные компании, такие как Spotify и Shazam, смогли разумно использовать музыкальные данные, чтобы предоставлять пользователям потрясающие услуги! Я хотел попробовать свои силы в работе со звуковыми данными и попытаться построить модель, которая могла бы автоматически классифицировать песню по жанрам. Код моего проекта можно найти здесь.

Алгоритм автоматической классификации жанров может значительно повысить эффективность музыкальных баз данных, таких как AllMusic. Это также может помочь системам рекомендаций по музыке и генераторам списков воспроизведения, которые используют такие компании, как Spotify и Pandora. Это действительно забавная проблема, с которой можно поиграть, если вы любите музыку и данные!

У этой проблемы есть две основные проблемы:

  1. Музыкальные жанры определены слабо. Настолько, что люди часто спорят о жанре песни.
  2. Извлечь отличительные признаки из аудиоданных, которые могут быть введены в модель, - нетривиальная задача.

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

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

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

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

Спектрограмму mel можно рассматривать как визуальное представление звукового сигнала. В частности, он показывает, как спектр частот меняется во времени. Я написал статью (здесь), в которой подробно рассматривается эта тема, если вы хотите узнать больше. Для тех, кто занимается TL; DR, вот краткое изложение:

Преобразование Фурье - это математическая формула, которая позволяет нам преобразовывать звуковой сигнал в частотную область. Он дает амплитуду на каждой частоте, и мы называем это спектром. Поскольку частотное содержимое обычно меняется со временем, мы выполняем преобразование Фурье на перекрывающихся оконных сегментах сигнала, чтобы получить визуальное представление о спектре частот с течением времени. Это называется спектрограммой. Наконец, поскольку люди не воспринимают частоту в линейной шкале, мы сопоставляем частоты с шкалой mel (мера высоты тона), благодаря чему равные расстояния по высоте звука одинаково далеки от человеческого уха. Мы получаем спектрограмму mel.

Лучшая часть? Его можно сгенерировать с помощью всего нескольких строк кода на Python.

import librosa
y, sr = librosa.load('./example_data/blues.00000.wav')
mel_spect = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=2048, hop_length=1024)
mel_spect = librosa.power_to_db(spect, ref=np.max)
librosa.display.specshow(mel_spect, y_axis='mel', fmax=8000, x_axis='time');

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

Это круто! Некоторые идиосинкразические различия в жанрах отражены в спектрограмме mel, что означает, что из них можно получить отличные черты.

По сути, мы превратили проблему в задачу классификации изображений. Это здорово, потому что есть модель, созданная специально для этой задачи: сверточная нейронная сеть (CNN). Это подводит меня к главному вопросу моего проекта: насколько точно сверточная нейронная сеть может идентифицировать музыкальные жанры с помощью мел-спектрограмм?

Давай займемся этим!

Сбор и предварительная обработка данных

Я использовал набор данных GTZAN Genre Collection (находится здесь). Этот набор данных использовался в хорошо известной статье по классификации жанров в 2002 году. Набор данных включает 10 различных жанров (блюз, классика, кантри, диско, хип-хоп, джаз, металл, поп, регги и рок) по 100 песен в каждом жанре ( каждые 30 секунд выборки). Поскольку все они были файлами .wav, я смог использовать библиотеку librosa, чтобы загрузить их в Jupyter Notebook.

Как видно выше, вычисление спектрограммы mel с использованием librosa довольно просто. Мне удалось написать функцию, которая вычисляет спектрограмму mel для каждого аудиофайла и сохраняет их в массиве numpy. Он возвращает этот массив, а также массив с соответствующими метками жанра.

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

Перед построением модели необходимо сделать несколько шагов:

  1. Значения спектрограмм mel следует масштабировать так, чтобы они находились между 0 и 1 для вычислительной эффективности.
  2. В настоящее время данные представляют собой 1000 строк спектрограмм Mel размером 128 x 660. Нам нужно изменить его форму, чтобы она была 1000 строк размером 128 x 660 x 1, чтобы представить, что существует единственный цветовой канал. Если бы у нашего изображения было три цветовых канала, RGB, нам бы потребовалось, чтобы это дополнительное измерение было 3.
  3. Целевые значения должны быть закодированы в горячем режиме, чтобы их можно было передать в нейронную сеть.

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

Как поступил CNN?

Перед запуском CNN я хотел обучить нейронную сеть прямого распространения (FFNN) для сравнения. CNN имеют дополнительные уровни для обнаружения краев, что делает их хорошо подходящими для задач классификации изображений, но они, как правило, более затратны в вычислительном отношении, чем FFNN. Если бы FFNN могла работать так же хорошо, не было бы необходимости использовать CNN. Поскольку основное внимание в этом посте уделяется CNN, я не буду вдаваться в подробности этой модели, но лучшая модель FFNN получила тестовый балл 45%.

Как и предполагалось, модель CNN оказалась намного лучше! Лучшая модель CNN (основанная на точности результатов теста) набрала 68%. Это не так уж плохо, особенно учитывая сложность задачи, но все же не так уж и плохо. Оценка обучения составила 84%, поэтому модель была переобучена. Это означает, что он действительно хорошо настраивался на данные обучения, а не на новые данные. Но даже в этом случае он, безусловно, учится.

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

Вот краткое изложение окончательной архитектуры:

  1. Входной слой: 128 x 660 нейронов (128 шкал Mel и 660 временных окон)
  2. Сверточный слой: 16 различных фильтров 3 x 3
  3. Максимальный уровень пула: 2 x 4
  4. Сверточный слой: 32 различных фильтра 3 x 3
  5. Максимальный уровень пула: 2 x 4
  6. Плотный слой: 64 нейрона
  7. Выходной слой: 10 нейронов для 10 разных жанров.

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

Более глубокий взгляд

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

Блюз или джаз?

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

Регги или хип-хоп?

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

Это рок?

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

Что это говорит нам?

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

Тем не менее, я бы сказал, что для компьютера точность в 68% не так уж и плоха, но я верю, что есть возможности для улучшения. Я могу с уверенностью сказать, что CNN справился лучше, чем FFNN, и что он смог изучить и предсказать с приличной точностью жанр песни.

Естественный вопрос

Что произойдет, если мы удалим некоторые жанры, которые имеют общие характеристики с другими жанрами? Будет ли модель работать лучше? Как это обстоит с бинарной классификацией? Это были некоторые из вопросов, которые все еще оставались у меня в голове. Если вы хотите глубже погрузиться в эти вопросы, следите за моей следующей публикацией.

Продолжение следует…