Мы сталкивались с задачей: call-центр на 50 операторов, нужно субтитры в реальном времени для супервайзера. Batch STT давал задержку 5 секунд — пропускал важные моменты диалога. На живых субтитрах конференции задержка в 2 секунды уже неприемлема, а в голосовом ассистенте каждый лишний миллисекунд ухудшает UX. Решение — streaming STT с частичными результатами через WebSocket. За 5 лет мы выстроили архитектуру, которая держит latency 100-500 мс при любых нагрузках.
Какие проблемы решает streaming STT?
- Задержка: Без частичных результатов пользователь ждёт окончания фразы. Streaming выдаёт предварительную транскрипцию каждые 200-400 мс. Для call-центра это означает возможность мгновенной реакции — супервайзер видит текст через 200 мс после произнесения.
- Паузы и наложения: VAD + endpointing корректно обрабатывают тишину и overlapping speech. Настройка aggressiveness=2 отсекает 90% пауз без потери смысла.
- Точность в реальном времени: Модели с низкой latency (Deepgram Nova-2) показывают WER <5% даже при 200 мс. Стоимость Deepgram Nova-2 составляет $0.0043/мин, что на 40% дешевле Google STT.
Как мы строим streaming pipeline?
Типичная архитектура, которую мы запускали в production:
Microphone → WebSocket (WSS) → FastAPI → STT Engine → NLP → Response
Ключевые компоненты реализованы на Python с асинхронными сокетами.
WebSocket сервер на FastAPI
from fastapi import FastAPI, WebSocket
from faster_whisper import WhisperModel
import numpy as np
import asyncio
app = FastAPI()
model = WhisperModel("medium", device="cuda", compute_type="float16")
@app.websocket("/stream")
async def stream_stt(websocket: WebSocket):
await websocket.accept()
audio_buffer = bytearray()
try:
while True:
chunk = await websocket.receive_bytes()
audio_buffer.extend(chunk)
if len(audio_buffer) >= 32000 * 2: # 2 sec @ 16kHz 16-bit
audio_array = np.frombuffer(audio_buffer, dtype=np.int16).astype(np.float32) / 32768.0
segments, _ = model.transcribe(audio_array, language="ru")
partial_text = " ".join([s.text for s in segments])
await websocket.send_json({"type": "partial", "text": partial_text})
audio_buffer = bytearray()
except Exception:
await websocket.close()
VAD (Voice Activity Detection)
VAD подключаем до накопления буфера: отсекаем тишину, уменьшая количество транскрипций.
import webrtcvad
vad = webrtcvad.Vad(2)
def is_speech(audio_chunk: bytes, sample_rate: int = 16000) -> bool:
return vad.is_speech(audio_chunk, sample_rate)
Для endpointing держим скользящее окно тишины 500-800 мс.
Настройка WebRTC VAD
`aggressiveness=2` даёт наилучший баланс чувствительности и ложно-положительных срабатываний. При меньших значениях пропускается больше речи, при больших — растёт число ложных отсечек.Клиентская часть
const socket = new WebSocket('wss://api.example.com/stream');
const mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(mediaStream, { mimeType: 'audio/webm;codecs=opus' });
recorder.ondataavailable = (event) => {
if (socket.readyState === WebSocket.OPEN) socket.send(event.data);
};
recorder.start(250); // 250ms chunks
Почему VAD критичен для streaming?
Без VAD движок обрабатывает весь аудиопоток, включая тишину. Это увеличивает токенную стоимость и задержку. На практике мы видели рост latency p99 на 30% при отсутствии предварительного VAD.
Как выбрать STT движок?
Выбор между облаком и self-hosted зависит от нагрузки, требований к конфиденциальности и бюджета. Согласно официальной документации Deepgram, Nova-2 имеет latency 180 мс при p95.
| Движок | Latency p95 | Поддерживаемые языки | Стоимость |
|---|---|---|---|
| Deepgram Nova-2 | 180 мс | 30+ | $0.0043/мин |
| Google STT Streaming | 250 мс | 125+ | $0.006/мин |
| Azure Speech | 280 мс | 100+ | $0.01/мин |
| faster-whisper (self) | 350 мс | 99 | ~$0.001/мин |
| Vosk (self, CPU) | 500 мс | 20+ | ~$0/мин |
Self-hosted решения экономят до 80% при объёмах >1000 часов в месяц. Например, faster-whisper на GPU обходится около $0.001/мин. Для мультиязычных проектов Google и Azure предпочтительнее из-за широты покрытия.
Как обеспечить latency p99 < 400 мс?
Ключевые факторы: выбор движка с низкой latency, оптимизация VAD и настройка буферизации. Для self-hosted используем faster-whisper с CUDA и INT8-квантизацию — это снижает latency на 30% без потери точности. Плюс предварительная сегментация аудио через VAD, чтобы не транскрибировать тишину.
Какие метрики мониторить?
- p99 latency — не более 400 мс для self-hosted, 300 мс для облачных решений.
- CPU/GPU utilization — чтобы избежать перегрузки под пиковой нагрузкой.
- WER (Word Error Rate) — отслеживаем на семпловой выборке.
- Количество активных сессий — важно для auto-scaling.
Процесс реализации под ключ
- Анализ: Определяем язык, количество спикеров, ожидаемый RPS, требования к endpointing.
- Проектирование: Строим диаграмму потоков, выбираем движок, VAD и метод диспетчеризации.
- Разработка: Кодим WebSocket сервер, интегрируем STT, настраиваем auto-scaling.
- Тестирование: Генерируем синтетические RTP потоки, измеряем latency p99, утечки памяти.
- Деплой: Разворачиваем в k8s с помощью Helm, подключаем мониторинг (Prometheus + Grafana).
- Передача: Документация, обучение команды, кодовая база с комментариями.
Что входит в работу
- Архитектурная схема и обоснование выбора
- Репозиторий с Docker-контейнерами и Helm-чартом
- API документация (OpenAPI)
- Интеграция с клиентскими SDK (Web, iOS, Android — опционально)
- План тестирования под нагрузкой
- Поддержка 1 месяц
Сроки и стоимость
| Этап | Срок |
|---|---|
| Базовый WebSocket стример | 3–4 дня |
| Self-hosted с VAD/endpointing | 1 неделя |
| Полный pipeline | 2 недели |
| Полный pipeline + клиентские SDK | 2–4 недели |
Стоимость рассчитывается индивидуально под задачу. Получите оценку проекта — напишите нам.
Наш опыт
Мы внедрили streaming STT для 10+ проектов: от call-центров до живых субтитров. Наш опыт включает интеграцию с глубоким фреймворком диалогов и настройку под высокую нагрузку (до 1000 одновременных сессий). Гарантируем latency p99 < 400 мс для self-hosted решений на базе NVIDIA A10G. Сертифицированы по CUDA (NVIDIA).
Готовы реализовать streaming STT под ключ. Свяжитесь для консультации — обсудим вашу задачу и подберём оптимальную архитектуру.







