Модуль v.2 · Урок 3
Конвейер против realtime: когда что выбирать
Содержание
- Чему вы научитесь
- Две архитектуры, один вопрос
- Критерии выбора
- Дерево решений
- Три уровня речевых архитектур и гибрид Thinker-Talker
- Гибрид: лучшее из двух миров
- На чём собирать: фреймворки оркестрации
- Практикум: отказоустойчивый агент на LiveKit с умным определением пауз и резервированием
- Если собираете конвейер с нуля: 9 шагов и 5 неочевидных граблей
- Как не ошибиться
- Следующий урок
Чему вы научитесь
- Сводить выбор архитектуры к нескольким понятным критериям
- Понимать, когда конвейер выигрывает у realtime и наоборот
- Пользоваться деревом решений для своего сценария
- Видеть гибридные варианты между двумя крайностями
- Знать готовые фреймворки оркестрации (LiveKit Agents, Pipecat, TEN)
- Связывать выбор с приватностью и доступностью в РФ
Две архитектуры, один вопрос
В уроке v.0/02 мы развели два подхода: классический конвейер (VAD, STT, LLM, TTS отдельными звеньями) и единую speech-to-speech модель. Теперь решаем, что выбрать под задачу.
Спойлер: универсального ответа нет. Но есть несколько критериев, которые почти всегда дают однозначный ответ для конкретного сценария.
Критерии выбора
| Критерий | Склоняет к конвейеру | Склоняет к realtime |
|---|---|---|
| Естественность диалога | Достаточно деловой | Нужны паузы, интонация, эмоции |
| Контроль над звеньями | Хочу менять STT/LLM/TTS отдельно | Готов взять готовый стек вендора |
| Цена при объёме | Нужна экономия на масштабе | Готов платить за простоту |
| Приватность и данные | Данные нельзя в облако | Облако приемлемо |
| Язык и локализация | Нужен особый STT/TTS | Хватает того, что даёт вендор |
| Скорость запуска | Есть время на сборку | Нужно быстро |
Если большинство галочек слева — берите конвейер. Если справа — единую realtime-модель.
Дерево решений
flowchart TD
A{Нужна максимальная естественность?} -->|Да| B{Облако и привязка к вендору ок?}
A -->|Нет| C{Данные можно отдавать в облако?}
B -->|Да| R[Единая realtime-модель]
B -->|Нет| P[Конвейер с локальными STT/TTS]
C -->|Да| D{Важна цена на большом объёме?}
C -->|Нет| P
D -->|Да| P
D -->|Нет| R
Дерево упрощает реальность, но задаёт правильный порядок вопросов: сначала естественность, потом приватность, потом цена.
Три уровня речевых архитектур и гибрид Thinker-Talker
В открытом исследовании и 9-главном практикуме Salesforce AI Research Building Enterprise Realtime Voice Agents from Scratch (arXiv:2603.05413) все современные речевые системы делят на три архитектурных уровня в зависимости от того, насколько нативно они работают со звуком:
- Уровень 1 — чистые речевые модели (Native Speech-to-Speech): модель «думает» звуковыми токенами без обязательного текстового слоя. Главный открытый представитель —
Moshi(7B параметров, полнодуплексный режим, задержка около 200 мс на GPU NVIDIA L4). Архитектурно это самый быстрый вариант, но у таких моделей слабее логическое рассуждение и нет надёжного вызова внешних функций (function calling), без которого бизнес-агент не запишет клиента к врачу и не проверит статус заказа. - Уровень 2 — текстовая LLM с нативным аудиовходом и аудиовыходом (Thinker-Talker): языковая модель объединена с аудиоэнкодером и декодером речи. Мышление идёт в текстовом пространстве (
Thinker), а синтез речи — в встроенном речевом декодере (Talker). Сюда входятQwen3-Omni(30B параметров MoE, всего 3B активных на токен),Qwen2.5-Omni(7B),GLM-4-Voice(9B),Kimi-Audio(7B) иStep-Audio(130B). При этомQwen3-Omniстала первой открытой моделью второго уровня с нативной поддержкой вызова инструментов через XML-теги<tool_call>. - Уровень 3 — каскадный потоковый конвейер (
STT → LLM → TTS): отдельные специализированные модели распознавания, генерации текста и синтеза, связанные потоковой передачей.
Инженеры Salesforce AI Research замерили реальную задержку до первого звука (TTFA — Time-to-First-Audio) на одной видеокарте NVIDIA H200 и в облаке (arXiv:2603.05413, таблицы 3–5):
| Конфигурация | Задержка до первого звука (TTFA) | Вызов функций (Tools) | Полный self-host | В чём инженерный нюанс |
|---|---|---|---|---|
Qwen2.5-Omni-7B (попредложенческий стрим) | ~13 200 мс (RTF 1,94×) | Нет | Да | Диффузионный декодер Talker генерирует 1 с звука почти 2 с — для живого звонка не годится |
Qwen3-Omni-30B-A3B (локально через Transformers) | ~145 694 мс (4,6 ток/с) | Да | Да | Бэкенд HuggingFace Transformers в 36 раз медленнее vLLM на MoE-архитектуре |
Qwen3-Omni в облаке (DashScope Realtime API) | ~702 мс (лучший 685 мс) | Частично | Нет | Быстрый стриминг за счёт проприетарного сервера аудиодекодера в облаке Alibaba |
Двухшаговый гибрид: Qwen3-Omni Thinker (vLLM) + внешний TTS | ~736 мс (516 мс + 220 мс) | Да | Да (с локальным TTS) | Модуль Thinker на vLLM 0.13+ выдаёт 168 ток/с напрямую из звука и убирает отдельное звено STT |
Каскадный конвейер (Deepgram Nova-3 + vLLM Qwen2.5-7B + ElevenLabs) | ~755 мс (лучший 729 мс) | Да | Да | Полный контроль над каждым звеном, предсказуемый function calling |
Отсюда главный практический вывод на 2026 год: пока для речевого декодера Talker в Qwen3-Omni нет открытого быстрого сервера уровня vLLM, для полностью локального (self-hosted) корпоративного агента с вызовом функций выбор стоит между классическим трёхшаговым конвейером (STT → LLM → TTS, ~755 мс) и двухшаговым гибридом (Qwen3-Omni Thinker на vLLM → быстрый TTS, ~736 мс), где мультимодальная модель слушает голос напрямую без отдельного STT.
Гибрид: лучшее из двух миров
В коммерческих проектах границы между подходами размываются ещё сильнее:
- Двухшаговый конвейер (Audio-LLM + TTS). Вместо связки
STT + LLMзвук подаётся сразу в мультимодальную модель (Qwen3-Omni Thinkerна локальном vLLM за 516 мс или облачный Gemini Flash), а текстовый поток озвучивается быстрым кастомным TTS с клонированным голосом бренда. - Realtime для разговора, конвейерные инструменты вокруг. Speech-to-speech ведёт диалог, а транскрипцию, аналитику и запись делают отдельные сервисы.
- Разные сценарии — разные архитектуры. Простой FAQ-агент на дешёвом конвейере, сложные продажи — на realtime.
На чём собирать: фреймворки оркестрации
Собирать конвейер или гибрид с нуля не нужно — есть зрелые open-source фреймворки, которые скрепляют звенья (VAD, STT, LLM, TTS или realtime-модель), добавляют телефонию, прерывания и управление сессией:
- LiveKit Agents (github) — самый популярный фреймворк на WebRTC-транспорте; включает встроенный аудиодетектор конца реплики (
TurnDetector), подавление фоновых голосов (BVC), декоратор@function_toolи адаптеры отказоустойчивости (FallbackAdapter). - Pipecat от Daily (github) — гибкий фрейм-ориентированный конвейер с 68+ интеграциями, где процессор
SentenceAggregatorавтоматически режет поток токенов LLM на предложения перед отправкой в TTS. - TEN — модульный open-source фреймворк для мультимодальных и речевых агентов.
По замерам Hamming AI на 4 млн звонков готовые фреймворки дают end-to-end задержку порядка 750–950 мс (требует проверки под вашу нагрузку).
Практикум: отказоустойчивый агент на LiveKit с умным определением пауз и резервированием
В реальном продакшене у голосового конвейера две главные беды: агент перебивает задумавшегося клиента на середине фразы, а при минутном сбое или лимите (Rate Limit) у провайдера STT/LLM/TTS звонок обрывается тишиной.
Ниже — рабочий паттерн боевого агента (адаптированный из практических курсов LiveKit & DeepLearning.AI и livekit-voice-agent-course-yt), который решает обе проблемы сразу:
FallbackAdapterна каждом звене (STT, LLM, TTS): если основной провайдер вернул ошибку или не ответил вовремя, сессия на лету без обрыва звонка переключается на резервную модель.- Семантический детектор конца реплики (
TurnDetector/MultilingualModel): слушает интонацию и смысл поверх Silero VAD, чтобы не перебивать человека на паузах «сейчас вспомню…». - Подавление фоновых голосов (
noise_cancellation.BVC()): отсекает голоса коллег в офисе, телевизор на фоне и эхо динамика, чтобы они не вызывали ложныйbarge-in.
Отказоустойчивый голосовой агент на LiveKit Agents с FallbackAdapter и TurnDetector
Если собираете конвейер с нуля: 9 шагов и 5 неочевидных граблей
Когда вам нужен полный контроль без внешних фреймворков (например, под закрытый контур компании), архитектура самописного потокового агента складывается из девяти последовательных модулей (руководство Salesforce AI Research, arXiv:2603.05413):
- Потоковый STT (
deepgram_streaming.pyили локальный ASR): постоянный WebSocket, куда микрофон шлёт 20-миллисекундные чанки звука (PCM int16, 16 кГц, моно — ровно 640 байт на чанк). Промежуточные результаты (is_final=False) показываем в интерфейсе, но в LLM отправляем только финальные (is_final=True). - Потоковая LLM с вызовом функций (
vllm_function_calling.py): локальный серверvLLMс OpenAI-совместимым/v1/chat/completionsиstream=True(P50 до первого токена — 337 мс наQwen2.5-7B-Instruct). - Потоковый TTS (
elevenlabs_streaming.py/ локальныйOrpheus TTSилиCosyVoice): вызов потокового методаstream(), отдающего первые байты аудио за 200–220 мс (в 10–20 раз быстрее реального времени). - Буфер предложений (
sentence_buffer.py): склейка токенов LLM до точки/вопроса (минимум 10 символов, фильтр сокращений) и параллельная отправка первого предложения в TTS, пока LLM генерирует следующие. - Двунаправленный WebSocket-сервер (
server.pyна FastAPI): бинарные фреймы16 кГц PCMот клиента к серверу, бинарные фреймы24 кГц PCMот сервера к клиенту плюс управляющие JSON-сообщения (transcript,agent_speaking,agent_done). - Конечный автомат VAD (
vad_basics.pyна Silero VAD): отслеживание переходовIDLE → LISTENING → PROCESSING → SPEAKINGи мгновенный сброс очереди воспроизведения при перебивании (INTERRUPTED). - Браузерный клиент на
AudioWorklet(app.js): захват микрофона на частоте браузера с нарезкой по 20 мс в отдельном аудиопотоке (без блокировки UI), воспроизведение через очередь с линейной интерполяцией частоты и серверныйecho gate(приглушение входа микрофона, пока говорит агент). - Рекурсивный цикл инструментов (
agent.py,tools.py): если LLM вместо текста вернулаtool_calls(например,check_availability→schedule_appointment), агент выполняет цепочку функций, добавляет ответы в историю и повторно вызывает LLM до получения финального текста для озвучки. - Сквозной бенчмарк (
benchmark.py): замер P50/Min/Max по каждому звену отдельно и в перекрывающемся потоке.
Как не ошибиться
Главная ошибка — выбирать архитектуру по моде, а не по сценарию. «Все берут realtime, возьму и я» приводит к привязке к вендору там, где хватило бы дешёвого конвейера, и наоборот.
Сделайте проще: пройдите дерево решений с реальными ответами про свой бизнес. В большинстве случаев оно даст ясный ответ за минуту.
Следующий урок
SIP, WebRTC и PSTN: как звонок доходит до агента — разберём транспортный слой телефонии.