Создание аудио-классификационного конвейера для идентификации композиторов классической музыки

Создание аудио-классификатора для идентификации композиторов классической музыки

Пошаговое руководство по созданию модели классификации на основе звукового машинного обучения для нескольких ведущих классических композиторов и размещению ее на Hugging Face

Фото Стефани Андраде на Unsplash

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

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

  • Набор данных MusicNet – подобранная коллекция из 330 свободно лицензированных (CC0: Public Domain) метками классических музыкальных записей;
  • Блокноты Kaggle – популярный сервис общего назначения, предоставляющий, например, бесплатный уровень с GPU NVIDIA TESLA P100, доступный зарегистрированным пользователям Kaggle для обучения моделей машинного обучения;
  • Модель wav2vec2-base-960h от Meta с примерно 95 миллионами обучаемых параметров, предварительно обученная и дообученная на 960 часах Librispeech на аудио речи с частотой дискретизации 16 кГц, используется для обучения выборки аудиоданных из MusicNet:
  • наконец, портал HuggingFace для обучения, публикации и обслуживания моделей машинного обучения.

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

Выбор данных и сэмплирование для многоклассовой аудио-классификации

После загрузки исходных данных они преобразуются к частоте 16 кГц, преобразуются в массив NumPy с использованием библиотеки torchaudio и далее усекаются до 100-секундных сэмплов для экономии памяти во время обучения:

def get_transform_audio(file):    audio,rate = torchaudio.load(str(file))    transform = torchaudio.transforms.Resample(rate,RATE_HZ)    audio = transform(audio).squeeze(0).numpy()    return audio[:MAX_LENGTH] # усечение до первой части аудио для экономии ОЗУdd['audio'] = dd['file'].progress_apply(get_transform_audio)