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="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 одночасних стрімів. Плануйте горизонтальне масштабування.

Процес роботи

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

Строки та вартість

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