Как создать голосового AI-ассистента реального времени: Whisper, ElevenLabs и WebSockets
Главная проблема большинства голосовых ассистентов — раздражающая задержка в 2-4 секунды (Walkie-Talkie эффект), из-за которой разговор ощущается неестественным. В современной архитектуре 2026 года все три компонента (распознавание речи, языковая модель и синтез голоса) работают в непрерывном параллельном потоке с задержкой первого звука менее 450 миллисекунд.

Декомпозиция задержки: Как уложиться в 500 миллисекунд
Пайплайн реального времени разбивается на три синхронные стадии:
- 1Speech-to-Text (STT): Локальный Faster-Whisper или Deepgram Nova-2 транскрибирует аудиопоток чанками по 200 мс. Задержка: ~100-150 мс.
- 2LLM Inference: Быстрая модель (Claude 3.7 или Groq Llama 3.3) выдает первые 3-5 слов ответа. Задержка первого токена: ~120 мс.
- 3Text-to-Speech (TTS): ElevenLabs Streaming API или локальная Kokoro TTS начинает синтез аудио сразу после получения первого законченного предложения. Задержка: ~150 мс.
- 4Суммарно от момента окончания реплики человека до первого звука в наушниках проходит 420-480 мс — человеческий мозг воспринимает это как живой диалог!
Обработка прерываний пользователя (Barge-In / Silero VAD)
- Если человек заговорил в тот момент, когда ассистент еще воспроизводит фразу, система должна мгновенно замолчать:
- Silero VAD анализирует входящий микрофонный поток каждые 30 мс.
- При обнаружении речи шлется управляющий пакет CANCEL, сервер останавливает генерацию LLM и сбрасывает аудиобуфер в браузере.
Асинхронный серверный пайплайн на Python
Архитектура диспетчера голосовых потоков:
import asyncio
import websockets
import json
async def voice_handler(websocket, path):
print("Клиент подключился к голосовому каналу")
try:
async for message in websocket:
if isinstance(message, bytes):
# Входящий бинарный PCM-аудиопоток с микрофона
# 1. Передаем в VAD для проверки на речь
# 2. Если есть речь, передаем в Whisper
pass
else:
data = json.loads(message)
if data.get("type") == "INTERRUPT":
# Мгновенный сброс буфера воспроизведения
await websocket.send(json.dumps({"type": "CLEAR_BUFFER"}))
except websockets.exceptions.ConnectionClosed:
print("Соединение закрыто")
start_server = websockets.serve(voice_handler, "0.0.0.0", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()Аппаратная верификация и метрики кремния
vllm serve voice-ai-assistant-whisper-elevenlabs-guide --tensor-parallel-size 4 --gpu-memory-utilization 0.95 --max-model-len 32768 --kv-cache-dtype fp8Artur Moiseyev
AI Systems Architect
Независимый AI-исследователь и архитектор распределенных систем. Разрабатываю мультиагентные системы, открытые reasoning-модели и инфраструктуру реального времени.
Связанные статьи справочника

Скилл Живого Голоса и Видеокамеры (Voice & Vision): как разговаривать с ИИ и показывать ему экран
Знаете ли вы, что в ChatGPT и Gemini можно включить живой голосовой разговор, навести камеру телефона на любой предмет или показать экран компьютера? Разбираем 7 крутых сценариев использования.

Революция генерации видео: Sora против Kling 1.5, Runway Gen-3 и Hailuo в 2026 году
Глубокое сравнение архитектур Diffusion Transformers (DiT). Оцениваем временную согласованность кадров, траектории виртуальной 3D-камеры, симуляцию физики и кинематографическое качество.

Создание мультимодальных визуальных агентов с Playwright и разметкой Set-of-Marks
Забудьте о ломающихся CSS-селекторах. Создаем агентов, которые «видят» сайт глазами человека, кликают по элементам через номера рамок и обходят капризные модалки.