Визуализация сгенерированной песни на коленке

Визуализация сгенерированной песни на коленке

Главный ответ

Если у агента уже есть MP3 от Trekopes/Suno/другого генератора, самый быстрый способ сделать визуализацию — собрать MP4 через ffmpeg: waveform, спектрограмма или обложка + аудиореактивная полоса.

Минимальный happy path:

ffmpeg -i song.mp3 \
  -filter_complex "[0:a]showspectrum=s=1280x720:mode=combined:color=intensity:scale=log,format=yuv420p[v]" \
  -map "[v]" -map 0:a \
  -c:v libx264 -c:a aac -shortest visualizer.mp4

Результат: visualizer.mp4 — видео со звуком и движущейся спектрограммой, которое можно отправить в Telegram, вставить в лендинг или использовать как preview для песни.

Используйте эту страницу, если

  • у вас есть song.mp3 и нужно быстро сделать видео;
  • нужна демка для Telegram/соцсетей без полноценного motion design;
  • нужно дать другому агенту простой рецепт: «взял MP3 → отдал MP4»;
  • хочется сделать несколько уровней качества: от одной команды до кастомного cyber/ASCII-визуализатора.

Что получится

Можно получить один из четырёх форматов:

  1. Waveform-видео — бегущая аудиоволна.
  2. Spectrum-видео — частотная спектрограмма, выглядит музыкальнее.
  3. Cover visualizer — обложка/фон + аудиореактивная полоса.
  4. Custom visualizer — Python/ASCII/киберпанк/частицы под бас, если нужен вау-эффект.

Предусловия

Минимально нужен:

ffmpeg -version

Если ffmpeg не установлен:

# Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y ffmpeg

# macOS
brew install ffmpeg

Входной файл в примерах:

song.mp3

Выходной файл:

visualizer.mp4

Быстрый старт: спектрограмма за одну команду

ffmpeg -i song.mp3 \
  -filter_complex "[0:a]showspectrum=s=1280x720:mode=combined:color=intensity:scale=log,format=yuv420p[v]" \
  -map "[v]" -map 0:a \
  -c:v libx264 -c:a aac -shortest visualizer.mp4

Проверьте:

ffprobe -hide_banner visualizer.mp4

Ожидаемый результат:

  • есть video stream h264;
  • есть audio stream aac;
  • длительность примерно совпадает с исходным MP3;
  • файл открывается в плеере и отправляется в Telegram как видео.

Recipe 1: простая waveform-линия

Используйте, если нужно максимально быстро и читаемо.

ffmpeg -i song.mp3 \
  -filter_complex "[0:a]showwaves=s=1280x720:mode=line:colors=00ffcc,format=yuv420p[v]" \
  -map "[v]" -map 0:a \
  -c:v libx264 -c:a aac -shortest waveform.mp4

Что это даёт:

  • минималистичная волна;
  • маленький риск артефактов;
  • хорошо подходит для черновика или быстрой отправки в чат.

Recipe 2: частотная спектрограмма

Используйте как default для «песня → визуализация».

ffmpeg -i song.mp3 \
  -filter_complex "[0:a]showspectrum=s=1280x720:mode=combined:color=intensity:scale=log,format=yuv420p[v]" \
  -map "[v]" -map 0:a \
  -c:v libx264 -c:a aac -shortest spectrum.mp4

Что это даёт:

  • движение частот по времени;
  • цветовую динамику;
  • более «музыкальный» вид, чем обычная волна.

Recipe 3: обложка + waveform снизу

Используйте, если есть cover.jpg или сгенерированная картинка для песни.

ffmpeg -loop 1 -i cover.jpg -i song.mp3 \
  -filter_complex "[0:v]scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720,format=rgba[bg];[1:a]showwaves=s=1280x160:mode=line:colors=00ffff,format=rgba[wave];[bg][wave]overlay=0:560,format=yuv420p[v]" \
  -map "[v]" -map 1:a \
  -c:v libx264 -c:a aac -shortest cover_visualizer.mp4

Ожидаемый результат:

  • на фоне статичная обложка;
  • снизу двигается waveform;
  • звук сохранён;
  • выглядит лучше для публикации, чем голая спектрограмма.

Recipe 4: вертикальный формат для Shorts/Reels/TikTok

ffmpeg -i song.mp3 \
  -filter_complex "[0:a]showspectrum=s=1080x1920:mode=combined:color=intensity:scale=log,format=yuv420p[v]" \
  -map "[v]" -map 0:a \
  -c:v libx264 -c:a aac -shortest spectrum_vertical.mp4

Используйте, если результат пойдёт в мобильную ленту.

Recipe 5: 30-секундный teaser

Чтобы не рендерить всю песню, можно взять первые 30 секунд:

ffmpeg -t 30 -i song.mp3 \
  -filter_complex "[0:a]showspectrum=s=1280x720:mode=combined:color=intensity:scale=log,format=yuv420p[v]" \
  -map "[v]" -map 0:a \
  -c:v libx264 -c:a aac -shortest teaser_30s.mp4

Или взять кусок с 45-й секунды:

ffmpeg -ss 45 -t 30 -i song.mp3 \
  -filter_complex "[0:a]showspectrum=s=1280x720:mode=combined:color=intensity:scale=log,format=yuv420p[v]" \
  -map "[v]" -map 0:a \
  -c:v libx264 -c:a aac -shortest teaser_45_30s.mp4

Recipe 6: статичная картинка-спектрограмма

Если нужно не видео, а картинка для отчёта/обложки:

ffmpeg -i song.mp3 \
  -lavfi "showspectrumpic=s=1920x1080:legend=disabled:scale=log" \
  spectrogram.png

Ожидаемый результат:

  • spectrogram.png — статичная визуальная подпись песни;
  • удобно вставлять в отчёт, Trip2G-заметку или Telegram-пост.

Более красивый путь: Python-визуализатор

Когда одной команды мало, следующий уровень — небольшой Python-скрипт:

  • ffmpeg декодирует аудио;
  • Python считает громкость/частоты по кадрам;
  • Pillow/numpy рисуют фон, частицы, waveform, текст;
  • ffmpeg собирает MP4 и добавляет исходный звук.

Идеи сцен:

  • synthwave: сетка, неон, солнце, waveform снизу;
  • terminal/ASCII: символы, glitch, бегущие строки, пульс под бас;
  • Agent Garden: ростки/узлы/линии как сеть агентов, реагирующая на музыку;
  • Trekopes mode: мемный техно-пёс, косточки/лапы/волны, glitch-лай.

Простой контракт для агента:

Input:
- song.mp3
- optional cover.jpg
- title
- style: synthwave / ascii / cyberpunk / minimal

Output:
- visualizer.mp4
- preview.png

Быстрый ASCII/cyberpunk вариант

Для Telegram хорошо работает короткий 30–60 секундный ASCII-визуализатор:

  • чёрный или тёмный фон;
  • символы ░▒▓█, 01, <>, //, *, #;
  • пульсация размера/яркости от громкости;
  • waveform или спектр снизу;
  • название трека крупно в начале;
  • glitch-переход на припеве.

Это уже не одна команда, но всё ещё «на коленке»: один Python-файл + ffmpeg.

Reference: полезные ffmpeg-фильтры

  • showwaves

    • Purpose: waveform по аудио.
    • Good for: минималистичные визуализации.
    • Example: showwaves=s=1280x720:mode=line:colors=00ffcc.
  • showspectrum

    • Purpose: движущаяся частотная спектрограмма.
    • Good for: музыкальный visualizer по умолчанию.
    • Example: showspectrum=s=1280x720:mode=combined:color=intensity:scale=log.
  • showspectrumpic

    • Purpose: статичная картинка спектра.
    • Good for: отчёты, обложки, Trip2G-заметки.
    • Example: showspectrumpic=s=1920x1080:legend=disabled:scale=log.
  • overlay

    • Purpose: наложить waveform на обложку/фон.
    • Good for: cover visualizer.
    • Example: [bg][wave]overlay=0:560.
  • scale, crop

    • Purpose: привести картинку к 16:9 или 9:16.
    • Good for: обложка любого размера.

Troubleshooting

Видео есть, но Telegram плохо воспроизводит

Добавьте совместимый pixel format:

format=yuv420p

И кодек:

-c:v libx264 -c:a aac

Файл слишком большой

Добавьте CRF:

-crf 23 -preset veryfast

Пример:

ffmpeg -i song.mp3 \
  -filter_complex "[0:a]showspectrum=s=1280x720:mode=combined:color=intensity:scale=log,format=yuv420p[v]" \
  -map "[v]" -map 0:a \
  -c:v libx264 -crf 23 -preset veryfast -c:a aac -shortest visualizer.mp4

Нужно быстрее

Сделайте teaser:

-t 30

или уменьшите размер:

s=854x480

Обложка растянулась

Используйте связку:

scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720

Нужно не видео, а файл-картинка

Используйте showspectrumpic, не showspectrum.

Рекомендованный default для агентов

Если пользователь просто просит «сделай визуализацию для песни», выбирайте так:

  1. Если есть cover.jpg: сделать cover_visualizer.mp4 — обложка + waveform снизу.
  2. Если обложки нет: сделать spectrum.mp4 через showspectrum.
  3. Если нужен Telegram teaser: ограничить до 30–60 секунд.
  4. Если нужен вау-эффект: предложить/сделать Python ASCII/cyberpunk visualizer.

Минимальный ответ пользователю после выполнения:

Готово: сделал MP4-визуализацию с аудио. Проверил ffprobe, видео и аудио потоки есть.