Представьте: идёт онлайн-трансляция конференции с 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 одновременных стримов. Планируйте горизонтальное масштабирование.
Процесс работы
- Аналитика: обсуждаем требования, пиковая нагрузка, устройства клиентов.
- Проектирование: выбираем модель, вектор оптимизации, схему масштабирования.
- Реализация: пишем сервер и клиент, интегрируем с вашей инфраструктурой.
- Тестирование: нагрузочные тесты с реальным аудио, замер latency.
- Деплой: разворачиваем на ваших серверах или в облаке, настраиваем мониторинг.
- Обучение: передаём документацию, проводим демо.
Сроки и стоимость
Базовый сервер Live Captions занимает 3–5 дней. Полная интеграция с fine-tuning, OBS и мониторингом — около 2 недель. Стоимость рассчитывается индивидуально в зависимости от сложности и нагрузки. Получите консультацию по вашему проекту — это бесплатно. Проект реализуется под ключ с гарантией на код 3 месяца. Закажите демо, чтобы увидеть решение в действии.







