Создание процедурной музыки - часть 2: Стоя на плечах гигантов
Прежде чем углубляться в детали реализации, я думаю, будет полезно обобщить мой технический стек. За последние несколько лет я несколько раз переписывал многие компоненты, используя разные языки и фреймворки. Поскольку этот проект продолжается, я уверен, что эта тенденция сохранится, поэтому имейте в виду, что это всего лишь снимок времени.
На расстоянии около 10 000 футов это распределенная облачная система, которая в настоящее время размещена в общедоступном облаке.
Постоянное хранилище данных:
Я использую MySQL в качестве дискового хранилища для всех данных, включая аналитику. Большая часть данных нормализована, за некоторыми исключениями, когда я рассматриваю таблицы как No-SQL (ключ к Json). MySQL проста в использовании, бесплатна и проверена в боевых условиях.
Хранилище данных в памяти:
Следующая часть совершенно необходима для системы. Это сетка данных в памяти. Есть несколько вариантов, но я считаю, что Hazelcast (https://hazelcast.com/) очень прост в использовании и хранит объекты Java, поэтому я решил работать с ним. Сетка данных нагревается через регулярные промежутки времени, при этом почти вся база данных является объектами POJO. Надеюсь, вы заметите, что система чрезвычайно тяжело читается. Я никак не мог позволить себе аппаратное обеспечение, необходимое для поддержки такого количества операций чтения из SQL, да и смысла в этом не было.
Ядро приложения:
Далее идет то, что я называю ядром приложения. Это Java-приложение Spring Boot (https://projects.spring.io/spring-boot/), которое в основном отвечает за всю сантехнику, такую как сборка слоев аудио, обработка эффектов, нормализация, генерация и рендеринг миди, передача аудио в сеть доставки контента. Он также используется для извлечения функций и передачи их работникам машинного обучения.
Работники машинного обучения:
Работники машинного обучения — вот где происходит волшебство. Они получают извлеченные функции данных из ядра приложения и решают, будут ли потенциальные варианты звучать хорошо или нет. Когда я начал проект, я начал с изучения языка R и попытался написать воркеров на R. Сначала его было легко использовать, но в итоге он оказался ужасным в качестве параллельного веб-сервиса. После прерывания миссии с R я начал использовать Python, который работал хорошо, а также является стандартом в науке о данных. Однако доступ к данным уже был написан на Java, и я был разочарован количеством времени, которое я тратил впустую на перенос моделей данных и модулей доступа к данным из существующего приложения Spring Java. Это разочарование привело меня к тому, что я начал играть с фреймворком DeepLeaning4J (https://deeplearning4j.org/). После тестирования демо-приложений DL4J и понимания того, что им достаточно легко пользоваться, я решил его использовать. Итак, в настоящее время рабочие ML по сути являются оболочкой веб-API Spring Boot вокруг DL4J. Рабочие процессы машинного обучения спроектированы так, чтобы их можно было масштабировать по горизонтали. Обычно у меня одновременно работает около 4 экземпляров.
Сеть доставки контента:
Я бы предположил, что подойдет любая CDN (сеть доставки контента), но в настоящее время я использую Amazon S3 просто из-за знакомства.
Интерфейс обучения:
Это Spring Boot/Angular GUI для аналитики/обучения модели.
Сайт конечного пользователя:
Общедоступный веб-сайт Nodejs/Angular, используемый для передачи звука из S3 пользователям.
Это список важных библиотек, фреймворков и технологий:
FFMPEG:
Используется для многих вещей: кодирования, нормализации, слияния аудио и некоторых эффектов.
TarsosDSP:
https://github.com/JorenSix/TarsosDSP
Это библиотека обработки сигналов, которую я использую для извлечения эквалайзеров, высоты тона и ритмических шаблонов. Есть несколько различных вариантов библиотек цифровых сигналов, но мы выбрали этот, потому что он был на языке Java и легко интегрировался.
JFugue:
Эта библиотека сэкономила мне огромное количество работы. Мне, как человеку с формальным музыкальным образованием, лучше всего подходит традиционная западная гармония. JFugue позволяет мне взаимодействовать с миди с помощью западных нот и названий аккордов, таких как «Cmaj7». JFugue используется для создания миди-файлов из шаблонов нот, выбранных работниками машинного обучения.
Миссис Ватсон:
https://github.com/teragonaudio/MrsWatson
Это VST-хост командной строки, который можно использовать для двух целей.
1) преобразовать миди-файлы в аудио с помощью синтезаторов с открытым исходным кодом.
2) добавить эффекты к аудио.
Пожалуйста, прослушайте последние выходные данные моей системы здесь:
Спасибо!