
Потоковое распознавание в реальном времени с Whisper: руководство по низкой задержке (2026)
Eric King
Author
Потоковое распознавание с Whisper в реальном времени: руководство по низкой задержке
OpenAI Whisper — это открытая модель распознавания речи с высокой точностью и поддержкой множества языков. Хотя Whisper изначально не проектировалась как потоковая система, при правильной архитектуре вы можете построить низкозадержочные системы распознавания речи в реальном времени — идеальные для живых субтитров, транскрипции встреч, стримов и голосовых ассистентов.
В этом руководстве мы рассмотрим, как заставить Whisper работать в реальном времени: архитектуру, приёмы, компромиссы и примерный код.
Почему потоковый режим сложен
Классический Whisper обрабатывает завершённые аудиосегменты, а не непрерывный поток. Основные сложности:
- Инкрементальное декодирование — работа с частичными фрагментами аудио
- Низкая задержка — быстрый вывод результата
- Артефакты на границах чанков
- Баланс загрузки GPU и отзывчивости
Чтобы с этим справиться, используют скользящее окно с перекрытием и инкрементальный буфер.
Обзор архитектуры
Потоковая работа в реальном времени с Whisper обычно включает такие компоненты:
Audio Source → Audio Buffer → Segmenter → Whisper Inference → Post-processing → Consumer
- Audio Source — микрофон / браузер / телефония
- Segmenter — создаёт перекрывающиеся чанки
- Whisper Inference — модели на GPU/CPU
- Post-processing — объединяет текст и временные метки
Сегментация для низкой задержки
Вы непрерывно получаете аудио от клиента. Чтобы не отправлять на модель слишком длинные фрагменты:
- Длина окна: 1–5 секунд
- Перекрытие: 0,5–1 секунда
- Размер буфера: зависит от целевой задержки
Меньшее окно даёт меньшую задержку, но больший накладной расход.
Выбор моделей для потоковой работы
| Model | VRAM | Latency | Accuracy |
|---|---|---|---|
| tiny | 1–2 GB | ⭐⭐⭐⭐ | ❌ |
| base | 2–4 GB | ⭐⭐⭐ | ⭐⭐ |
| small | 4–8 GB | ⭐⭐ | ⭐⭐⭐ |
| medium | 8–12 GB+ | ⭐ | ⭐⭐⭐⭐ |
Лучший баланс для потоковой работы:
base или smallБазовый потоковый конвейер (псевдокод)
import whisper
import sounddevice as sd
import numpy as np
model = whisper.load_model("small").to("cuda")
BUFFER = []
WINDOW = 3 # seconds
OVERLAP = 1 # seconds
RATE = 16000
def callback(indata, frames, time, status):
global BUFFER
BUFFER.extend(indata.flatten().tolist())
# When buffer length > window, process
if len(BUFFER) >= RATE * WINDOW:
segment = BUFFER[:RATE * WINDOW]
BUFFER = BUFFER[int(RATE * (WINDOW - OVERLAP)):]
audio = np.array(segment)
result = model.transcribe(audio, fp16=True)
print("--- partial →", result["text"])
Этот цикл непрерывно выводит частичные транскрипции, переиспользуя перекрывающиеся фрагменты.
Обработка перекрытий и склейка текста
Перекрытие уменьшает количество потерянных слов на границах.
Например:
Сегменты:
- 0–3 с
- 2–5 с
- 4–7 с
Далее:
- Удаляем дубликаты текста в зоне перекрытия
- Корректируем временные метки
- Формируем непрерывный поток текста
Работа в реальном времени в браузере
Вы можете передавать аудио из браузера с помощью WebRTC или Web Audio API:
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const processor = audioContext.createScriptProcessor(4096, 1, 1);
source.connect(processor);
processor.connect(audioContext.destination);
processor.onaudioprocess = (e) => {
const chunk = e.inputBuffer.getChannelData(0);
sendToServer(chunk); // WebSocket/Socket.io
};
Паттерны развёртывания
☁️ Бессерверное окружение (облако)
- Клиенты отправляют аудио через WebSocket
- AWS Lambda (для короткого аудио) / GPU‑сервер
- Whisper, запущенный на GPU‑инстансе
- Масштабирование через авто‑масштабирование
🖥️ Выделенный GPU‑сервер
- Постоянно доступный GPU
- Более низкая задержка
- Лучший вариант для сервисов 24/7
🌀 Гибридный вариант
- На краю захватывается аудио + небольшой моделью выполняется предфильтрация
- Полная транскрипция выполняется на GPU‑сервере
Снижение задержки
🟡 1. Используйте меньшие размеры окна
Меньше батчей → быстрее частичные результаты
🔵 2. Перекрывайте буферы
Меньше потерянных слов
🟢 3. Используйте FP16 / BF16
Более быстрая инференс‑фаза
🔴 4. Батчируйте нескольких пользователей
Если сервер обрабатывает много потоков, батчирование увеличивает пропускную способность
Мониторинг и метрики
Отслеживайте:
- Задержку на сегмент
- Word error rate (WER)
- Загрузку GPU
- Разницу между частичными и финальными результатами
Используйте Prometheus / Grafana для дашбордов.
Компромиссы
| Goal | Tradeoff |
|---|---|
| Low latency | Lower context → less accuracy |
| High accuracy | Larger windows → higher latency |
| Small model | Faster, less accurate |
| Big model | Slower, more accurate |
Примеры сценариев использования
- Живые субтитры для стримов
- Транскрипция встреч или занятий
- Интерактивные голосовые приложения
- Сервисы для конференций и вебинаров
Заключение
Потоковое распознавание речи с Whisper в реальном времени вполне реально — но вам нужно найти баланс между:
- Размером окна
- Перекрытием
- Размером модели
- Производительностью железа
При правильном дизайне вы можете достичь низкой задержки и высокой точности транскрипции, пригодной для продакшн‑систем.
