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

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1564 услуг
Live Captions: реализация субтитров в реальном времени с задержкой <2 с
Средний
от 1 дня до 3 дней
Часто задаваемые вопросы

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

Этапы разработки AI-решения

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

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

Представьте: идёт онлайн-трансляция конференции с 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 месяца. Закажите демо, чтобы увидеть решение в действии.

Распознавание и синтез речи: ASR, TTS, клонирование голоса

Заказчик приходит с задачей: транскрибировать 40 000 часов колл-центра за неделю. Штатный облачный ASR (Google Speech-to-Text) выдаёт WER 28% на отраслевой лексике и стоит ощутимо дорого при таких объёмах. Задача — снизить WER ниже 10% и перейти на self-hosted инференс.

Типовые проблемы, с которыми приходят

WER не сходится к нужной метрике. Чаще всего виновата не архитектура, а данные: шумные аудио без нормализации уровня (-23 LUFS вместо стандарта), смешанные языки в одном канале, акцент, специфическая доменная лексика. Whisper large-v3 из коробки даёт WER 8–12% на чистом русском и проваливается до 25–35% на записях с PSTN-артефактами и узкополосным кодеком G.711.

Диаризация ломается при больше двух спикеров. pyannote/speaker-diarization-3.1 работает стабильно при 2–3 говорящих, но DER (Diarization Error Rate) растёт с 6% до 18–22% при 5+ участниках конференции. Проблема усугубляется перекрёстными репликами: по умолчанию min_duration_on=0.1 срезает короткие вставки.

Клонирование голоса — латентность или качество. XTTS v2 (Coqui) даёт натуральный голос, но при потоковой генерации stream_chunk_size=20 первый аудиочанк прилетает через 1.4–2.0 с — неприемлемо для интерактивных сценариев. StyleTTS2 и Kokoro быстрее, но требуют точной подготовки референсного аудио.

Как это решается на практике

Базовый стек для production-пайплайна:

  • ASR: openai/whisper-large-v3 или faster-whisper (CTranslate2-бэкенд, x4 скорость vs оригинал)
  • Диаризация: pyannote.audio 3.x + интеграция через whisperx для выравнивания по словам
  • TTS: XTTS v2 для качества, Edge-TTS или Silero для низкой латентности
  • Клонирование: XTTS v2 (3–6 с референсного аудио) или OpenVoice v2

Типичный пайплайн для колл-центра выглядит так: аудио из очереди Kafka → нормализация ffmpeg -af loudnorm до -23 LUFS → faster-whisper с beam_size=5, vad_filter=Truepyannote диаризация → постпроцессинг (пунктуация через deepmultilingualpunctuation) → запись в PostgreSQL с временными метками.

Кейс из практики. Финтех-компания с 12 000 звонков/день. Исходный WER на русском с банковской лексикой — 22% (Google STT). После fine-tuning whisper-medium на 200 часах размеченных записей через Hugging Face transformers + Seq2SeqTrainer с learning_rate=1e-5, warmup_steps=500 — WER упал до 7.3%. Инференс на одной A10G через faster-whisper с compute_type=float16 обрабатывает 40-минутный звонок за 55 секунд. Итоговая стоимость инференса — $0.0008/мин против $0.016/мин у облачного провайдера.

Дообучение Whisper на доменных данных

Когда общая модель не справляется, fine-tuning — первый инструмент. Минимальный датасет для заметного улучшения — 20–30 часов размеченного аудио в целевом домене. Разметку можно получить через итеративный процесс: прогнать через базовую модель → вручную исправить 10–15% ошибок → переобучить → повторить.

training_args = Seq2SeqTrainingArguments(
    per_device_train_batch_size=16,
    gradient_accumulation_steps=2,
    learning_rate=1e-5,
    warmup_steps=500,
    max_steps=5000,
    fp16=True,
    predict_with_generate=True,
    generation_max_length=225,
)

Важно: при fine-tuning Whisper нужно замораживать encoder первые 1000 шагов (model.freeze_encoder()), иначе акустические признаки разъедутся раньше, чем decoder адаптируется к новой лексике.

Синтез речи: выбор под задачу

Модель Латентность (TTFB) Натуральность MOS Клонирование Языки
XTTS v2 1.2–2.0 с 4.1–4.3 Да, 3 с референса 17
StyleTTS2 0.3–0.6 с 4.0–4.2 Да, требует адаптации en, + fine-tune
Kokoro-82M 0.08–0.15 с 3.7–3.9 Нет en, ja
Silero TTS 0.05–0.1 с 3.4–3.6 Нет ru, en, de, и др.
Edge-TTS ~0.4 с (cloud) 4.0 Нет 100+

Для интерактивных ботов с требованием TTFB < 300 мс — Silero или Kokoro. Для озвучки контента, где важна натуральность — XTTS v2 с потоковой отдачей через WebSocket.

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

Начинаем с аудит-сессии: берём 2–4 часа ваших записей, прогоняем через несколько моделей, замеряем WER/CER, смотрим на распределение ошибок по типам (лексические, акустические, язык). Это занимает 1–2 дня и сразу показывает, нужен ли fine-tuning или достаточно пост-обработки.

Далее — выбор архитектуры под ваш throughput: один GPU для 1000 мин/день или кластер с балансировщиком для 100 000+ мин/день. Деплой через Docker-контейнер с FastAPI или Triton Inference Server для батчированного инференса.

Сроки зависят от сложности: базовая интеграция готовой модели — 1–2 недели. Fine-tuning с подготовкой данных и валидацией — 4–8 недель. Полная разработка голосового пайплайна (ASR + диаризация + TTS + мониторинг) — 2–4 месяца.