| # | Фича | Сложность | MVP | Полная версия | Доп. инфраструктура |
|---|---|---|---|---|---|
| 1 | Продвинутые шаблоны Remotion | Легко | 3–4 дня | 3–4 дня | Ничего |
| 2 | Детекция вирусных моментов | Средне | 5–7 дней | 8–12 дней | API-ключ для LLM |
| 3 | Авто-монтаж и трекинг лица | Сложно | 12–15 дней | 30–45 дней | Фаза 2: GPU-воркер |
| 4 | Конвертация в Shorts (9:16) | Средне | 6–8 дней | +3–4 дня | Ничего |
Реалистичный прогноз для одного разработчика: 6–8 недель (все MVP) или 3–4 месяца (полные версии).
Что делаем: Расширяем 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 на фронте.
Спецификация: docs/superpowers/specs/2026-03-21-advanced-remotion-templates-design.md
План: docs/superpowers/plans/2026-03-21-advanced-remotion-templates.md
LLM API: Gemini 2.5 Flash — лучшая поддержка русского языка, $0.15/$0.60 за 1М токенов. Альтернатива: GPT-4o-mini. Стоимость анализа одного 30-минутного видео: ~$0.005.
Аудио-подкрепление: librosa для кривых RMS-энергии — уточняет границы клипов до естественных пауз, повышает скор для энергичных сегментов. ~20МБ, обработка 30 мин аудио <10 секунд.
librosa считает огибающую энергии (разрешение 100мс)clipsНовый модуль: clips — хранит найденные клипы со связями 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. Актор вызывает LLM API через httpx из Dramatiq-воркера.
ViralClipsStep в визарде проектаVIRAL_DETECT в обработке нотификаций| Метрика | Значение |
|---|---|
| Точность (precision) | 50–70% |
| Полнота (recall) | 60–80% |
| Время обработки | 10–20 секунд |
| Стоимость за видео | ~$0.005 |
| 1 000 видео/месяц | ~$5 |
| Новые зависимости | ~30 МБ |
tiny даёт ~25% WER; для вирусной детекции минимум smallТолько текстовый анализ через LLM, без аудио-энергии. Возвращает клипы со скорами. Пользователь ревьюит и принимает/отклоняет.
Добавляем librosa-анализ энергии, few-shot примеры из принятых клипов, пакетную обработку, прямой экспорт в 9:16.
Детекция лиц: MediaPipe BlazeFace (Apache 2.0, ~2МБ модель, 30–60 FPS на CPU). Сэмплируем на 3 FPS. Зависимость: mediapipe (~30МБ).
Диаризация спикеров: pyannote.audio 3.1 (MIT, ~10% DER, self-hosted). CPU: 0.17–0.33x реального времени. GPU: 1–2 мин на 30 мин аудио. Зависимости: pyannote-audio (~200МБ) + torchaudio (~50–80МБ).
Маппинг лицо-спикер:
Динамический кроп через CSS transform: scale() translate() на <Video> внутри контейнера с overflow: hidden. GPU-ускоренная браузерная операция — бесплатная по производительности.
| Композиция | Назначение | Фаза |
|---|---|---|
CaptionedVideo | Наложение субтитров (существует) | Текущая |
ShortsVideo | Статический кроп + субтитры в 9:16 | Фича 4 |
AutoEditVideo | Кроп с трекингом лица + монтаж + субтитры | Фича 3 |
type FaceKeyframe = {
time: number; // секунды
x: number; // центр лица, 0.0–1.0
y: number; // центр лица, 0.0–1.0
width: number; // ширина bbox, 0.0–1.0
height: number; // высота bbox, 0.0–1.0
speakerId?: string;
};
type CropTrack = {
keyframes: FaceKeyframe[];
interpolation: "linear" | "ease" | "smooth";
zoom: number; // базовый множитель зума
safeMargin: number; // отступ вокруг лица (0.1 = 10%)
};
Новые типы джобов: FACE_DETECT, SPEAKER_DIARIZE. Результаты хранятся в Job.output_data (JSON).
Отделение ML-сервиса:
ml-worker на выделенных очередях Dramatiq.| Шаг | CPU | GPU |
|---|---|---|
| Извлечение аудио (FFmpeg) | 10–20 сек | 10–20 сек |
| Детекция лиц (MediaPipe, 3 FPS) | 1–2 мин | 10–15 сек |
| Диаризация спикеров (pyannote) | 15–30 мин | 1–2 мин |
| Маппинг лицо-спикер | < 1 сек | < 1 сек |
| Рендер Remotion | 10–30 мин | 10–30 мин |
| Итого | 35–80 мин | 16–40 мин |
| Конфигурация | Пиковое потребление RAM |
|---|---|
| Whisper base + pyannote (параллельно) | 8–12 ГБ |
| Whisper medium + pyannote (параллельно) | 12–16 ГБ |
| Рекомендуемый лимит ML-воркера | 16 ГБ, --threads 1 |
| Метрика | Значение |
|---|---|
| Точность детекции лиц | ~90% |
| DER диаризации | ~10% |
| Маппинг Фаза 1 | 70–85% |
| Маппинг Фаза 2 (TalkNet) | ~92% |
| Новые зависимости | ~280 МБ |
| GPU обязателен? | Нет для Фазы 1 |
Детекция лиц. Пользователь выбирает лицо вручную. Статический кроп. Без диаризации. Один спикер.
Диаризация + маппинг. Динамический кроп за активным спикером. Spring()-переходы. Сплит-скрин. Несколько спикеров.
Сначала кроп, потом субтитры — всегда. Один проход рендеринга через новую композицию ShortsVideo.
Спецификация кропа:
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_CONVERTVERTICAL_VIDEOcrop_to_vertical() в media/service.py| Подход | 30-мин видео |
|---|---|
| FFmpeg кроп (без субтитров) | 12–36 мин |
| Remotion кроп + субтитры | 11–45 мин |
| FFmpeg с NVENC | 3–5 мин |
Ручной выбор кропа. Перетаскиваемый прямоугольник. ShortsVideo рендерит кроп + субтитры.
Авто-кроп из трекинга лица. Конвертация в один клик. Пакетная обработка.
ShortsVideo, которую расширит Фича 3| Уровень | Состав | Вычисления | LLM API | Итого | Время |
|---|---|---|---|---|---|
| Только CPU | Всё на CPU | $0.05 | $0.06 | $0.11 | 35–80 мин |
| GPU (T4) | ML на GPU | $0.11 | $0.06 | $0.17 | 16–40 мин |
| GPU + NVENC | Всё на GPU | $0.13 | $0.06 | $0.19 | 10–15 мин |
| Сценарий | Стоимость |
|---|---|
| Только CPU (текущая инфра) | ~$11 + сервер |
| Modal serverless GPU | ~$21/мес |
| Spot GPU (g4dn.xlarge) | ~$115/мес |
| Постоянный GPU | ~$380/мес |
| Тариф | Цена | Ограничения | Себестоимость | Маржа |
|---|---|---|---|---|
| Free | $0 | Видео до 10 мин, низкий приоритет | ~$0.04/видео | Маркетинг |
| Pro | $15–30/мес | Видео до 30 мин, GPU ML | ~$0.17 при 50 видео | 60–80% |
| Business | $50–100/мес | Видео до 60 мин, приоритет, NVENC | ~$0.38/видео | 70–85% |
ML в Dramatiq-воркерах. MediaPipe + pyannote добавляют ~280МБ. PyTorch уже установлен через Whisper.
Отдельный ml-worker контейнер. Тот же код, другой образ (Dockerfile.ml), другие лимиты ресурсов.
docker-compose up # По умолчанию: без ML-воркера
docker-compose --profile ml up # С ML-воркером
| Действие | Эффект | Трудозатраты |
|---|---|---|
| PyTorch на CPU-only индекс | -800МБ образ | 1 час |
Исправить REMOTION_SERVICE_URL | Баг-фикс | 5 мин |
| Лимиты ресурсов docker-compose | Предотвращение каскадных OOM | 30 мин |
| Пулы очередей Dramatiq | Предотвращение голодания воркеров | 2–3 часа |
Четыре задачи. Суммарно полдня. Экономия: 800МБ, один баг, и страховка от OOM.
| Пакет | Размер | Назначение | Фича |
|---|---|---|---|
google-generativeai / openai | ~10 МБ | LLM API клиент | 2 |
librosa | ~20 МБ | Анализ энергии аудио | 2 |
mediapipe | ~30 МБ | Детекция лиц | 3 |
pyannote-audio | ~200 МБ | Диаризация спикеров | 3 |
torchaudio | ~50–80 МБ | Обработка аудио | 3 |
| Итого | ~310–340 МБ |
| Элемент | Назначение | Фича |
|---|---|---|
Модуль clips | CRUD клипов, ревью | 2 |
Композиция ShortsVideo | Статический кроп + субтитры 9:16 | 4 |
Композиция AutoEditVideo | Динамический кроп + субтитры | 3 |
Джоб VIRAL_DETECT | LLM-анализ транскрипции | 2 |
Джоб ASPECT_CONVERT | 9:16 кроп | 4 |
Джоб FACE_DETECT | Детекция лиц | 3 |
Джоб SPEAKER_DIARIZE | Диаризация | 3 |
Шесть специалистов — шесть взглядов на одну кодовую базу.
| Проблема | Кто | Приоритет | Действие |
|---|---|---|---|
| PyTorch тащит CUDA (+800МБ) | DevOps | Высокий | CPU-only PyTorch индекс |
| Воркер упадёт по OOM на ML-джобах | Performance | Высокий | Пулы очередей, --threads 1 |
_get_job_status_sync() течёт соединениями | Performance | Высокий | Починить до новых акторов |
Нет очистки /tmp при OOM | Performance | Средний | Периодическая очистка / cron |
tasks/service.py — 1 674 строки | Backend | Средний | Декоратор/контекст-менеджер |
REMOTION_SERVICE_URL неверный | DevOps | Средний | Исправить на http://remotion:3001 |
| Нет лимитов ресурсов Docker | DevOps | Средний | Добавить memory/CPU лимиты |
| Whisper в ML-сервис | Backend | Низкий | Запланировать при Фазе 2 |
isCurrent в Captions.tsx | Remotion | Низкий | Сравнивать по индексу |
Ключевые файлы, которые изучал каждый:
transcription/service.py, tasks/service.py, pyproject.tomltasks/service.py, jobs/schemas.py, media/service.py, captions/service.py, docker-compose.ymlComposition.tsx, Captions.tsx, Root.tsx, useCaptions.ts, все типыTimelinePanel/, FragmentsStep/, WizardContext.tsx, notifications/docker-compose.yml, Dockerfile, pyproject.toml, uv.locktasks/service.py, media/service.py, transcription/service.py, docker-compose.yml