Files
wiki/tasks/karaoke/PROJECT.md
2026-04-30 00:40:01 +03:00

5.0 KiB
Raw Permalink Blame History

ТЗ: Караоке-генератор — MVP (v0.1)

Цель

Реализовать CLI-инструмент, который принимает аудиофайл песни и генерирует видео-файл с синхронизированным текстом (стиль "субтитры/караоке").


Стек

  • Python 3.10+
  • Whisper (openai-whisper или faster-whisper) — транскрипция + тайминги
  • FFmpeg — рендер финального видео
  • MoviePy или ffmpeg-python — наложение текста на видео
  • Pillow — рендер текстовых кадров (если MoviePy не справляется)
  • Pexels API — поиск стоковых видео-фонов
  • GigaChat API (через прокси 185.130.212.192:8443) — NLP-анализ смысла текста

Функционал MVP (v0.1)

Вход

python karaoke.py --audio song.mp3 [--text lyrics.txt] [--output output.mp4]
  • --audio — обязательный аргумент, путь к аудиофайлу (mp3, wav, ogg, m4a)
  • --text — опционально, путь к файлу с текстом (txt, lrc, srt)
  • --output — опционально, путь к выходному файлу (по умолчанию output.mp4)

Шаг 1: Транскрипция

  • Если --text не передан → запустить Whisper на аудио
  • Whisper возвращает сегменты с таймингами [{start, end, text}]
  • Если --text передан:
    • .lrc / .srt → парсить тайминги напрямую
    • .txt → выровнять текст по аудио через Whisper (forced alignment)

Шаг 2: NLP-анализ (для фона)

  • Отправить полный текст в GigaChat
  • Промпт: "Определи настроение и 3-5 ключевых визуальных сцен для этой песни. Ответь JSON: {mood: str, scenes: [str]}"
  • Пример ответа: {"mood": "romantic", "scenes": ["sunset beach", "city lights", "rain"]}

Шаг 3: Подбор видео-фона

  • Взять первую сцену из scenes
  • Запрос к Pexels API: GET /videos/search?query={scene}&per_page=3
  • Скачать первый подходящий клип (HD, landscape)
  • Зациклить клип до длины аудио (loop)
  • Если Pexels не вернул результат → использовать чёрный фон

Шаг 4: Рендер видео

  • Разрешение: 1280x720
  • Фреймрейт: 30fps
  • Фон: видео-клип (зациклен)
  • Текст: текущая строка по центру внизу экрана
    • Шрифт: белый, размер 48px, с чёрной тенью
    • Подсветка активной строки: жёлтый цвет
    • Fade-in/out: 0.3 сек
  • Аудио: оригинальный файл встроен в видео
  • Формат выхода: mp4 (H.264 + AAC)

Структура проекта

tasks/karaoke/
├── PROJECT.md
├── karaoke.py          # точка входа
├── transcribe.py       # Whisper транскрипция
├── nlp.py              # GigaChat NLP-анализ
├── video_bg.py         # Pexels API + скачивание фона
├── render.py           # FFmpeg/MoviePy рендер
├── requirements.txt
└── README.md

Конфигурация / секреты

Читать из переменных окружения (или из ~/.openclaw/.env):

  • PEXELS_API_KEY — ключ Pexels API (нужно получить на pexels.com/api)
  • GIGACHAT_BASE_URLhttps://185.130.212.192:8443 (прокси)
  • OPENAI_API_KEY — если используется OpenAI Whisper API (опционально, можно local)

Ограничения MVP

  • Только один видео-фон на всю песню (не меняется по сценам)
  • Нет UI — только CLI
  • Нет предпросмотра
  • Рендер может занять 1-5 мин для песни 3-5 мин

Критерии готовности

  • python karaoke.py --audio test.mp3 → генерирует output.mp4
  • Текст синхронизирован с аудио (±0.5 сек)
  • Видео-фон подобран автоматически (или чёрный если API недоступен)
  • Файл воспроизводится в VLC/браузере без ошибок
  • requirements.txt заполнен, README.md с инструкцией запуска

Что НЕ нужно в MVP

  • UI/веб-интерфейс
  • Смена фона по сценам
  • Дуэт (два текста)
  • Экспорт SRT/LRC
  • Ручная коррекция таймингов

Создано: 2026-04-29 | Проект: proj_karaoke