Машинное обучение в транскрипции музыки

Машинное обучение - горячая тема. Благодаря всем доступным фреймворкам (TensorFlow, Caffe, Keras и т. Д.) Стало еще проще начать с собственного программного обеспечения на его основе. Благодаря сообществу открытого исходного кода у нас уже есть много предварительно обученных моделей, которые можно использовать по-разному.

Недавно я наткнулся на фреймворк magenta, построенный на тензорном потоке. Это исследовательский проект, посвященный роли машинного обучения как инструмента в творческом процессе. Просматривая демонстрации, которые они предоставляют, я обнаружил модель под названием «Начало и кадры», которая представляет собой предварительно обученную модель нейронной сети для преобразования необработанных аудиоданных, таких как mp3 / wav, в midi.

Возникает вопрос, а чем mp3 отличается от midi-файла? Проще говоря, файл MP3 - это сжатый аудиофайл. (Если вас интересует, как на самом деле работает структура файлов MP3, то в Википедии есть довольно хорошее и подробное объяснение). С другой стороны, MIDI - это файл, в котором нет исходных аудиоданных. Он предоставляет информацию о таких компонентах, как высота звука, громкость, модуляция и т. Д. В связи с тем, что исходный формат MIDI был разработан для клавишных инструментов, диапазон звуков по отношению к музыкальному звуку среднего C (C4) на пять октав выше и ниже, включая все полутона (у инструментов органа может быть больше октав, чем у стандартного фортепиано. Самые низкие ноты примерно на одну октаву ниже порога слышимости человека. Его обертоны, однако, слышны).

Хорошо, а в чем разница? Звук, который вы слышите при воспроизведении файла midi, создается в цифровом виде (вероятно, с помощью устройства / программы, с помощью которой вы его воспроизводите). Он просто использует свои данные, чтобы сыграть пьесу, похожую на музыканта, играющего на листах. MP3 - это аудиозапись.

Вернемся к началу и рамкам. Это модель CNN (сверточная нейронная сеть), в которой для общего прогнозирования используются два детектора (стеки нейронных сетей). Человек обучен находить все начальные кадры, которые в основном являются начальными кадрами заметки. Его также легче обнаружить, потому что амплитуда этой ноты находится на пике (отмечена красным прямоугольником). Другой детектор обучен находить каждый кадр, для которого активна заметка (желтый прямоугольник). Окончательный результат будет зависеть от прогноза, представленного обоими этими стеками.

Конечно, внутри все гораздо сложнее. Если вас интересуют подробности, то есть отличная статья, написанная авторами модели начала и фреймов. Вы можете найти это здесь".

Существует два распространения пурпурного - Python и JS.

Руководство по установке версии python находится по ссылке Github. К сожалению, у меня было несколько проблем с автоматической установкой на мою macOS (High Sierra). Ручная установка прошла довольно гладко, но после попытки расшифровать простой 5-секундный файл WAV я получил ошибку шины: 10. Разобравшись, что произошло, я решил попробовать образ пурпурного докера, и он, похоже, работал нормально. Просто помните, что по умолчанию у вас есть 2 ГБ оперативной памяти, доступной в докере (Mac OS), поэтому процесс может быть остановлен, если он превысит использование оперативной памяти. Вы можете изменить его в настройках докера. Кроме того, если вы выбрали файл MP3 вместо WAV в качестве источника, вы можете увидеть что-то вроде NoBackendError. Чтобы исправить это , просто установите библиотеку FFmpeg.

Но послушайте, если образ докера работает, почему бы не использовать его локально? Я проверил версии python, magenta и tensorflow, установленные в контейнере докера, и сравнил их с моей локальной средой. Похоже, что новейшая tenorflow ver 1.12.0, которая выбирается автоматически (через pip install tensorflow), не работает с пурпурной версией, которую я использовал (0.3.14) . В образе Docker используется tensorflow ver 1.10.0, поэтому после перехода на более раннюю локальную версию все стало работать, как задумано.

@Edit: на момент публикации этой статьи кажется, что она была исправлена ​​:)

Поэтому после установки пурпурного цвета и всех его зависимостей просто введите в терминал следующие команды:

источник активировать пурпурный

а потом

onsets_frames_transcription_transcribe --oustic_run_dir = "путь к контрольным точкам" "путь к файлу wav / mp3"

Только не забудьте скачать последние контрольные точки отсюда.

Вы, вероятно, увидите пару предупреждений, но ничего страшного. Первые два предупреждения говорят о том, что одна из функций, которые использует пурпурный, помечена как устаревшая, поэтому они, вероятно, исправят ее в будущих обновлениях. Последний говорит вам, что ваш процессор может использовать расширения набора команд архитектуры x86. В моем случае это AVX (расширенные векторные расширения), которые ускоряют операции линейной алгебры, а именно скалярное произведение, умножение матриц и т. Д. Распределение тензорного потока по умолчанию строится без этих расширений. Вы можете проверить эту статью, если хотите построить тензорный поток из исходников. Это может значительно ускорить весь процесс обучения или вывода. Также вы можете использовать дистрибутив GPU (tensorflow-gpu и magenta-gpu). К сожалению, у меня нет графического процессора CUDA, поэтому я не тестировал его.

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

В сеансе инициализации вам необходимо передать путь к контрольной точке (с полным именем) и гиперпараметры.
Для расшифровки аудио (строка 13) требуется объект сеанса, путь к файлу, который будет записан, начало и порог кадра . Последние два параметра сильно влияют на количество нот на выходе. Чем больше порог, тем более строгим будет процесс сопоставления. Вы можете выбрать значение от 0 до 1. Значение по умолчанию для них обоих - 0,5.

Версия JS

Проверить версию JS можно на глюке. Также есть код, который можно получить и просто запустить локально. Он работает медленнее, чем версия на Python, но также дал мне несколько другие результаты. Я провел небольшое исследование, и похоже, что контрольная точка для модели Python была обучена только с помощью набора данных MAPS (~ 18 часов записи), в отличие от контрольной точки модели JS, которая была обучена с помощью Набор данных MAESTRO (~ 172 часа записи). Это сообщение в блоге показывает, как F1 оценка отличается в обоих случаях.

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

В записанном мной довольно коротком фрагменте (5 секунд) исходный файл midi содержит 44 ноты, а файл, созданный нейронной сетью (начало и порог кадров установлен на 0,7), содержит 49 нот. Открыв их оба в онлайн-секвенсоре, мы можем ясно увидеть некоторые сходства и различия. Оба трека выполнены в гамме соль мажор, и мелодия очень похожа, но мы ясно видим некоторые ложные срабатывания.

Вы также можете проверить различия между исходным кодом и транскрипцией python / js в этом видео.

На мой взгляд, версия js звучит немного лучше (версия python имеет несколько дополнительных ложных срабатываний в средней / конечной части), но это может быть лишь вопросом времени, поскольку для версии python существует открытая проблема, заключающаяся в создании новая контрольная точка на основе набора данных MAESTRO.

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

Не стесняйтесь делиться своими мыслями и комментариями по этому поводу!