Продолжаю рассказывать, как я в одного делаю проект - сайт, радио и медиаплатформу для своей музыки. В первой части был фронт и админка, теперь - как я встроил мастеринг аудио через Python сервис, чтобы не бегать по разным сайтам и не возиться с Audacity. Ну и немного про вайбкодинг - куда ж без него.

? Вступление
Продолжаю рассказывать, как можно в одного делать большие проекты с помощью новомодного явления - вайбкодинг.
На днях видел даже курсы от инфобизнесменов, где теперь учат, как молодым предпринимателям можно "сэкономить" на разработчиках, дизайнерах и прочих специалистах. Разумеется, всего за стоимость этих самых специалистов ?
Но давайте честно - вайбкодинг это не замена, это инструмент. Если ты хоть немного разбираешься в теме, он сэкономит массу времени и денег. Если нет - затраты будут только расти, вместе с количеством подписок на разные ИИ-сервисы.
? Три вещи, которые стоит знать про вайбкодинг
1. Сервисы платные, и чем дальше, тем дороже
Пока проект маленький - всё прекрасно. Но как только он растёт, ИИ начинает путать, что ты вообще хочешь от него. А ты, вдохновлённый первыми успехами, закупаешь всё подряд: Midjourney для картинок, ChatGPT для кода, Claude для текста, Suno для музыки… И в какой-то момент сумма подписок догоняет зарплату разработчика.
2. Промт - это новое ТЗ
Поначалу всё просто: "Сделай красивый сайт про йогу". ИИ делает, ты радуешься. Но потом: "Добавь базу данных, сделай авторизацию, API и расчёт аналитики". ИИ всё делает, но ты уже не понимаешь, что именно. Код работает, но странно. Через пару недель начинаешь чинить сам. Так появляется новая профессия - вайбклинер ?
3. Это не магия, это инструмент
Если понимать, что происходит, эффект - потрясающий. Например, раньше на подготовку описания API для среднего интерфейса из n-методов у меня уходил день. Теперь - минут 30, и это только на проверку, что всё корректно. Так что вайбкодинг - ускоритель, а не волшебная палочка.
Переходим к делу: обработка музыки
А теперь вернёмся к сайту. В этой части расскажу про мастеринг, который я реализовываю через Python-сервис и связал с админкой. Задача - убрать ручной труд при обработке треков.
? Python-сервис для аудио
Изначально всё выглядело вот так:
загрузил файл в мастерскую → обработал→ скачал→ проверил → если что-то не понравилось → снова загрузил . Работает, но очень утомительно.

Потом я решил объединить весь процесс в одно целое: фронт → бэк → Python → облако.
Теперь при загрузке песни сайт сам:
Прослушать как будет выглядеть трек после обработки
Далее отправить аудио в Python-сервис.
Тот применяет выбранный пресет (мастеринг, шумоподавление, тюнинг).
И скачивается mp3(уже с тегами) или wav
Так же отдельно можно сохранить обработанный файл на S3.
Использую:
Railway - для бекенда.
S3 от REG.RU - для хранения.
librosa, scipy, soundfile - для аудио.
⚙️ Вот как выглядит базовая функция мастеринга, максимально просто
def _apply_mastering(input_path: str, output_path: str, preset: dict, ms: bool, clean: bool):
"""
Применяет мастеринг к аудиофайлу согласно пресету
"""
audio_data, sample_rate = sf.read(input_path)
if audio_data.shape[0] < 15:
print("WARNING: Audio file is very short (<15 samples)")
preset_value = preset.get('value', {})
has_effects = any([
preset_value.get('eq'),
preset_value.get('compressor'),
preset_value.get('limiter'),
preset_value.get('normalize_lufs'),
preset_value.get('stereo_width'),
preset_value.get('saturation'),
preset_value.get('extras')
])
audio_data = _apply_dynamic_effects(audio_data, sample_rate, preset_value)
if clean and preset.get('clean'):
audio_data = _apply_dynamic_cleanup(audio_data, sample_rate, preset['clean'])
if ms and len(audio_data.shape) == 2 and audio_data.shape[1] == 2:
audio_data = _apply_mid_side_processing(audio_data)
sf.write(output_path, audio_data, sample_rate, format='WAV')
print("Mastering completed successfully")
Пресеты, превью и немного лени
Раньше я вручную выбирал пресет, прогонял трек, скачивал результат, слушал, потом снова всё по кругу. И тут сработал вечный двигатель прогресса - лень.
Теперь при загрузке песни можно сразу:
Применить все доступные пресеты.
Прослушать результат.
Сохранить понравившийся вариант.
То есть всё - прямо в браузере.
Пресеты теперь хранятся в базе данных, в виде JSON.
Это удобно, потому что у каждого набора настроек своя структура.
Так он выглядел, когда жил на стороне сервиса
{
"name": "Стадион",
"eq": {"low": -3, "mid": 0, "high": 4},
"compressor": {"ratio": 3.5, "threshold": -20},
"stereo_width": 1.2,
"normalize_lufs": -14,
"extras": ["saturation", "air"]
}
Вот так он теперь выглядит на стороне БД
id |name|value |status|clean |clean_filter|
------------------------------------+----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-------------------------------------------------------------------------------------------------------------------------+------------+
1fd1c1ef-2211-1111-b1a1-1cc1e55a2073|soft|{"eq": {"low": 1, "mid": 0.5, "high": 1.5, "low_freq": 80, "mid_freq": 1200, "q_factor": 1.2, "high_freq": 9000}, "extras": {"depth": 0.3, "reverb": "room", "presence": 0.6}, "limiter": {"release": 100, "threshold": -1.0}, "compressor": {"ratio": 2.0, "at|active|{"filter": {"type": "lowpass", "cutoff_hz": 19500}, "remove_hiss": true, "remove_clicks": true, "remove_dc_offset": true}|true |
Интерфейс и визуализация
Чтобы не гадать, чем один пресет отличается от другого, я добавил визуализацию эквалайзера.
Двигать ползунки пока нельзя, но в планах:
редактирование кастомных пресетов;
визуальный редактор эквалайзера;
и, возможно, автоматическая рекомендация под жанр трека.
Админка постепенно превращается в медиа-комбайн, где можно:
добавить трек,
настроить обработку,
сделать превью,
опубликовать в соцсетях - всё из одного места.
Что дальше
Про радио я расскажу в следующей статье - там своя интересная история.
А пока планирую:
Добавить анализ звучания трека (чтобы в эквалайзер выводить как было и как стало).
Реализовать возможность делать кастомные пресеты.
Финал
Если интересно, сервис для теста пресетов я выложил отдельно - можно покликать и сказать/подсказать, что так или не так.
Для пресета "Стадион" есть возможность изменять Доп. эфекты. Надо кликнуть два раза на доп. эфекты и откроется модальное окно, с доступными эфектами.