Mostantól bárki beépítheti a saját termékébe a legjobb hangügynököt. Az első helyezett hangalapú feldolgozási ciklus nyílt forráskódú, és az ezt bizonyító benchmark is publikus.


Miért építettük meg

A TODOforAI-ba böngészőben akartuk a gördülékeny JARVIS-élményt: beszélsz, egy másodpercen belül válaszol, közbevágsz egy mondat közepén, és egyszerűen elhallgat. Nem találtunk olyan stacket, ami ezt rendesen tudta volna. A zárt API-k közel jártak hozzá, de nem a mieink voltak. A nyílt keretrendszerek a felhasználó szavába vágtak, vagy ami még rosszabb, meghallották a saját hangjukat a hangszórón át, és megszakították magukat.

2026 van. Ez már megoldott problémának kellene lennie. Megoldottuk, és az egészet publikáltuk: a ciklust, a számokat és a mérőrendszert, amivel a számokat kaptuk.

Mi az a voiceloop

Egy függőségmentes JavaScript-könyvtár, ami a teljes ciklust futtatja a böngészőben: VAD → STT → LLM → TTS, a nehéz részeket már megoldva.

  • Valódi közbevágás (barge-in) — az ügynök beszédében nem szereplő, újonnan felismert szavakra reagál, nem a mikrofon energiájára, ezért az ügynök saját hangja, ami beszivárog a mikrofonba, soha nem szakítja félbe az ügynököt.
  • Önvisszhang-szűrés — egy szóegyeztető szűrő összeveti, amit a mikrofon hall, azzal, amit az ügynök éppen mond. 0 önmegszakítás 30 visszhangos körben, teljesen kikapcsolt visszhangcsillapítással.
  • Az első hang egy másodpercen belül — a TTS az 1. mondatot mondja, miközben az LLM még a 2.-at írja, és az LLM-hívás spekulatívan elindul a beszédvégi szünet alatt.
  • Local-first — a Silero VAD és a Piper TTS WASM-ként fut a böngészőben. Ingyenes, nincs szükség felhős oda-vissza kommunikációra.
  • Sorba rendezett körök — gyors egymásutáni körök, eszközeredmények, várakoztatások és visszajátszások soha nem beszélhetnek egymásra. Ezt 178 teszt garantálja.

Minden cserélhető: bármilyen OpenAI-kompatibilis LLM, négy STT-szolgáltató (Web Speech, ElevenLabs Scribe, Deepgram Flux, Speechmatics), cserélhető TTS (Piper helyben, ElevenLabs felhőből, vagy a saját megoldásod).

import { VoiceAgent, unlockAudio } from '@todoforai/voiceloop';

const agent = new VoiceAgent({
  llmUrl: '/api/chat/completions',   // any OpenAI-compatible endpoint, behind your proxy
  model: 'claude-haiku-4-5',
  persona: 'You are a friendly cooking assistant.',
  onEvent: (e) => { if (e.type === 'assistant') render(e.text); },
});

button.onclick = async () => { unlockAudio(); await agent.start(); };

Ennyi a teljes integráció.

A számok

A hangalapú AI területén a késleltetési állításokat általában maguk a gyártók közlik, és nem reprodukálhatók. Nem akartunk még egyet hozzátenni, ezért megépítettük a voice-agent-bench nevű feketedobozos mérőrendszert. Egy szkriptelt „ember” (bájtszinten azonos, előre legenerált beszéd) beszél egy virtuális mikrofonba, rögzítjük az ügynök hangszórókimenetét, és minden pontszám csak a hangból származik. Nem kell hozzá integráció: bármelyik ügynök mérhető, amelyik hangot ad ki, a zártak is.

Minden rendszer ugyanazokat a szkriptelt beszélgetéseket kapja, és ahol a rendszer engedi, ugyanazt a fix mock LLM-et (300ms TTFT), így az összehasonlítás a hangciklust méri, nem a modellt. 5 beszélgetés × 6 kör összesítve, n=30, medián és p95 — az egyes futások ±300ms-ot ingadoznak, ezért nem érdemes őket kiírni.

Small talk — ugyanaz a mock LLM, 5×6 kör összesítve

konfigurációhang→hangp95leállási idő közbevágáskorakadások
OpenAI Realtime (speech-to-speech, saját LLM) *866ms1644429ms20
voiceloop · deepgram + ElevenLabs flash862ms1067944ms16
voiceloop · deepgram + Piper (ingyenes, helyi TTS)974ms12871463ms19
Pipecat 1.8.1 · deepgram + EL flash1046ms3573542ms14
ElevenLabs ConvAI1454ms16321042ms8
voiceloop · EL Scribe + EL flash1562ms18551566ms12
voiceloop · Speechmatics + EL flash1706ms20691046ms17
voiceloop · webspeech + Piper (kulcs nélkül)2113ms26071257ms30

Különböző helyzetekben

rendszertisztahabozása felhasználó szavába vágottvisszhangmegszakította magát
OpenAI Realtime *87012900 (130 ms-on belül átadja a szót)79017/30
voiceloop · deepgram + EL flash86014000 (420ms)9300
voiceloop · deepgram + Piper97014000——
Pipecat105012902 (200ms)132020/30
ElevenLabs ConvAI145018100 (490ms)14100

* A Realtime speech-to-speech, ezért nem használhatja a fix mock LLM-et, így a sora nem teljesen azonos alapon összehasonlítható.

Hogyan olvasd

Tiszta hang: a Deepgram Flux + ElevenLabs flash párosítású voiceloop a leggyorsabb konfiguráció, amit mértünk, 862ms mediánnal — és a p95-je (1067 ms) messze a legalacsonyabb a táblázatban. A Pipecat 3573ms-os p95-je ugyanazokkal a szolgáltatókkal azt jelenti, hogy húsz körből egy több mint három másodpercig tart. Az ingyenes, teljesen helyi Piper-útvonal 974ms-on végez, felhős TTS nélkül.

A visszhang az a hiba, ami szétválasztja a stackeket. Ha minden rendszernek visszaadjuk a saját hangját a mikrofonon át (−15dB, 30ms késleltetés, AEC nélkül — ezt csinálja egy laptop bekapcsolt hangszóróval), a többi gyors stack a saját hangját a felhasználó hangjaként érzékeli, és megszakítja a saját válaszait: a Pipecat 30 körből 20-ban, az OpenAI Realtime 17-ben. A voiceloop nulla alkalommal szakította meg magát, és a visszhangos köröket 930ms-on futtatta — a tiszta hanggal azonos szinten. A szószintű visszhangszűrés nem növeli a késleltetést, miután a szűrő helyesen osztályozta a bemenetet.

Habozás: aki mondat közben megáll, abba nem szabad belebeszélni. A Pipecat kivételével minden stack kivár; a voiceloop 30 habozásos körből 2-ben kezd beszélni, majd 420 ms-on belül átadja a szót.

A kulcs nélküli alapbeállítás őszintén megmutatja az árát. A böngészős Web Speech + Piper sehol nem kér fiókot, és ez futtatja a demót, de körülbelül 1,2 másodperccel lassabban zár le egy kört, mint a felhős STT (2113ms). A fenti számokhoz válassz pipeline STT-szolgáltatót.

A teljes, helyzetenkénti táblázatok, a módszertan és az újrafuttatás lépései: results/RESULTS.md.

Több száz konfiguráció, hogy neked ne kelljen

A fenti sorok a túlélők. Mögöttük több száz futás áll STT-szolgáltatókkal, TTS-motorokkal, VAD-küszöbökkel, beszédvégi debounce-értékekkel, minimális közbevágás-hosszakkal, prefetch-stabilitási ablakokkal és visszhang-egyezési küszöbökkel. Minden lényeges beállítás elérhető a src/tuning.js fájlban, az alapértékek pedig azok, amik nyertek a benchmarkon. Azokat a határeseteket, amelyeket egyébként egyesével, éles hibákon keresztül fedeznél fel — az ügynök, ami megszakítja magát, az eszközhívás, ami olyan mondatra indul el, amit a felhasználó még javított, a beragadt eszköz, ami megállítja a következő kört — már kezeltük, és regressziós tesztek védik őket.

Próbáld ki, használd, múld felül

  • Próbáld ki: todoforai.github.io/voiceloop — 20 másodperc, kulcsok nélkül, a böngészőben fut.
  • Használd: npm i @todoforai/voiceloop — MIT, nulla függőség. Irányítsd bármilyen OpenAI-kompatibilis végpontra, és kösd be az eszközeidet.
  • Múld felül: a benchmark feketedobozos és publikus. Ha a te stacked jobb, add hozzá — az ADDING_A_SUT.md a szerződés. Közzétesszük az eredményedet.

Ez a hangalapú feldolgozási ciklus fut a TODOforAI JARVIS-ában is; a könyvtár és a termék közti integrációs többletmunka nulla, és pontosan ez a lényeg. Mindenki számára elérhetővé kell tenni a legjobb hangalapú feldolgozási ciklust. Csillagozd, oszd meg, járulj hozzá — maradjon a legjobb nyílt forráskódú.