Привет! Меня зовут Дмитрий Сергеев, я облачный администратор в Битрикс24.

Рассказываю о создании проекта для Хакатона в нашей компании: музыкального ИИ‑приложения PromptBeats.

Установить проект можно с репозитория: github.com/dimyard/PromptBeats. Для работы ИИ‑функций нужно подключить API‑ключ языковой модели. PromptBeats поддерживает OpenAI, Anthropic и Gemini, а провайдер и ключ указываются в файле .env. 

Без подключения модели можно дать агенту доступ к проекту и генерировать треки в JSON, которые можно загружать, воспроизводить, сохранять в библиотеке и редактировать.

В проекте, кроме меня, участвовали двое моих коллег: Максим Тишковский и Дмитрий Баранов.

Содержание

  • Как выглядит PromptBeats

  • Как родилась идея PromptBeats

  • Проект помогает развить мелодию, которая играет в голове

  • Промпты к музыке

  • Как проектировали архитектуру

  • Что такое Song JSON

  • Как работает ИИ‑часть и сколько стоила генерация

  • Что осталось за пределами MVP и что в потенциальных планах на будущее

Как выглядит PromptBeats

Слева находится часть для работы с моделью: чат и его история. 

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

Есть библиотека треков, которые мы сгенерировали во время тестирования. Чтобы открыть её, нужно нажать на иконку с нотой:

Откроется библиотека:

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

Набор инструментов и звуков пока довольно базовый:

У проекта есть метаданные: тональность, темп, количество тактов и дорожек. Справа можно посмотреть Song JSON текущей композиции — подробнее о его устройстве расскажу ниже.

Как родилась идея PromptBeats

Я немного занимаюсь музыкой, играю в группе. При записи репетиции столкнулся со сложностями и задумался, можно ли сделать свой инструмент.

Понятно, что создать собственную DAW (программу для создания и записи музыки) с нуля — слишком амбициозная задача для хакатона. Поэтому начали сужать идею до того, что реально можно сделать за один день. В основе получался своего рода лупер. Вспомнился FL Studio, в котором я когда‑то делал демки:

Источник: image‑line.com

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

Проект помогает развить мелодию, которая играет в голове

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

Если у человека уже есть собственная идея, можно, как в FL Studio, самостоятельно выбрать инструменты, расставить свою мелодию, а затем использовать промпты для ее развития.

Это был один из основных посылов проекта. Иногда у тебя в голове звучит мелодия, хочется её дописать, но не хватает фантазии, чтобы продолжить или как‑то развить. PromptBeats должен помогать именно в такой ситуации. 

Промпты к музыке

Cпециальные музыкальные промпты писать не нужно. Желательно базово понимать, что такое темп и бит, различать основные инструменты — например, барабаны и бас.

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

Как проектировали архитектуру

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

Но конкретная реализация определялась уже во время разработки: выбор стека, библиотеки для генерации звука, способ работы с моделью.

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

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

Приложение изначально проектировали браузерным, чтобы оно не зависело от конкретной платформы. Для плеера выбрали Tone.js: в нем уже есть базовые инструменты и возможность добавлять собственные. Сам проект в основном написан на JavaScript.

Мы втроем параллельно работали над разными частями проекта, поэтому в первый час согласовали контракты между ними. Центральным стал Song JSON: фронтенд, бэкенд и плеер должны были одинаково понимать структуру композиции.

Что такое Song JSON

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

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

Например, так будет выглядеть начало «К Элизе» Бетховена:

{
  "version": 1,
  "title": "Für Elise — opening",
  "bpm": 80,
  "key": "A minor",
  "bars": 2,
  "tracks": [
    {
      "id": "piano",
      "role": "lead",
      "instrument": "synth",
      "sound": "sampled_piano",
      "gain": 0.8,
      "events": [
        { "step": 0, "note": "E5", "dur": 2, "vel": 0.8 },
        { "step": 2, "note": "D#5", "dur": 2, "vel": 0.7 },
        { "step": 4, "note": "E5", "dur": 2, "vel": 0.8 },
        { "step": 6, "note": "D#5", "dur": 2, "vel": 0.7 },
        { "step": 8, "note": "E5", "dur": 2, "vel": 0.8 },
        { "step": 10, "note": "B4", "dur": 2, "vel": 0.75 },
        { "step": 12, "note": "D5", "dur": 2, "vel": 0.78 },
        { "step": 14, "note": "C5", "dur": 2, "vel": 0.75 },
        { "step": 16, "note": "A4", "dur": 4, "vel": 0.82 }
      ]
    }
  ]
}

Идея такая: модели передаётся промпт пользователя и контракт Song JSON. Модель по этому контракту генерирует сам трек.

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

Таким образом треки можно генерировать вне PromptBeats. Song JSON можно создать и вне интерфейса нашего приложения. Например, агент с доступом к репозиторию может прочитать лежащие там контракты, сгенерировать совместимый JSON, а готовый файл затем можно импортировать.

Как работает ИИ‑часть и сколько стоила генерация

Здесь всё достаточно просто. На бэкенде есть LLM‑шлюз с ограничением частоты и повторных попыток. В.env‑файле задаём API‑ключ. Для тестирования мы купили ключ OpenAI на пять долларов. Его хватило на весь день генерации, и даже немного осталось.

Изначально мы опасались, что генерация будет расходовать очень много токенов и на входе, и на выходе. Но оказалось, что формат Song JSON позволяет делать это довольно экономично. При генерации более объёмных композиций столкнулись с ограничением длины ответа модели, и увеличили лимит.

Что осталось за пределами MVP и что в потенциальных планах на будущее

Мы хотели добавить запись и отдельные аудиодорожки. Например, у пользователя уже есть записанная основа в WAV, а приложение добавляет к ней инструменты.

Другая идея — интеграция с VST‑плагинами, но это уже очень амбициозная задача и постепенно превращает проект в полноценную DAW. Для браузера это тоже достаточно сложно, поэтому в условиях хакатона от идеи отказались.

Ещё хотели сделать piano roll, чтобы выбирать ноты на виртуальной клавиатуре вместо селектора.

И хотелось расширить эффекты. Сейчас возможности этой части ограничены, а в задумке были reverb, delay, фильтры и другие эффекты.

Комментарии (0)