109 lines
3.9 KiB
Markdown
109 lines
3.9 KiB
Markdown
# Караоке-генератор v0.1 (MVP) 🎤
|
||
|
||
CLI-инструмент, который принимает аудиофайл песни и генерирует видео с синхронизированным текстом (стиль "караоке/субтитры").
|
||
|
||
---
|
||
|
||
## Быстрый старт
|
||
|
||
```bash
|
||
# Установка зависимостей
|
||
pip install -r requirements.txt
|
||
|
||
# Генерация караоке из аудио
|
||
python karaoke.py --audio song.mp3
|
||
|
||
# С готовым текстом
|
||
python karaoke.py --audio song.mp3 --text lyrics.lrc
|
||
python karaoke.py --audio song.mp3 --text lyrics.txt
|
||
python karaoke.py --audio song.mp3 --text lyrics.srt
|
||
|
||
# С кастомным выходным файлом и моделью
|
||
python karaoke.py --audio song.mp3 --whisper-model small --output my_karaoke.mp4
|
||
```
|
||
|
||
---
|
||
|
||
## Зависимости
|
||
|
||
### Python (Python 3.10+)
|
||
|
||
| Пакет | Версия | Зачем |
|
||
|-------|--------|-------|
|
||
| `faster-whisper` | 1.2.1 | Транскрипция аудио с таймингами |
|
||
| `moviepy` | 2.1.2 | (опционально) видео-рендер |
|
||
| `pillow` | 10.4.0 | Рендер текстовых кадров |
|
||
| `requests` | 2.33.1 | HTTP-запросы к API |
|
||
| `numpy` | 2.4.0 | Математика |
|
||
| `python-dotenv` | 1.2.2 | Загрузка .env |
|
||
|
||
### Системные
|
||
|
||
- **FFmpeg** — должен быть в PATH или указан через `FFMPEG_BIN`/`FFPROBE_BIN`
|
||
- В проекте используется статик из `~/bin/ffmpeg-7.0.2-amd64-static/`
|
||
|
||
---
|
||
|
||
## Переменные окружения
|
||
|
||
| Переменная | Описание | По умолчанию |
|
||
|------------|----------|--------------|
|
||
| `PEXELS_API_KEY` | Ключ Pexels API для поиска видео-фонов | — (будет чёрный фон) |
|
||
| `GIGACHAT_CREDS` | OAuth креды GigaChat (Base64) | из `~/.openclaw/.env` |
|
||
| `GIGACHAT_BASE_URL` | URL GigaChat API | из `~/.openclaw/.env` |
|
||
| `FFMPEG_BIN` | Путь к ffmpeg | `~/bin/ffmpeg-7.0.2-amd64-static/ffmpeg` |
|
||
| `FFPROBE_BIN` | Путь к ffprobe | `~/bin/ffmpeg-7.0.2-amd64-static/ffprobe` |
|
||
|
||
---
|
||
|
||
## Структура проекта
|
||
|
||
```
|
||
tasks/karaoke/
|
||
├── karaoke.py # CLI точка входа, argparse
|
||
├── transcribe.py # Whisper транскрипция + LRC/SRT парсер
|
||
├── nlp.py # GigaChat NLP → {mood, scenes}
|
||
├── video_bg.py # Pexels API + чёрный фон fallback
|
||
├── render.py # FFmpeg/MoviePy рендер
|
||
├── requirements.txt # pinned зависимости
|
||
├── README.md # этот файл
|
||
└── PROJECT.md # полное ТЗ
|
||
```
|
||
|
||
---
|
||
|
||
## Как это работает
|
||
|
||
1. **Транскрипция** — Whisper извлекает текст + тайминги из аудио
|
||
2. **NLP** — GigaChat анализирует настроение и сцены (fallback без API)
|
||
3. **Видео-фон** — Pexels API ищет видео; если нет — чёрный фон
|
||
4. **Рендер** — FFmpeg накладывает текст на видео с fade-in/out
|
||
|
||
---
|
||
|
||
## CLI аргументы
|
||
|
||
```
|
||
--audio AUDIO Путь к аудиофайлу (обязательный)
|
||
--text TEXT Путь к файлу с текстом (.lrc/.srt/.txt)
|
||
--output OUTPUT Выходной файл (по умолчанию: output.mp4)
|
||
--whisper-model SIZE tiny/base/small/medium/large (по умолч.: base)
|
||
--device DEVICE cpu/cuda (по умолч.: cpu)
|
||
--language LANG Код языка (ru/en/...) или авто (None)
|
||
```
|
||
|
||
---
|
||
|
||
## Выходной формат
|
||
|
||
- Видео: 1280x720, H.264, 30fps
|
||
- Аудио: оригинальное, AAC 192kbps
|
||
- Текст: белый, 48px, с чёрной тенью; активная строка жёлтая
|
||
- Fade-in/out: ~0.3 сек
|
||
|
||
---
|
||
|
||
## Лицензия
|
||
|
||
MIT / Internal Project
|