voiceloop: голосовой агент в браузере, три скорости и один цикл

Три вилки у голосового агента во вкладке: демо без ключей, облачное распознавание речи под заявленные сотни миллисекунд или стек уровня Pipecat / Realtime / ConvAI с воспроизводимым замером. Соло без отдельного бэкенда выигрывает от честной развилки скорости и эха, а не от слова «fastest» в тайтле. В LINK:анонсе todoforai открыл voiceloop под MIT и вынес в npm пакет @todoforai/voiceloop с заявлением «zero dependencies»; проверять имеет смысл на своём совместимом с OpenAI endpoint для модели, а не по обещанию в заголовке.
Агентный цикл целиком в JavaScript-вкладке
voiceloop не обёртка над одним API, а полный контур VAD → STT → LLM → TTS в браузере. Перебивание агента заявлено по новым словам в транскрипте (barge-in), а не по энергии микрофона; фильтрация собственного эха сравнивает слышимое с тем, что агент только что произнёс. Ходы идут по очереди, без параллельных наложений. Локально в табе могут работать Silero VAD и Piper TTS как WASM: часть контура не уходит в облако на каждом шаге.
Плагины подключают совместимый с OpenAI LLM, STT (Web Speech, ElevenLabs Scribe, Deepgram Flux, Speechmatics) и TTS (Piper локально, ElevenLabs в облаке или свой). В README-примере: VoiceAgent, unlockAudio и llmUrl на совместимый endpoint; в качестве модели указан claude-haiku-4-5. Регрессии в репозитории закрыты 178 автотестами.
npm i @todoforai/voiceloop
Демо на 20 секунд без ключей: todoforai.github.io/voiceloop. Исходники: github.com/todoforai/voiceloop.
Три режима задержки: без ключей, облако и сравнение со стеками
В сводной таблице smalltalk (сценарий smalltalk, 5 разговоров × 6 реплик, pooled n=30, median и p95) сравниваются конфигурации при mock LLM с 300 ms TTFT, где это применимо. Для OpenAI Realtime (speech-to-speech) отдельно отмечено, что тот же mock не даёт полностью сопоставимого сравнения.
| configuration | voice→voice (median, ms) | p95 (ms) |
|---|---|---|
| OpenAI Realtime (speech-to-speech, own LLM) * | 866 | 1644 |
| voiceloop · deepgram + ElevenLabs flash | 862 | 1067 |
| voiceloop · deepgram + Piper (local TTS) | 974 | 1287 |
| Pipecat 1.8.1 · deepgram + EL flash | 1046 | 3573 |
| ElevenLabs ConvAI | 1454 | 1632 |
| voiceloop · webspeech + Piper (zero-key) | 2113 | 2607 |
Для прототипа в одной вкладке путь Web Speech + Piper даёт median 2113 ms и не требует ключей; связка Deepgram Flux + ElevenLabs flash в той же таблице показывает 862 ms median и 1067 ms p95. Выбор не «быстрее вообще», а компромисс между ключами, облачным STT и локальным TTS.
Одиночные прогоны бенча дают джиттер порядка ±300 ms: ориентироваться стоит на median/p95 из серии, а не на один замер.
Black-box бенч и сценарий с эхом без AEC
Методика вынесена в voice-agent-bench: скриптованный «person» с заранее сгенерированной речью, виртуальный микрофон, запись с динамиков агента, метрики из аудио без врезки в код агента. Полные таблицы и описание лежат в results/RESULTS.md того же репозитория; чужой стек можно добавить по контракту ADDING_A_SUT.md.
В сценариях «Across scenarios» перечислены clean, hesitation, talked through user, echo, cut itself. Echo: голос агента обратно в мик (−15 dB, задержка 30 ms, без AEC). Для voiceloop (deepgram + EL flash) в сводной таблице бенча: 0 self-cut из 30 echo-coupled turns при выключенной echo cancellation; у Pipecat 20/30, у OpenAI Realtime 17/30. Это бьёт по риску «агент перебивает себя», если гоняете голосового ассистента в ноутбуке без акустической изоляции.
Перед встраиванием в продукт: три проверки
- Прогнать демо и свой endpoint LLM: убедиться, что цикл в вашей вкладке стабилен с выбранным STT/TTS.
- Клонировать voice-agent-bench и сравнить свою конфигурацию с Pipecat 1.8.1 / Realtime / ConvAI на тех же сценариях, а не по маркетинговому «fastest» в заголовке.
- Отдельно проверить echo-сценарий, если агент говорит в колонки рядом с микрофоном: замеры из бенча не заменяют вашу комнату и железо.
Проект задуман как голосовой контур внутри TODOforAI JARVIS в браузере; для стороннего соло-разработчика ценность в готовом агентном цикле с npm-установкой и открытым бенчем, а не в закрытом SaaS без способа перепроверить задержку.
Источники
- Пост автора todoforai на Dev.to (22 сентября 2026, UTC): Dev.to — доступ при обогащении: 2026-09-22 UTC.
- Репозиторий voiceloop (MIT): https://github.com/todoforai/voiceloop — доступ: 2026-09-22 UTC.
- Демо без ключей: https://todoforai.github.io/voiceloop — доступ: 2026-09-22 UTC.
- Black-box бенч: https://github.com/todoforai/voice-agent-bench — доступ: 2026-09-22 UTC.