中文翻译暂不可用,显示俄语原文。
Как вы строите real-time voice agent с latency <500ms?
Краткий тезис
agent|voice agent|voice Real-time agent|voice agent|voice agent с задержкой менее 500 мс строится на полностью streaming-пайплайне: ASR (Automatic Speech Recognition) → LLM (Large Language Model) → TTS (Text-to-Speech). Каждый компонент работает в режиме непрерывного потока, а транспорт организуется через WebRTC для минимизации сетевых задержек. Ключевые решения — использование лёгких моделей (faster-whisper, маленькие LLM, Piper) и аппаратных ускорителей (GPU/TPU) для инференса.
1. Архитектура real-time voice agent
Real-time voice agent — это система, которая принимает голос пользователя, распознаёт речь, обрабатывает её с помощью LLM и синтезирует ответный голос — всё это с общей задержкой менее 500 мс (обычно измеряется от конца речи пользователя до начала ответа). Такая архитектура требует сквозного streaming (end-to-end streaming), где данные передаются по частям, а не дожидаются полного ввода.
Основные компоненты:
- Streaming ASR — преобразует аудиопоток в текст по мере поступления.
- LLM — генерирует ответ, начиная обработку до завершения распознавания (используя частичный текст).
- Streaming TTS — синтезирует голос, начиная с первых токенов ответа.
- Транспорт — WebRTC для низкой задержки и адаптации к сети.
Термин «Streaming» (потоковая обработка) — данные обрабатываются по мере поступления, без ожидания полного сообщения.
2. Streaming ASR (Whisper streaming / faster-whisper)
ASR (Automatic Speech Recognition) — преобразование речи в текст. Для real-time нужна модель, способная выдавать частичные результаты (partial hypotheses) с минимальной задержкой.
Варианты
- Whisper (OpenAI) — качественная, но не streaming (требует полного аудио).
- faster-whisper — оптимизированная версия Whisper на CTranslate2, поддерживает streaming через Voice Activity Detection (VAD) и segmentation.
- DeepSpeech / Wav2Vec2 — могут быть адаптированы для streaming, но уступают по качеству.
Как работает streaming ASR
- Аудио разбивается на небольшие чанки (например, 100–300 мс).
- Модель обрабатывает каждый чанк и выдаёт частичный текст (с возможностью пересмотра при поступлении новых данных).
- Используется VAD (Voice Activity Detection) для определения границ фраз.
Пример кода (faster-whisper streaming):
from faster_whisper import WhisperModel
model = WhisperModel("base", device="cuda", compute_type="float16")
# Псевдокод для streaming
def process_audio_stream(audio_chunks):
for chunk in audio_chunks:
segments, info = model.transcribe(chunk, beam_size=1, vad_filter=True)
for segment in segments:
yield segment.text # частичный результат
Latency faster-whisper на GPU может давать задержку 100–200 мс на чанк.
3. LLM для real-time (маленькие модели, Groq)
LLM в voice agent должен быть достаточно быстрым, чтобы генерировать ответ с минимальной задержкой. Требования:
- Маленький размер (1–7B параметров) для быстрого инференса.
- Поддержка streaming (выдача токенов по мере генерации).
- Низкая задержка первого токена (TTFT — Time to First Token).
Варианты
- Llama 3.2 1B/3B — отлично подходят для простых диалогов.
- Mistral 7B — хорошее качество, но требует оптимизации (квантование, TensorRT).
- Groq — облачный сервис с аппаратными ускорителями (LPU), обеспечивающий TTFT < 10 мс и скорость > 500 токенов/с.
- Локальные модели — через llama.cpp с квантованием (Q4_K_M) на CPU/GPU.
Streaming LLM
from openai import OpenAI
client = OpenAI(base_url="https://api.groq.com/openai/v1", api_key="...")
def generate_response(partial_text):
stream = client.chat.completions.create(
model="llama-3.2-3b-preview",
messages=[{"role": "user", "content": partial_text}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
yield chunk.choices[0].delta.content
Latency Groq может давать TTFT ~10 мс, полная генерация короткого ответа (50 токенов) за 100–150 мс.
4. Streaming TTS (Piper)
TTS (Text-to-Speech) — синтез речи из текста. Для real-time нужна модель, способная выдавать аудио по мере поступления текста (без ожидания полного ответа LLM).
Piper — лёгкая нейросетевая TTS-модель (на базе VITS), работает на CPU с задержкой < 50 мс на фразу. Поддерживает streaming через chunked synthesis.
Как работает
- LLM выдаёт первые токены ответа.
- TTS начинает синтезировать аудио для этих токенов.
- По мере поступления новых токенов, TTS добавляет аудио в буфер.
- Аудио отправляется клиенту через WebRTC.
Пример (Piper):
import piper
voice = piper.load_voice("en_US-lessac-medium")
synthesizer = piper.PiperVoice(voice)
def text_to_speech_stream(text_chunks):
for chunk in text_chunks:
audio = synthesizer.synthesize(chunk)
yield audio # аудио-чанк
Latency Piper на CPU — 20–50 мс на чанк.
5. Транспорт (WebRTC)
WebRTC (Web Real-Time Communication) — протокол для передачи аудио/видео в реальном времени через браузер или нативное приложение. Обеспечивает:
- Низкую задержку (UDP, прямое соединение).
- Адаптацию к сети (FEC, jitter buffer).
- Поддержку streaming аудио и данных.
Архитектура
- Клиент (браузер/приложение) захватывает микрофон и отправляет аудио через MediaStream.
- Сервер (медиасервер, например, Janus, mediasoup или aiortc) принимает аудио, передаёт в ASR.
- После генерации ответа, TTS-аудио отправляется обратно через WebRTC.
Пример на Python (aiortc):
from aiortc import RTCPeerConnection, MediaStreamTrack
import asyncio
class AudioProcessorTrack(MediaStreamTrack):
kind = "audio"
async def recv(self):
frame = await super().recv()
# Обработка: ASR -> LLM -> TTS
return processed_frame
Latency WebRTC добавляет 10–30 мс на передачу.
6. Управление latency (буферизация, параллелизм)
Общая задержка складывается из:
- ASR latency: 100–200 мс
- LLM latency: 100–200 мс (TTFT + генерация)
- TTS latency: 50–100 мс
- Сетевая задержка: 10–50 мс
Сумма 260–550 мс. Чтобы гарантировать <500 мс, нужно:
- Параллелизм: ASR и LLM могут работать одновременно (LLM начинает обработку частичного текста до завершения ASR).
- Буферизация: минимальная, только для сглаживания джиттера.
- Квантование и аппаратное ускорение: использовать GPU/TPU для ASR и LLM, CPU для TTS.
- Выбор моделей: faster-whisper (tiny), Llama 3.2 1B, Piper (low quality).
Trade-off Качество распознавания и генерации может снижаться при использовании самых маленьких моделей. Для production часто используют каскадную архитектуру: быстрый маленький LLM для первого ответа, затем уточнение через более крупную модель (но это увеличивает latency).
7. Оценка качества (MOS, latency)
MOS (Mean Opinion Score) — субъективная оценка качества речи (1–5). Для TTS и ASR. Latency — измеряется от конца речи пользователя до начала ответа (end-to-end).
Инструменты
- WER (Word Error Rate) для ASR.
- BLEU / ROUGE для LLM (но в real-time важнее релевантность).
- Perceptual evaluation для TTS (MOS).
Пример измерения latency
import time
start = time.time()
# отправка аудио
# получение ответа
latency = time.time() - start
8. Trade-offs (качество vs скорость)
| Компонент | Быстрый вариант | Качественный вариант |
|---|---|---|
| ASR | faster-whisper tiny (latency ~100ms) | Whisper large-v3 (latency ~500ms) |
| LLM | Llama 3.2 1B (latency ~100ms) | GPT-4o (latency ~1s) |
| TTS | Piper low quality (latency ~30ms) | ElevenLabs (latency ~300ms) |
| Транспорт | WebRTC (UDP) | HTTP/2 (TCP) |
Для <500 мс приходится жертвовать качеством. В production часто используют гибрид: быстрый ASR + маленький LLM для первого ответа, затем параллельно запускают более качественную модель для уточнения (но это уже не real-time).
9. Инструменты и фреймворки
- faster-whisper — streaming ASR.
- Groq — ultra-fast LLM inference.
- Piper — лёгкий TTS.
- aiortc / mediasoup — WebRTC на Python/Node.js.
- LiveKit — готовый фреймворк для real-time voice agents (включает ASR, LLM, TTS).
- Riva (NVIDIA) — enterprise решение для real-time ASR/TTS.
Пет-проект для закрепления
Задача Создать простого voice-агента, который отвечает на вопрос "как дела?" с задержкой <500 мс.
Инструменты
- Python, faster-whisper (tiny), Groq API (Llama 3.2 3B), Piper (en_US-lessac-medium), aiortc.
Шаги:
- Настройте WebRTC сервер на aiortc, принимающий аудио от браузера.
- Реализуйте streaming ASR: разбивайте аудио на чанки по 200 мс, передавайте в faster-whisper, получайте частичный текст.
- Как только ASR выдал первую фразу (например, "how are you"), отправьте её в Groq с системным промптом "Answer briefly".
- Получайте streaming ответ от LLM, передавайте каждый токен в Piper для синтеза.
- Отправляйте аудио-чанки обратно через WebRTC.
Ожидаемый результат При произнесении "how are you" агент отвечает "I'm fine, thanks!" голосом с задержкой <500 мс.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 363 | Как вы проектируете multi-agent системы? |
| 365 | Как вы обеспечиваете отказоустойчивость voice agent? |
| 7 | Как вы уменьшаете latency RAG-системы? |
| 12 | Какие стратегии streaming вы знаете для LLM? |
| 18 | Как вы оцениваете качество TTS? |
Навигация
- Предыдущий: 363
- Следующий: 365
- Индекс: 00. Индекс разборов