Зачем городить свой RAG для видео?
Вы загружаете конференцию в ChatGPT. Или корпоративный тренинг в Gemini. Или архив вебинаров в Claude. Все хотят ваши данные. Все обещают безопасность. А вы в итоге платите за каждый запрос и молитесь, чтобы видео с коммерческой тайной не утекло в обучающую выборку.
Локальный RAG для видео решает три проблемы одним махом:
- Приватность — видео никуда не уходят с вашего железа
- Контроль — сами решаете, какие модели использовать и как хранить
- Экономия — платите только за электричество и железо
Но есть нюанс. Собрать такой пайплайн с нуля — это неделя кодинга, отладки FFmpeg и борьбы с памятью. Я знаю, я через это прошел.
Что должно уметь решение для видео-RAG
Простой транскрипции через Whisper недостаточно. Видео — это мультимодальный формат. Текст в кадре (слайды презентаций, интерфейсы, субтитры) часто содержит ключевую информацию, которую аудио не передает.
| Компонент | Зачем нужен | Что использовать |
|---|---|---|
| Извлечение кадров | Получаем ключевые слайды | FFmpeg, OpenCV |
| Аудио транскрипция | Превращаем речь в текст | Whisper.cpp, faster-whisper |
| OCR кадров | Читаем текст со слайдов | EasyOCR, PaddleOCR |
| Векторизация | Готовимся к семантическому поиску | sentence-transformers |
| Хранение | Ищем похожие фрагменты | Qdrant, Chroma, FAISS |
Собрать все это воедино — задача нетривиальная. Особенно если хотите API, а не скрипт на коленке.
Готовое решение: Video-RAG-API
Недавно наткнулся на проект, который делает именно это. Он берет видеофайл, прогоняет через весь пайплайн и выдает JSON с метаданными, транскрипцией, OCR-текстом и эмбеддингами. Все локально. Все в Docker.
1Что умеет API
Основной эндпоинт — /process-video. Отправляете видео, получаете структурированные данные:
{
"video_id": "conf_2024_keynote.mp4",
"metadata": {
"duration": 3542,
"resolution": "1920x1080",
"fps": 30
},
"transcription": [
{
"start": 0.0,
"end": 5.2,
"text": "Добро пожаловать на нашу конференцию...",
"embedding": [0.123, -0.456, ...]
}
],
"frames": [
{
"timestamp": 120.5,
"ocr_text": "Q1 Results: Revenue +15% YoY",
"embedding": [0.789, 0.012, ...]
}
]
}Ключевое здесь — два типа эмбеддингов: для аудиотранскрипции и для текста с кадров. Это позволяет искать и по тому, что говорили, и по тому, что показывали.
2Как это работает под капотом
Архитектура простая, но эффективная:
- Видео загружается через REST API или WebSocket
- FFmpeg извлекает аудиодорожку и ключевые кадры (1 кадр в секунду или по смене сцены)
- Аудио идет в Whisper (можно выбрать модель: tiny, base, small)
- Кадры обрабатываются OCR-движком (EasyOCR по умолчанию)
- Тексты (и транскрипция, и OCR) векторизуются через модель типа all-MiniLM-L6-v2
- Все сохраняется в векторную БД с привязкой к временным меткам
Самое приятное — настройка через конфиг. Хотите другой OCR? Меняете одну строку. Нужна другая модель для эмбеддингов? Правите конфигурацию.
Запускаем за 15 минут
Docker-compose файл — ваше спасение. Качаете репозиторий, правите пару переменных окружения и запускаете:
git clone https://github.com/.../video-rag-api.git
cd video-rag-api
# Редактируем docker-compose.yml, если нужно
# Например, меняем модель Whisper с base на small
docker-compose up -dЧерез пару минут (зависит от скорости интернета и скачивания моделей) получаете работающий API на порту 8000.
Тестовый запрос через curl:
curl -X POST http://localhost:8000/process-video \
-F \"video=@presentation.mp4\" \
-H \"Content-Type: multipart/form-data\" \
-o result.jsonПредупреждение: первый запуск всегда долгий. Модели Whisper и эмбеддингов весят гигабайты. Но они кэшируются локально, так что второй раз будет быстрее.
3Интеграция с вашей RAG-системой
Допустим, у вас уже есть локальная RAG-система. Добавить видео-поддержку теперь просто:
import requests
import json
from typing import List
def index_video(video_path: str, collection_name: str):
# Отправляем видео в API
with open(video_path, 'rb') as f:
files = {'video': f}
response = requests.post('http://localhost:8000/process-video',
files=files)
result = response.json()
# Подготавливаем данные для векторной БД
chunks = []
# Добавляем транскрипцию
for segment in result['transcription']:
chunks.append({
'text': segment['text'],
'embedding': segment['embedding'],
'metadata': {
'type': 'audio',
'start': segment['start'],
'end': segment['end'],
'video_id': result['video_id']
}
})
# Добавляем OCR-текст с кадров
for frame in result['frames']:
if frame['ocr_text']:
chunks.append({
'text': frame['ocr_text'],
'embedding': frame['embedding'],
'metadata': {
'type': 'visual',
'timestamp': frame['timestamp'],
'video_id': result['video_id']
}
})
# Загружаем в вашу векторную БД (например, Qdrant или Chroma)
# ... ваш код для upsert в коллекцию
return len(chunks)Теперь можете искать по видео как по обычным документам. Спросите \"Что говорили про квартальные результаты?\" — получите временные метки и контекст.
Альтернативы: с чем сравнивать
Есть несколько подходов к видео-RAG. Каждый со своими тараканами.
| Подход | Плюсы | Минусы | Когда выбирать |
|---|---|---|---|
| Облачные API (AssemblyAI, Deepgram) | Простота, точность, масштабирование | Дорого, данные уходят в облако | Разовые задачи, нет требований к приватности |
| Самописный пайплайн | Полный контроль, гибкость | Месяц разработки, вечная отладка | Есть команда и время, нужна кастомизация |
| Video-RAG-API (этот проект) | Локальность, готовый API, OCR+аудио | Требует железа, настройка под себя | Приватные видеоархивы, корпоративное использование |
| Мультимодальные LLM (Qwen-VL) | Понимает контекст кадра целиком | Медленно, жрет память, сложно локально | Анализ сложных визуальных сцен |
Если интересны другие мультимодальные подходы, посмотрите обзор мультимодального RAG. Там есть про видеоанализ через большие модели.
Где это пригодится на практике
Сценарии использования шире, чем кажется:
- Корпоративные тренинг-архивы — сотрудники ищут конкретные моменты в сотнях часов записей
- Юридические видеодоказательства — поиск по стенограммам и тексту в кадре
- Образовательные платформы — студенты находят нужную тему в лекциях
- Медиа-архивы — журналисты ищут интервью по цитатам
- Личные видеоархивы — семейные записи с возможностью поиска
Ограничения и подводные камни
Идеальных решений не бывает. Вот что может пойти не так:
- Требования к железу — Whisper small требует 2-4GB GPU памяти. На CPU будет медленно.
- Качество OCR — зависит от шрифтов, контраста и языка. С русским курсивом могут быть проблемы.
- <\/li>
- Точность временных меток — Whisper иногда ошибается на доли секунды, особенно с фоновым шумом.
- Длинные видео — часовая запись создаст тысячи чанков. Нужна хорошая векторная БД.
Для сложных документов с таблицами и схемами лучше использовать специализированные OCR-инструменты. Посмотрите сравнение OCR для агентов — там есть варианты для структурированных данных.
Кому подойдет это решение
Video-RAG-API — не для всех. Но если вы попадаете в одну из категорий ниже, стоит попробовать:
- Разработчики корпоративных систем с требованиями к приватности данных
- Исследователи, работающие с видеоархивами (социология, лингвистика)
- Небольшие медиа-компании, которые хотят оцифровать свой архив
- Образовательные проекты с локальным развертыванием
- Любой, кто устал платить за облачные транскрипции
Если же вам нужен просто суммаризатор YouTube-роликов, возможно, проще использовать локальный YouTube-суммаризатор. Он проще и быстрее.
Что дальше? Доработки и кастомизация
Готовый API — это только начало. Вот что можно добавить:
- Распознавание лиц — индексация по тому, кто говорит
- Детекция сцен — автоматическое разделение на главы
- Мультиязычность — поддержка транскрипции на 100+ языках
- Визуальные эмбеддинги — поиск по похожим кадрам
- Интеграция с существующими RAG-системами типа Ragex для анализа кода
Главное преимущество open-source — можете форкнуть и допилить под свои нужды. Нужен другой OCR-движок? Замените EasyOCR на что-то вроде Tesseract. Хотите другую модель эмбеддингов? Обновите конфигурацию.
Через год, возможно, появятся модели, которые делают все это в один проход. Но сегодня Video-RAG-API — один из самых простых способов заставить ваш компьютер понимать, что происходит в видео. Без отправки данных в облако. Без ежемесячных счетов. И с возможностью поиска не только по словам, но и по тому, что было на экране.
Попробуйте. Первый видеофайл обработаете за вечер. А когда накопите терабайты индексированного видео, вспомните эту статью.