Голосовой диалог по цепочке микрофон → распознавание (STT) → ответ модели (LLM) → синтез речи (TTS). Серверный STT — Whisper.cpp small на VPS, TTS — edge-tts с русскими голосами. Альтернативный STT — Web Speech API прямо в браузере: мгновенный, но требует Chrome/Edge.
Как это работает
Простая идея. Чтобы поговорить с ИИ голосом, нужно три ремесла подряд: услышать слова (распознавание), подумать (модель), и сказать в ответ (синтез голоса). Здесь все три работают бесплатно: распознавание идёт либо в самом браузере, либо на VPS через Whisper.cpp; ответ генерирует free-модель из OpenRouter; озвучивает ответ edge-tts — обычный CLI с русскими голосами Microsoft, без авторизации.
По шагам
- Браузер просит доступ к микрофону. Если выбран маршрут в браузере, Web Speech API сразу распознаёт речь по мере произнесения — текст появляется почти без задержки. Если на сервере — звук пишется в формат WebM/Opus и отправляется multipart-загрузкой на
/api/agents/voice/transcribe. - На VPS
ffmpegпереводит запись в 16 kHz mono PCM WAV (единственный формат, который Whisper.cpp понимает), затемwhisper-cliс модельюggml-small.bin(~488 MB) расшифровывает и возвращает текст. Real-time factor на 4-ядерном CPU — около ×1.5 от длительности записи: 10 секунд речи → ~15 секунд ожидания. - Распознанный текст уходит в
POST /api/agents/voice/turnвместе с короткой историей. Free-модель отвечает 1–3 предложениями без markdown — потому что текст пойдёт в синтез речи. - Ответ модели уходит в
POST /api/agents/voice/ttsс выбранным голосом. На VPS запускаетсяedge-ttsв Python venv: он обращается к публичному синтезатору Microsoft, получает MP3 и стримит его обратно. Браузер сразу проигрывает аудио. - Под кнопкой видны три таймера: STT, LLM, TTS — и общий итог. Любая ошибка цепочки пишется в общий
audit.jsonlс длительностью аудио, длиной текста и моделью; содержание реплик не сохраняется, только хэши и метрики.
Стек и ограничения
Стек. Whisper.cpp small (488 MB, 4 потока, beam=1) на VPS; edge-tts v7 в Python-venv; ffmpeg 6.1 для перекодирования; free-LLM из OpenRouter с primary→fallback. На фронте — MediaRecorder + Web Speech API. Все компоненты — open-source или бесплатные публичные API без авторизации.
Что важно знать
- Web Speech API работает в Chromium-браузерах (Chrome, Edge, Opera). В Firefox и Safari — частично или не работает; маршрут переключится на серверный.
- Whisper.cpp на CPU обрабатывает 10 секунд речи примерно за 15 секунд. Длинные реплики (более 60 секунд) обрубаются на бэкенде заранее.
- edge-tts использует онлайн-сервис Microsoft без формального SLA — это известный риск free-стека. Запасной план —
piper-tts, полностью оффлайн open-source TTS, чуть хуже качество (зафиксировано в roadmap). - Это не телефонный канал. Голосовой колл-центр требует SIP-интеграции (Asterisk/FreePBX), серверного VAD/AEC и эхоподавления. Здесь — браузерная цепочка для портфолио и демо.
- Содержимое реплик не хранится. В
audit.jsonlуходит только sha256 от аудиофайла, длительность, модель и латентности.