Уявіть: йде онлайн-трансляція конференції з 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="uk")
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 місяці. Замовте демо, щоб побачити рішення в дії.







