Реализация автоматической генерации субтитров в реальном времени (Live Captions)

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Реализация автоматической генерации субтитров в реальном времени (Live Captions)
Средняя
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1238
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1167
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    867
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1080
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    829

Реализация автоматической генерации субтитров в реальном времени (Live Captions)

Live Captions отображают субтитры в момент произнесения речи — для онлайн-трансляций, видеоконференций, публичных мероприятий. Ключевой параметр: задержка между произнесением и появлением субтитра (цель: <2 секунды).

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

Microphone/Stream → WebSocket → STT → Formatter → WebSocket → Browser/Display
      ↓                              (partial+final)
   16kHz PCM                     100-500ms latency

Серверная часть с 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>
  );
};

Интеграция с OBS/трансляциями

OBS WebSocket plugin позволяет отправлять субтитры прямо в поток. Альтернатива — NDI overlay или веб-плеер с WebSocket субтитрами поверх HLS.

Сроки: базовый live captions сервер — 3–5 дней. Интегрированная система для трансляций — 2 недели.