# Караоке-генератор 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
