# ТЗ: Караоке-генератор — 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_URL` — `https://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_