27e03cc56c
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
538 lines
37 KiB
Markdown
538 lines
37 KiB
Markdown
# Дорожная карта видеофич — Техническая консультация 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 подходом.
|