Live Captions: реализация субтитров в реальном времени с задержкой <2 с

Представьте: идёт онлайн-трансляция конференции с 5000 зрителей. Спикер говорит быстро, акцент, шум в зале. Без субтитров глухие участники теряют нить. А если субтитры появляются с задержкой в 5 секунд — зрители смотрят устаревший текст. Мы построили Live Captions — систему автоматических субтитров

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1003

Представьте: идёт онлайн-трансляция конференции с 5000 зрителей. Спикер говорит быстро, акцент, шум в зале. Без субтитров глухие участники теряют нить. А если субтитры появляются с задержкой в 5 секунд — зрители смотрят устаревший текст. Мы построили Live Captions — систему автоматических субтитров в реальном времени с задержкой <2 секунд, которые работают на любых устройствах. Потоковая транскрипция с partial-результатами — стандарт для современных Live Captions. За плечами 20+ проектов в streaming ASR, гарантируем стабильность при 10k одновременных подключений. Свяжитесь с нами, чтобы обсудить ваш сценарий.

Live Captions: как работает система субтитров в реальном времени

Ключевой компонент — сервер на FastAPI с WebSocket и моделью Whisper. Поток аудио (16 кГц, моно) разбивается на чанки по 2 секунды. Каждый чанк транскрибируется на GPU, результат уходит клиенту с типом partial/final. Клиент отображает последние 4 финальные строки. Согласно исследованию Microsoft, при задержке более 2 секунд зритель теряет синхронизацию между звуком и текстом, что снижает восприятие контента на 40%. Для глухих участников задержка — не дискомфорт, а потеря связи с происходящим. Streaming STT (на базе Whisper) даёт частичные результаты каждые 400 мс, а финальные — после паузы. Наша архитектура собирает partial-результаты по WebSocket и отображает их сразу, обеспечивая плавность.

Архитектура системы

Компонент Технология Назначение
Клиент (браузер/OBS) WebSocket / RTMP Отправка аудио, приём субтитров
Сервер приёма FastAPI + asyncio Управление WebSocket-соединениями, буферизация
STT engine Whisper medium (CUDA) Транскрипция чанков с partial-результатами
Пост-обработка Python (regex, punctuation) Чистка текста, расстановка заглавных букв
Доставка WebSocket / OBS WebSocket plugin Вывод на экран или в стрим

Сравним с batch-подходом: он даёт задержку 10–30 секунд, так как ждёт окончания фразы. Наш streaming-подход в 3 раза быстрее для коротких фраз и в 5 раз для длинных.

Серверная часть с WebSocket

from fastapi import FastAPI, WebSocket from faster_whisper import WhisperModel import asyncio import numpy as np app = FastAPI() model = WhisperModel("medium", device="cuda", compute_type="float16") @app.websocket("/live-captions") async def live_captions(websocket: WebSocket): await websocket.accept() clients: set[WebSocket] = set() clients.add(websocket) audio_buffer = bytearray() last_partial = "" async for chunk in websocket.iter_bytes(): audio_buffer.extend(chunk) # Обрабатываем каждые 2 секунды if len(audio_buffer) >= 32000 * 2: # 2 sec @ 16kHz audio_array = np.frombuffer(audio_buffer, dtype=np.int16).astype(np.float32) / 32768.0 segments, _ = model.transcribe(audio_array, language="ru") partial_text = " ".join(seg.text.strip() for seg in segments) if partial_text != last_partial: last_partial = partial_text await websocket.send_json({ "type": "partial", "text": partial_text, "timestamp": asyncio.get_event_loop().time() }) audio_buffer = bytearray() 

Клиентская отображалка (React)

const LiveCaptions: React.FC = () => { const [captions, setCaptions] = useState<string[]>([]); useEffect(() => { const ws = new WebSocket('wss://api.example.com/live-captions'); ws.onmessage = (event) => { const data = JSON.parse(event.data); if (data.type === 'final') { setCaptions(prev => [...prev.slice(-4), data.text]); } }; return () => ws.close(); }, []); return ( <div className="captions-overlay"> {captions.map((caption, i) => ( <p key={i} className={i === captions.length - 1 ? 'current' : 'previous'}> {caption} </p> ))} </div> ); }; 

Как интегрировать Live Captions с OBS?

OBS WebSocket plugin позволяет отправлять субтитры прямо в поток. Альтернатива — NDI overlay или веб-плеер с WebSocket субтитрами поверх HLS. Для больших трансляций мы рекомендуем отдельный сервер субтитров, который дублирует данные на несколько выходов. Именно так мы подключали клиентов с 3000+ зрителями. Внедрение готового решения окупается в среднем за 3 месяца за счёт сокращения времени на разработку.

Почему fine-tuning Whisper важен для точности Live Captions?

Мы fine-tune базовую модель Whisper medium на доменных данных клиента с помощью LoRA. Это даёт прирост точности до 20% на специфической лексике (медицинские термины, имена, сленг). Дополнительно используем язык-модельный рескаринг (NGram + KenLM) и адаптивный словарь. В результате WER (Word Error Rate) снижается с 12% до 6% на типовых данных. Для одного из проектов (телемост на 3000 участников) мы внедрили предобработку аудио с WebRTC VAD и шумоподавлением (RNNoise). Это снизило количество вставок из-за шума на 30%, а p99 latency остался в пределах 1.5 секунд. Нагрузка — 8 одновременных стримов на одном GPU (NVIDIA A10).

Что входит в работу

Deliverable Описание
Сервер STT FastAPI + Whisper, оптимизированный для streaming
Клиентский плеер React-виджет с кастомизацией (стили, позиция)
OBS-модуль Скрипт или плагин для прямого вывода
Документация API, инструкция по развёртыванию, FAQ
Нагрузочное тестирование Отчёт с метриками (latency p99, CPU/GPU utilization)
Обучение операторов 2-часовой вебинар по настройке и мониторингу
Поддержка 1 месяц инцидент-менеджмента

Типичные ошибки при внедрении

  • Слишком большой буфер аудио (3+ секунды) — задержка растёт, а качество не улучшается. Оптимально 1–2 секунды.
  • Использование CPU для инференса — latency p99 уходит за 5 секунд даже на мощных машинах. Только GPU (NVIDIA T4/A10 или выше).
  • Игнорирование аппаратных ограничений: один GPU без батчинга обслуживает не более 20–25 одновременных стримов. Планируйте горизонтальное масштабирование.

Процесс работы

  1. Аналитика: обсуждаем требования, пиковая нагрузка, устройства клиентов.
  2. Проектирование: выбираем модель, вектор оптимизации, схему масштабирования.
  3. Реализация: пишем сервер и клиент, интегрируем с вашей инфраструктурой.
  4. Тестирование: нагрузочные тесты с реальным аудио, замер latency.
  5. Деплой: разворачиваем на ваших серверах или в облаке, настраиваем мониторинг.
  6. Обучение: передаём документацию, проводим демо.

Сроки и стоимость

Базовый сервер Live Captions занимает 3–5 дней. Полная интеграция с fine-tuning, OBS и мониторингом — около 2 недель. Стоимость рассчитывается индивидуально в зависимости от сложности и нагрузки. Получите консультацию по вашему проекту — это бесплатно. Проект реализуется под ключ с гарантией на код 3 месяца. Закажите демо, чтобы увидеть решение в действии.