Files
remotion_service/docs/consults/video-features-roadmap_v2_ru.md
T
2026-03-22 22:42:35 +03:00

538 lines
37 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Дорожная карта видеофич — Техническая консультация v2 (API-First)
**Дата:** 22 марта 2026
**Консультанты:** ML/AI-инженер, Backend-архитектор, Remotion-инженер, Frontend-архитектор, DevOps-инженер, Инженер по производительности
**Ревизия:** v2 — переход на API-first архитектуру: Deepgram, GigaChat, DeepInfra
---
## Что изменилось по сравнению с v1
Одно принципиальное решение перевернуло всю архитектуру: вместо локальных ML-моделей — управляемые API-сервисы. PyTorch, GPU-инфраструктура, разделение ML-воркеров, большинство проблем с памятью и временем обработки — всё это просто исчезло.
### Замены API
| v1 (локальный ML) | v2 (API-First) | Эффект |
|---|---|---|
| Локальный Whisper (PyTorch, 20-60 мин на CPU) | **Deepgram Nova-3** API (~30 сек) | PyTorch больше не нужен вообще |
| Локальный pyannote.audio (PyTorch, 15-30 мин CPU) | **Deepgram** `diarize=true` (включено в вызов транскрипции) | pyannote + torchaudio — удалены |
| Gemini 2.5 Flash / GPT-4o-mini для вирусной детекции | **GigaChat Pro** (нативная русскоязычная LLM от Сбера) | Лучше понимает русский юмор, культурный контекст, сленг |
| librosa для анализа энергии аудио | **Deepgram** `sentiment=true` (посегментно) | Сентимент заменяет анализ энергии в большинстве сценариев |
| Нет | **DeepInfra** (Llama, Mistral, Qwen через API) | Фоллбэк / A/B-тестирование LLM-анализа |
### Как изменились ключевые метрики
Цифры говорят сами за себя:
| Метрика | v1 | v2 | Изменение |
|---|---|---|---|
| Размер Docker-образа | 1.72 ГБ | **~400-500 МБ** | -75% (нет PyTorch) |
| Пиковое потребление RAM воркера | 8-16 ГБ | **~400 МБ** (только MediaPipe) | -95% |
| Время обработки (30-мин видео, полный пайплайн) | 35-80 мин (CPU) | **5-10 мин** | -85% |
| Стоимость за видео | $0.11 | **$0.20** | +80% (стоимость API) |
| Месячная стоимость (100 видео) | $11 вычисления + сервер + $0-380 GPU | **$20 API + сервер** | Проще, дешевле при малых объёмах |
| Нужен GPU? | Фаза 2 для диаризации | **Никогда** | Полностью исключён |
| Новые Python-зависимости | ~310-340 МБ | **~40 МБ** (mediapipe + HTTP-клиенты) | -88% |
| Общий срок всех MVP | 26-34 dev-дня | **20-27 dev-дней** | -20-25% |
Образ в четыре раза легче. RAM в сорок раз меньше. Обработка в шесть-восемь раз быстрее. Цена за единицу чуть выше, но инфраструктурные расходы сжимаются до нуля. Неплохой обмен.
### Проблемы, которых больше нет
Эти сквозные проблемы из v1 перестали существовать:
| Проблема из v1 | Почему исчезла |
|---|---|
| ~~Переключить PyTorch на CPU-only индекс~~ | PyTorch удалён полностью (Whisper заменён Deepgram) |
| ~~OOM воркера на параллельных ML-джобах~~ | Нет тяжёлого ML — стандартный воркер на 4 ГБ |
| ~~Отдельный Docker-образ для ML-воркера~~ | Один лёгкий образ |
| ~~Планирование GPU-инфраструктуры~~ | Весь ML — через API |
| ~~Конфликты версий PyTorch~~ | Нет PyTorch |
| ~~Скачивание моделей при первом запуске~~ | Нет локальных моделей (кроме MediaPipe, ~2 МБ) |
| ~~Разделение ML через Docker Compose profiles~~ | Не нужно |
### Новые проблемы
Ничего бесплатного не бывает. Вот что появилось взамен:
| Проблема | Приоритет | Митигация |
|---|---|---|
| Управление API-ключами (Deepgram, GigaChat, DeepInfra) | Высокий | Хранить в settings через env-переменные, никогда в коде |
| Rate limit'ы API | Высокий | Retry с exponential backoff в акторах |
| Зависимость от вендора (vendor lock-in) | Средний | Абстрагировать за интерфейсами движков (как уже сделано: `engine: "whisper" \| "google"`) |
| Зависимость от сети (API упал = обработка встала) | Средний | Оставить Whisper как опциональный фоллбэк-движок |
| Более высокая стоимость за видео ($0.20 vs $0.11) | Низкий | Компенсируется нулевыми инфраструктурными расходами; прибыльно на любом SaaS-тарифе |
---
## Общая картина
| # | Фича | Сложность | MVP | Полная версия | Доп. инфраструктура |
|---|-------|-----------|-----|---------------|---------------------|
| 1 | Продвинутые шаблоны Remotion | Легко-средне | 3-4 дня | 3-4 дня | Ничего — можно начинать хоть сейчас |
| 2 | Детекция вирусных моментов | Средне | **3-5 дней** | 6-10 дней | API-ключи (GigaChat, Deepgram) |
| 3 | Авто-монтаж и трекинг лица | Сложно | **8-10 дней** | 20-30 дней | Только MediaPipe (CPU, ~30 МБ) |
| 4 | Конвертация в вертикальные Shorts (9:16) | Средне | 6-8 дней | +3-4 дня после #3 | Ничего |
| **Итого** | | | **20-27 дней** | **35-47 дней** | |
Реалистичный прогноз для одного разработчика: **5-7 недель** (все MVP) или **2-3 месяца** (полные версии).
---
## Фича 1: Продвинутые шаблоны Remotion
**Без изменений по сравнению с v1.** Эта фича не зависит от ML.
**Статус:** Спецификация и план реализации уже написаны. Бери и делай.
- Спецификация: `docs/superpowers/specs/2026-03-21-advanced-remotion-templates-design.md`
- План: `docs/superpowers/plans/2026-03-21-advanced-remotion-templates.md`
**Что делаем:** Расширяем `CaptionStyleSchema` четырьмя новыми стилями подсветки (pop_in, karaoke, bounce, glow_pulse), двумя переходами (zoom_in, drop_in), тремя полями (word_entrance, highlight_rotation_deg, text_transform). Два системных пресета: "Shorts" и "Podcast".
**Где трогаем код:** Расширение схемы в Remotion + бэкенде, логика рендеринга в `Captions.tsx`, Alembic-миграция для пресетов, контролы в StyleEditor на фронте.
---
## Фича 2: Детекция вирусных моментов
### Архитектура (v2 — API-First)
В v1 мы планировали гонять LLM по тексту и считать энергию аудио через librosa. В v2 подход элегантнее: один вызов Deepgram даёт транскрипцию, разметку спикеров и сентимент-анализ — три результата за одну цену. А текст анализирует GigaChat, которому русский язык родной.
**Транскрипция:** Deepgram Nova-3 API с `diarize=true` + `sentiment=true`. Один API-вызов возвращает пословные таймстемпы, метки спикеров и оценку сентимента по каждому высказыванию. Стоимость: $0.0053/мин ($0.16 за 30-минутное видео). Обработка: ~30 секунд.
**LLM-анализ:** GigaChat Pro (от Сбера) — нативная русскоязычная LLM, обученная на русском интернете. Лучше ловит русский юмор, культурные отсылки, сленг и вирусные паттерны, чем модели, для которых русский — второй язык. Фоллбэк: DeepInfra (Llama 3.1 70B или Qwen) для A/B-тестирования.
**Аудио-подкрепление:** Посегментные оценки сентимента от Deepgram заменяют анализ энергии через `librosa` в большинстве случаев. Высокий сентимент коррелирует с вирусными моментами. Опционально: librosa для анализа громкости (смех, повышенный голос) как дополнение.
**Пайплайн:**
1. Транскрипция Deepgram с `diarize=true` + `sentiment=true` -> таймстемпы + спикеры + сентимент
2. Конвертация ответа Deepgram в существующую схему `Document` (segments, lines, words)
3. GigaChat анализирует текст транскрипции + данные сентимента -> кандидаты в вирусные клипы
4. Постобработка: привязка границ к краям сегментов, вычисление композитных скоров
5. Сохранение клипов в таблицу `clips`
### Бэкенд
**Новый модуль:** `clips` (models, schemas, repository, service, router) — хранит найденные клипы со связями project/file/job.
**Модель клипа:**
```
Clip {
project_id: UUID (FK projects)
source_file_id: UUID (FK files)
job_id: UUID? (FK jobs)
title: str
start_ms: int
end_ms: int
score: float
source_type: "viral_detected" | "user_created" | "auto_generated"
status: "pending" | "approved" | "rejected" | "exported"
meta: JSON? (рассуждения LLM, теги, хэштеги, данные сентимента)
}
```
**Новый тип джоба:** `VIRAL_DETECT` в `JobTypeEnum`. Актор вызывает GigaChat API через `httpx` из Dramatiq-воркера.
**Расширение движков транскрипции:** Добавляем `"deepgram"` к существующему выбору (`engine: "whisper" | "google" | "deepgram"`). Deepgram становится дефолтом для новых транскрипций. Whisper остаётся как фоллбэк.
**Интеграция с LLM:**
- GigaChat API через `httpx` (OAuth2 token auth через Sber ID)
- DeepInfra как фоллбэк (OpenAI-совместимый API)
- Промпты хранятся в `cpv3/infrastructure/prompts/viral_detection_v1.txt`
- Активная версия контролируется через `LLM_VIRAL_PROMPT_VERSION`
- Новые настройки: `GIGACHAT_CLIENT_ID`, `GIGACHAT_CLIENT_SECRET`, `DEEPINFRA_API_KEY`, `DEEPGRAM_API_KEY`
### Фронтенд
- Новый `ViralClipsStep` в визарде проекта (features/project/)
- Список клипов с превьюшками, скорами, заголовками, кнопками принять/отклонить
- Модалка редактирования клипа с видео-превью (воспроизведение в диапазоне start/end)
- Новый тип джоба `VIRAL_DETECT` в обработке нотификаций (через существующую WebSocket-инфраструктуру)
### Ключевые цифры
| Метрика | v1 | v2 |
|---|---|---|
| Время транскрипции | Зависит от Whisper (уже готово) | ~30 сек (Deepgram, если ещё не транскрибировано) |
| Время LLM-анализа | 10-20 сек | 10-20 сек (без изменений) |
| Общее время обработки | 10-20 сек (после транскрипции) | **40-50 сек** (включая транскрипцию Deepgram) |
| Стоимость за видео | ~$0.005 (только LLM) | **~$0.17** ($0.16 Deepgram + $0.01 GigaChat) |
| Точность (precision) | 50-70% | **60-80%** (GigaChat лучше на русском + данные сентимента) |
| Новые зависимости | `google-generativeai` + `librosa` (~30 МБ) | **Только HTTP-клиент** (~0 МБ нового) |
| Срок MVP | 5-7 дней | **3-5 дней** |
Стоимость за видео выросла с полкопейки до семнадцати центов — но зато ноль зависимостей, ноль локальных моделей и на два дня быстрее в разработке.
### Риски
- **Доступность GigaChat API** — у Сбера uptime может быть ниже, чем у Google/OpenAI. Митигация: фоллбэк на DeepInfra.
- **Structured output GigaChat** — проверить, что JSON mode / function calling работает стабильно для извлечения клипов. Тестировать рано.
- **WER Deepgram на русском** — ~10-12% WER (Nova-3). Сопоставимо с Whisper `medium`. Достаточно для вирусной детекции.
- **Визуальные моменты** по-прежнему не ловятся (~20-30%) — то же ограничение, что и в v1.
### MVP vs Полная версия
- **MVP (3-5 дней):** Транскрипция Deepgram + анализ GigaChat. Возвращает клипы со скорами. Пользователь ревьюит и принимает/отклоняет. Без анализа энергии аудио.
- **Полная (6-10 дней):** Добавляем скоринг с весами сентимента, few-shot тюнинг промпта по фидбеку пользователей, пакетную обработку, прямой экспорт клипов в 9:16, A/B-тестирование через DeepInfra.
---
## Фича 3: Авто-монтаж и трекинг лица
В v1 эта фича была монстром: pyannote на CPU 30 минут жуёт аудио, PyTorch конфликтует с Whisper, GPU-воркеры, 16 ГБ RAM. В v2 всё, что касалось диаризации, ушло в один API-вызов Deepgram. Осталась только детекция лиц через MediaPipe — лёгкая библиотека, работающая на CPU за минуту-две.
### Архитектура (v2 — API-First)
**Детекция лиц:** MediaPipe BlazeFace (без изменений). Apache 2.0, модель ~2МБ, 30-60 FPS на CPU. Сэмплируем на 3 FPS. **Это единственный оставшийся локальный ML-компонент.** Зависимость: `mediapipe` (~30МБ).
**Диаризация спикеров:** **Deepgram API** с `diarize=true` (~30 секунд на 30-минутное видео). Полностью заменяет pyannote.audio. Диаризация включена в вызов транскрипции — никаких дополнительных расходов на API.
**Маппинг лицо-спикер:**
- **Фаза 1:** Эвристика по временнОй корреляции — сопоставляем треки лиц с сегментами спикеров Deepgram по максимальному пересечению во времени. 70-85% точности для видео с двумя спикерами. Ноль дополнительных зависимостей. ~100 строк Python.
- **Фаза 2:** TalkNet-ASD — если понадобится повысить точность. Единственный сценарий, где GPU мог бы вернуться в повестку, но можно откладывать бесконечно, если временная корреляция + ручная коррекция пользователем достаточны.
**Видео-композитинг:** Как в v1 — Remotion-композиции с CSS transform crop. Без изменений.
**Новые Remotion-композиции:** Как в v1.
| Композиция | Назначение | Фаза |
|---|---|---|
| `CaptionedVideo` (существует) | Наложение субтитров на нативное видео | Текущая |
| `ShortsVideo` (новая) | Статический/ключевой кроп + субтитры в 9:16 | Фича 4 |
| `AutoEditVideo` (новая) | Кроп с трекингом лица + монтаж + субтитры | Фича 3 (полная) |
**Формат данных кропа:** Как в v1 (ключевые кадры с нормализованными координатами 0-1).
### Бэкенд
**Новые типы джобов:** `FACE_DETECT` в `JobTypeEnum`. `SPEAKER_DIARIZE` **больше не нужен как отдельный джоб** — диаризация приходит от Deepgram в составе транскрипции.
**Отделение ML-сервиса:** **Не требуется.** MediaPipe лёгкая (~30МБ, ~400МБ RAM). Работает в стандартном Dramatiq-воркере.
**Изменения в Remotion-сервисе:** Как в v1 — параметр `compositionId`, пропсы `crop`/`outputWidth`/`outputHeight`.
### Время обработки (30-минутное 1080p видео)
Вот где разница между v1 и v2 ощущается физически:
| Шаг | v1 (CPU) | v2 (API-First) |
|---|---|---|
| Транскрипция + диаризация Deepgram | Нет | **~30 сек** |
| Детекция лиц (MediaPipe, 3 FPS) | 1-2 мин | 1-2 мин (без изменений) |
| ~~Диаризация спикеров (pyannote)~~ | ~~15-30 мин~~ | **Включено в Deepgram** |
| Маппинг лицо-спикер | < 1 сек | < 1 сек |
| Рендер Remotion (кроп + субтитры) | 10-30 мин | 10-30 мин (без изменений) |
| **Итого (с параллелизацией)** | **35-80 мин** | **12-33 мин** |
**Бутылочное горлышко в 15-30 минут на диаризацию — полностью ликвидировано.**
### Требования к памяти
| Конфигурация | v1 | v2 |
|---|---|---|
| Пиковое потребление RAM | 8-16 ГБ | **~400 МБ** (только MediaPipe) |
| Конфигурация воркера | `--threads 1`, лимит 16 ГБ | Стандартный воркер, лимит 4 ГБ |
С 16 гигабайт до 400 мегабайт. В сорок раз. Это не оптимизация — это другая категория задач.
### Фронтенд
Без изменений по сравнению с v1:
- Превью трекинга лица: видеоплеер с наложением bounding box через canvas
- Трек спикеров в TimelinePanel
- Контролы: слайдер зума, скорость перехода, выбор спикера
- Переключатель сравнения «до/после»
### Ключевые цифры
| Метрика | v1 | v2 |
|---|---|---|
| Время диаризации | 15-30 мин (CPU) / 1-2 мин (GPU) | **~30 сек** (API) |
| Время детекции лиц | 1-2 мин | 1-2 мин (без изменений) |
| Общее время анализа | 17-33 мин (CPU) | **~2 мин** |
| Полный пайплайн (с рендером) | 35-80 мин (CPU) | **12-33 мин** |
| Пиковое потребление RAM | 8-16 ГБ | **~400 МБ** |
| Новые зависимости | ~280 МБ (mediapipe + pyannote + torchaudio) | **~30 МБ** (только mediapipe) |
| GPU нужен? | Фаза 2 — рекомендуется | **Никогда** |
| Срок MVP | 12-15 дней | **8-10 дней** |
### Риски
- **Точность маппинга лицо-спикер** не изменилась (70-85% с эвристикой) — по-прежнему самая сложная подзадача
- **Точность диаризации Deepgram** — DER может быть чуть хуже, чем у pyannote 3.1 (~12-15% vs ~10%). Приемлемо для нашего кейса.
- **Потеря качества при кропе** — без изменений
- **TalkNet-ASD отложен** — если временная корреляция недостаточно точна, TalkNet потребует GPU. Разберёмся, когда дойдём.
### MVP vs Полная версия
- **MVP (8-10 дней):** Детекция лиц на сэмплированных кадрах. Deepgram предоставляет метки спикеров. Временная корреляция привязывает лица к спикерам. Пользователь может поправить вручную. Статический кроп на выбранное лицо.
- **Полная (20-30 дней):** Динамический кроп, следующий за активным спикером. Плавные переходы. Сплит-скрин. Мульти-спикер. Опциональный TalkNet-ASD для повышения точности.
---
## Фича 4: Конвертация в вертикальные Shorts (9:16)
**Без изменений по сравнению с v1.** Эта фича не зависит от ML.
### Архитектура
**Пайплайн:** Сначала кроп, потом субтитры — всегда. Один проход рендеринга в Remotion через новую композицию `ShortsVideo`.
**Позиционирование субтитров:** Новые поля в схеме не нужны. Бэкенд корректирует `font_size`, `padding_px`, `max_width_pct` в `styleConfig` под 9:16.
**Спецификация кропа:**
```typescript
type CropConfig = {
mode: "static" | "keyframe";
staticCrop?: { x: number; y: number; zoom: number };
keyframes?: Array<{ time: number; x: number; y: number; zoom: number }>;
interpolation?: "linear" | "ease" | "smooth";
};
```
### Бэкенд
**Новый тип джоба:** `ASPECT_CONVERT` в `JobTypeEnum`. Новая функция `crop_to_vertical()` в `media/service.py`.
**Новый тип артефакта:** `VERTICAL_VIDEO` в `ArtifactTypeEnum`.
### Фронтенд
- Превью кропа: перетаскиваемый прямоугольник 9:16 поверх видеоплеера
- Переключатель side-by-side превью
- Кнопка «Конвертировать в Short» на каждом одобренном вирусном клипе
- Автозаполнение кропа из данных детекции лица (когда доступны)
### Время обработки
| Подход | Время (30-мин видео) |
|---|---|
| FFmpeg кроп (без субтитров) | 12-36 мин |
| Remotion кроп + субтитры (один проход) | 11-45 мин |
| FFmpeg с NVENC (аппаратное кодирование) | 3-5 мин |
### MVP vs Полная версия
- **MVP (6-8 дней):** Ручной выбор региона кропа с превью. Remotion-композиция `ShortsVideo`.
- **Полная (+3-4 дня после Фичи 3):** Авто-кроп из данных детекции лица. Конвертация в один клик. Пакетный экспорт.
---
## Рекомендуемый порядок разработки
```
Неделя 1-2: Фича 1 (Шаблоны) ████████
Неделя 2-3: Фича 2 (Вирусная детекция) ██████████
Неделя 3-5: Фича 4 MVP (9:16 кроп) ████████████████
Неделя 5-10: Фича 3 (Трекинг лица) ██████████████████████████████
Неделя 10-11: Фича 4 (апгрейд) ████████
```
**Почему именно так:**
1. **Шаблоны первыми** — готовы к реализации, нулевой риск, моментальная польза для пользователей
2. **Вирусная детекция второй** — самый быстрый ROI с API-first подходом (3-5 дней MVP), валидирует спрос
3. **9:16 MVP третьим** — создаёт композицию `ShortsVideo`, полезна сама по себе
4. **Трекинг лица последним** — всё ещё самая сложная фича, но теперь намного проще без pyannote/GPU
5. **Апгрейд 9:16** — тривиален, когда трекинг лица даёт данные о позициях
---
## Анализ стоимости
### Стоимость обработки одного видео (30-мин, все фичи)
| Компонент | v1 (локальный ML) | v2 (API-First) |
|---|---|---|
| Транскрипция + диаризация | $0.07 вычисления | **$0.16** (Deepgram) |
| LLM вирусная детекция | $0.005 (Gemini) | **$0.01** (GigaChat) |
| Детекция лиц | $0.002 вычисления | $0.002 вычисления (без изменений) |
| FFmpeg/Remotion рендер | $0.02 вычисления | $0.02 вычисления |
| **Итого за видео** | **$0.11** | **$0.20** |
Двадцать центов. За полный пайплайн: транскрипция, диаризация, поиск вирусных моментов, детекция лиц, рендер. Двадцать центов.
### Сравнение месячных расходов
| Масштаб | v1 (локальный ML) | v2 (API-First) |
|---|---|---|
| 100 видео/месяц | $11 вычисления + сервер + $0-380 GPU | **$20 API + сервер** |
| 500 видео/месяц | $55 + $200-380 GPU = $255-435 | **$100 API + сервер** |
| 1 000 видео/месяц | $110 + $380 GPU = $490 | **$200 API + сервер** |
| 5 000 видео/месяц | $550 + $380 GPU = $930 | **$1 000 API + сервер** |
**Точка безубыточности:** ~2 000-3 000 видео/месяц. Ниже этого порога API дешевле. А учитывая, что не нужно думать о GPU, обслуживать ML-инфраструктуру и чинить OOM-крэши — реальный breakeven ещё выше.
### Предлагаемые тарифы SaaS
| Тариф | Цена | Ограничения | Себестоимость | Маржа |
|---|---|---|---|---|
| Free | $0 | Видео до 10 мин, 5/месяц | ~$0.07/видео | Маркетинг |
| Pro | $15-30/мес | Видео до 30 мин, 50/месяц | ~$0.20/видео | 50-70% |
| Business | $50-100/мес | Видео до 60 мин, 200/месяц | ~$0.35/видео | 65-80% |
---
## Инфраструктура (v2 — упрощённая)
### Архитектура
```
Фронтенд → Backend API → Dramatiq-воркер (лёгкий: только MediaPipe)
↕ ↕ ↕
PostgreSQL Deepgram API GigaChat API
Redis (транскрипция (вирусная
S3/MinIO + диаризация) детекция)
Remotion DeepInfra
(фоллбэк LLM)
```
Сравните с v1: нет ML-воркера, нет GPU, нет Docker Compose profiles. Один воркер обрабатывает всё.
### Docker-образ
| | v1 | v2 |
|---|---|---|
| База | python:3.11-slim + PyTorch + Whisper + CUDA libs | python:3.11-slim + mediapipe |
| Размер | 1.72 ГБ | **~400-500 МБ** |
| RAM | 16 ГБ рекомендовано | **4 ГБ достаточно** |
**Можно удалить из `pyproject.toml`:** `openai-whisper` (и транзитивно PyTorch) — если Deepgram полностью заменяет Whisper. Оставить Whisper как опциональную зависимость (`uv sync --group whisper`) для фоллбэка.
### Разделение ML-сервиса не требуется
При том, что локально работает только MediaPipe (~30МБ, ~400МБ RAM), не нужны:
- Отдельный контейнер ML-воркера
- Docker Compose profiles для ML
- GPU-инфраструктура
- Выделенные очереди Dramatiq для ML
Стандартный воркер с `--processes 1 --threads 2` справляется со всем.
### Новые настройки
```python
# Deepgram
deepgram_api_key: str = Field(default="", alias="DEEPGRAM_API_KEY")
# GigaChat (Сбер)
gigachat_client_id: str = Field(default="", alias="GIGACHAT_CLIENT_ID")
gigachat_client_secret: str = Field(default="", alias="GIGACHAT_CLIENT_SECRET")
# DeepInfra (фоллбэк LLM)
deepinfra_api_key: str = Field(default="", alias="DEEPINFRA_API_KEY")
# Конфигурация LLM
llm_provider: str = Field(default="gigachat", alias="LLM_PROVIDER") # gigachat | deepinfra
llm_viral_prompt_version: str = Field(default="v1", alias="LLM_VIRAL_PROMPT_VERSION")
```
---
## Сводка по технологическому стеку
### Новые зависимости (v2)
| Пакет | Размер | Назначение | Фича |
|---|---|---|---|
| `mediapipe` | ~30 МБ | Детекция лиц (CPU) | 3 |
| `httpx` | Уже установлен | API-вызовы к Deepgram, GigaChat, DeepInfra | 2, 3 |
| **Итого новых зависимостей** | **~30 МБ** | | |
### Удалённые зависимости (по сравнению с v1)
| Пакет | Сэкономлено | Для чего использовался |
|---|---|---|
| ~~`openai-whisper`~~ | ~50 МБ + PyTorch ~2 ГБ | Транскрипция (заменён Deepgram) |
| ~~`pyannote-audio`~~ | ~200 МБ | Диаризация (заменён Deepgram) |
| ~~`torchaudio`~~ | ~50-80 МБ | Зависимость pyannote |
| ~~`librosa`~~ | ~20 МБ | Энергия аудио (заменён сентиментом Deepgram) |
| **Итого удалено** | **~2.3 ГБ** | |
Добавили 30 мегабайт. Удалили 2.3 гигабайта. Соотношение 1:77.
### Новые бэкенд-модули
| Модуль | Назначение | Фича |
|---|---|---|
| `clips` | CRUD клипов, воркфлоу ревью | 2 |
### Новые Remotion-композиции
| Композиция | Назначение | Фича |
|---|---|---|
| `ShortsVideo` | Статический/ключевой кроп + субтитры в 9:16 | 4 |
| `AutoEditVideo` | Динамический кроп с трекингом лица + субтитры | 3 |
### Новые типы джобов
| Тип джоба | Назначение | Фича |
|---|---|---|
| `VIRAL_DETECT` | Анализ транскрипции через GigaChat | 2 |
| `ASPECT_CONVERT` | 9:16 кроп + пере-кодирование | 4 |
| `FACE_DETECT` | Детекция bounding box лиц (MediaPipe) | 3 |
Обратите внимание: `SPEAKER_DIARIZE` **больше не является отдельным типом джоба** — диаризация включена в транскрипцию Deepgram.
### Расширение движков транскрипции
```python
# Расширяем существующий выбор движка:
engine: Literal["whisper", "google", "deepgram"] = "deepgram"
```
Deepgram становится дефолтом. Whisper остаётся как опциональный фоллбэк (требует `uv sync --group whisper`).
---
## Сквозные проблемы (v2)
### Остались из v1
| Проблема | Приоритет | Действие |
|---|---|---|
| `_get_job_status_sync()` течёт соединениями к БД | Высокий | Починить до добавления новых акторов |
| `tasks/service.py` — 1 674 строки, скоро перевалит за 2К | Средний | Вынести бойлерплейт акторов |
| Дефолт `REMOTION_SERVICE_URL` в воркере неверный | Средний | Исправить на `http://remotion:3001` |
| Ни на одном Docker-сервисе нет лимитов ресурсов | Средний | Добавить memory/CPU лимиты |
| Нет очистки временных файлов при OOM-крэше | Средний | Добавить периодическую очистку |
| Проверка `isCurrent` слова в Captions.tsx хрупкая | Низкий | Сравнивать по индексу |
### Новые в v2
| Проблема | Приоритет | Действие |
|---|---|---|
| Управление API-ключами (3 сервиса) | Высокий | Всё через env-переменные в settings, никогда в коде |
| Обработка rate limit'ов API | Высокий | Retry с exponential backoff во всех акторах |
| Зависимость от вендора | Средний | Абстрагировать за интерфейсом движков (существующий паттерн) |
| Зависимость от сети (API недоступен) | Средний | Оставить Whisper как опциональный фоллбэк |
| Конвертация Deepgram -> схема Document | Средний | Построить конвертер под существующую структуру `Document` |
| Обновление OAuth2-токена GigaChat | Средний | Кэширование токена с авто-обновлением в `infrastructure/` |
### Ликвидированные из v1
| ~~Проблема~~ | Почему исчезла |
|---|---|
| ~~PyTorch CPU-only индекс~~ | PyTorch удалён полностью |
| ~~OOM воркера на ML-джобах~~ | Нет тяжёлого ML локально |
| ~~Docker-образ ML-воркера~~ | Один лёгкий образ |
| ~~GPU-инфраструктура~~ | Весь ML — через API |
| ~~Конфликты версий PyTorch~~ | Нет PyTorch |
| ~~Скачивание моделей при первом запуске~~ | Нет локальных моделей |
---
## Отчёты специалистов
Полные выводы специалистов доступны в стенограмме сессии. Ключевые файлы, которые изучал каждый:
- **ML-инженер:** `cpv3/modules/transcription/service.py`, `cpv3/modules/tasks/service.py`, `pyproject.toml`
- **Backend-архитектор:** `cpv3/modules/tasks/service.py`, `cpv3/modules/jobs/schemas.py`, `cpv3/modules/media/service.py`, `cpv3/modules/captions/service.py`, `docker-compose.yml`
- **Remotion-инженер:** `remotion_service/src/components/Composition.tsx`, `Captions.tsx`, `Root.tsx`, `useCaptions.ts`, `useVideoMeta.ts`, все определения типов
- **Frontend-архитектор:** `src/widgets/TimelinePanel/`, `src/features/project/FragmentsStep/`, `src/shared/context/WizardContext.tsx`, `src/shared/store/notifications/`
- **DevOps-инженер:** `docker-compose.yml`, `Dockerfile`, `pyproject.toml`, `uv.lock`
- **Инженер по производительности:** `cpv3/modules/tasks/service.py`, `cpv3/modules/media/service.py`, `cpv3/modules/transcription/service.py`, `docker-compose.yml`
Примечание: Отчёты специалистов подготовлены для архитектуры v1 (локальный ML). Их рекомендации по Remotion-композициям, дизайну бэкенд-модулей, фронтенд-компонентам и форматам данных кропа остаются актуальными в v2. Рекомендации по инфраструктуре и ML-моделям заменены API-first подходом.