中文翻译暂不可用,显示俄语原文。

Как вы строите 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) с минимальной задержкой.

Варианты

Как работает streaming ASR

  1. Аудио разбивается на небольшие чанки (например, 100–300 мс).
  2. Модель обрабатывает каждый чанк и выдаёт частичный текст (с возможностью пересмотра при поступлении новых данных).
  3. Используется 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 (выдача токенов по мере генерации).
  • Низкая задержка первого токена (TTFTTime 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.

Как работает

  1. LLM выдаёт первые токены ответа.
  2. TTS начинает синтезировать аудио для этих токенов.
  3. По мере поступления новых токенов, TTS добавляет аудио в буфер.
  4. Аудио отправляется клиенту через 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 скорость)

КомпонентБыстрый вариантКачественный вариант
ASRfaster-whisper tiny (latency ~100ms)Whisper large-v3 (latency ~500ms)
LLMLlama 3.2 1B (latency ~100ms)GPT-4o (latency ~1s)
TTSPiper low quality (latency ~30ms)ElevenLabs (latency ~300ms)
ТранспортWebRTC (UDP)HTTP/2 (TCP)

Для <500 мс приходится жертвовать качеством. В production часто используют гибрид: быстрый ASR + маленький LLM для первого ответа, затем параллельно запускают более качественную модель для уточнения (но это уже не real-time).


9. Инструменты и фреймворки


Пет-проект для закрепления

Задача Создать простого voice-агента, который отвечает на вопрос "как дела?" с задержкой <500 мс.

Инструменты

Шаги:

  1. Настройте WebRTC сервер на aiortc, принимающий аудио от браузера.
  2. Реализуйте streaming ASR: разбивайте аудио на чанки по 200 мс, передавайте в faster-whisper, получайте частичный текст.
  3. Как только ASR выдал первую фразу (например, "how are you"), отправьте её в Groq с системным промптом "Answer briefly".
  4. Получайте streaming ответ от LLM, передавайте каждый токен в Piper для синтеза.
  5. Отправляйте аудио-чанки обратно через WebRTC.

Ожидаемый результат При произнесении "how are you" агент отвечает "I'm fine, thanks!" голосом с задержкой <500 мс.


Связь с другими вопросами

ВопросТема
363Как вы проектируете multi-agent системы?
365Как вы обеспечиваете отказоустойчивость voice agent?
7Как вы уменьшаете latency RAG-системы?
12Какие стратегии streaming вы знаете для LLM?
18Как вы оцениваете качество TTS?

Навигация