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

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Реалізація автоматичної генерації субтитрів у реальному часі (Live Captions)
Середній
від 1 дня до 3 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Реалізація автоматичної генерації субтитрів у реальному часі (Live Captions) Live Captions відображають субтитри в момент промови - для онлайн-трансляцій, відеоконференцій, публічних заходів. Ключовий параметр: затримка між виголошенням та появою субтитру (мета: <2 секунди). ### Архітектура Live Captions системи```

Microphone/Stream → WebSocket → STT → Formatter → WebSocket → Browser/Display ↓ (partial+final) 16kHz PCM 100-500ms latency ### Серверна частина з WebSocketpython 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)tsx 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}

))}
); };