← Blog

Voice agents

LiveKit, Vapi, Pipecat: cold-start latency in productie

Een patiënt belt om 09:14 een tandartspraktijk. Of ze ophangt hangt af van het gat tussen SIP-connect en de eerste lettergreep die de agent uitspreekt.

Jacob Molkenboer· Oprichter · A Brand New Company· 7 jun 2026· 6 min
Zwarte bakelieten hoorn van haak op leren onderlegger, groen lint in dichte agenda, koperen stopwatch, rode lakzegel.

Het is dinsdag, 09:14 in Amersfoort. De telefoon van de tandartspraktijk gaat voor de veertiende keer die ochtend. Een patiënt wil een wortelkanaalbehandeling van volgende week woensdag verzetten, omdat de school van haar zoon belde over koorts. Ze heeft ongeveer dertig seconden geduld voor ze ophangt en de volgende praktijk op haar lijstje probeert.

Die telefoon wordt niet opgenomen door een receptioniste. Hij wordt opgenomen door een voice agent die we vier maanden geleden hebben opgeleverd. Waar we twee weken op hebben zitten hameren is één getal: het gat tussen het moment dat de SIP-trunk opneemt en het moment dat de eerste Nederlandse lettergreep van de agent in het oor van de beller terechtkomt. Wij noemen dat cold-start. Demo's laten het nooit zien.

De opzet die moest werken

Elfhonderd inkomende gesprekken per week, drie praktijken onder één eigenaar, met een piek tussen 08:30 en 10:00 wanneer ouders hun kinderen op school afzetten en naar hun telefoon grijpen. Gemiddelde gespreksduur rond de twee minuten. Ruwweg 60% van de gesprekken zijn verzettingen, 25% nieuwe afspraken, 10% prijsvragen, 5% al het overige. De agent moet de eerste drie categorieën van begin tot eind afhandelen en de rest doorzetten naar een menselijke voicemail, met de context bewaard.

De taal is Nederlands, met een fors deel gesprekken in het Engels en zo nu en dan een Turkse of Arabische patiënt die halverwege een zin omschakelt. De telefoontrunk loopt via een Belgische VoIP-provider over SIP. De agenda van de praktijk staat in een Britse dental PMS met een wankele maar bruikbare JSON API.

We hebben drie orchestratie-lagen gebenchmarkt: LiveKit Agents, Vapi en Pipecat. Dezelfde speech-to-text (Deepgram Nova-2), hetzelfde model voor tool-use turns, dezelfde TTS (ElevenLabs Flash v2.5 in het Nederlands). Alleen de orchestratie-laag wisselde.

Cold-start is geen first-token latency

Het getal waar elke demo mee pronkt is "time to first token" of "first audio frame after the user stops speaking". Dat is barge-in latency, en dat is belangrijk. Maar cold-start is iets anders. Het is de tijd tussen het moment dat de SIP INVITE wordt aangenomen en het moment dat de agent zijn eerste woord uitspreekt. De patiënt is al aan de lijn. Ze wacht tot iemand iets zegt.

Is dat gat groter dan 1,8 seconden, dan zegt een serieus deel van de patiënten eerst "hallo?", wat een script ontspoort dat ervan uitgaat dat de agent begint. Zit het onder de 900ms, dan voelt de agent als iemand die snel heeft opgenomen. De zone tussen die twee waardes is waar het systeem kapot voelt.

Let op

Latency-dashboards van voice-platforms starten de timer bijna altijd bij de eerste uiting van de gebruiker. Dat verbergt de ergste latency die je bellers daadwerkelijk voelen: de stilte direct na het opnemen.

LiveKit Agents

LiveKit komt het dichtst in de buurt van een echte productie-stack die we gevonden hebben. Het werkt met een worker-model: je draait N agent-workers, elk met een warme pipeline, en de dispatcher zet inkomende gesprekken door naar een vrije worker. SIP komt binnen via hun LiveKit Cloud SIP-bridge of een zelfgehoste Kamailio ervoor.

Wat we maten op het tandartsaccount, gemiddeld over 200 gesprekken in één week:

  • Cold-start met een warme worker-pool van 4: 740ms mediaan, 1,1s p95.
  • Cold-start toen de pool op zondagochtend net van 0 naar 1 was opgeschaald: 4,2s. Onbruikbaar.
  • Barge-in latency: 380ms mediaan.

De fix voor het zondag-geval was om twee workers permanent warm te houden, ook bij nul verkeer. Dat kost ongeveer de prijs van een biertje per dag per worker op een kleine VM. Prima. Waar niemand je voor waarschuwt: de SIP-bridge voegt zelf nog zo'n 200ms latency toe bovenop wat je agent doet, en dat zie je alleen als je tcpdumpt.

Vapi

Vapi is de snelste route naar een werkende demo. Binnen negentig minuten na aanmelden hadden we een Nederlandse voice agent die een testnummer opnam. Zij regelen SIP, STT, model-orchestratie, TTS en barge-in voor je. De prijs die je betaalt is per minuut, en de abstractie heeft eigen meningen die je niet altijd wilt.

Cold-start op dezelfde manier gemeten:

  • Mediaan: 920ms. Goed.
  • p95: 2,6s. Niet goed. De lange staart komt door koude model-containers aan hun kant, die je niet kunt sturen of voorverwarmen.
  • Barge-in: 320ms mediaan. Uitstekend.

Wat ons ook beet: de standaard Nederlandse TTS-stem van Vapi spreekt gangbare tandartstermen ("vulling", "wortelkanaal") zo verkeerd uit dat één oudere patiënt drie keer achter elkaar "wat zegt u?" vroeg. Overschakelen naar een custom ElevenLabs-stem via hun bring-your-own setup loste het op, maar voegde 90ms toe aan de cold-start.

Pipecat

Pipecat is het meest flexibel en het meeste werk. Het is een Python-framework van Daily. Je schrijft de pipeline als een graaf van frame processors: VAD, STT, LLM, TTS, output. Je host zelf. Je regelt SIP zelf, met de PSTN-addon van Daily of met iets als Twilio ervoor.

We draaiden het op één 2-vCPU VM in Frankfurt, want Nederlandse gesprekken horen de Atlantische Oceaan niet over te steken. De cijfers:

  • Cold-start mediaan: 1,4s. Trager dan LiveKit en Vapi.
  • p95: 1,9s. Strakke verdeling, dat beviel.
  • Barge-in: 290ms mediaan. De beste van de drie, omdat we de VAD frame size omlaag gezet hebben naar 10ms.

Waarom de mediaan trager is: de Python event loop besteedt echt tijd aan de initialisatie van de pipeline in de eerste sessie. Je kunt een pipeline per worker voorverwarmen, maar het worker-model van Pipecat is minder uit het pak dan dat van LiveKit. We hebben zo'n 200 regels lijmcode geschreven om een warme pool te krijgen, en blij worden we er nog steeds niet van.

Waarmee we live zijn gegaan

LiveKit, met een permanent warme pool van drie workers in Frankfurt en een fallback-worker in Amsterdam. De rekensom:

  • Cold-start wint van Vapi op p95, en dat is het getal dat patiënten daadwerkelijk voelen.
  • Zelfgehoste kosten per minuut zijn ongeveer een derde van Vapi bij ons gespreksvolume.
  • De SIP-bridge laat ons gesprekssamenvattingen rechtstreeks in het PMS van de praktijk zetten via een kleine Go-service.

Pipecat is echt goed, en we zouden het leveren voor elke klant die strakke controle over de audio-pipeline wil (custom VAD, eigen TTS, real-time DSP). Voor een praktijk die wil dat de agent als een snelle receptioniste voelt en niets meer, was LiveKit de juiste keuze.

Cijfers die we je nog schuldig zijn

Twee cijfers wilden we hier publiceren maar doen we niet, omdat we nog niet genoeg data hebben. Eén: de latency van taalwisseling als een patiënt halverwege het gesprek van Nederlands naar Engels schakelt. Twee: de kosten van een long-context gesprekssamenvatting die aan het einde van elk gesprek terug in het PMS van de praktijk wordt geschreven. Beide schrijven we op zodra we een vol kwartaal aan productiedata hebben.

Toen we de voice agent bouwden voor die tandartsgroep, was het lastigste het gat tussen "demo-snel" en "productie-snel". We hebben dat opgelost door te betalen voor warme workers die we technisch niet nodig hadden en door de p95 van elke laag end-to-end te benchmarken. Ben je een voice agent aan het scopen en wil je de echte cijfers, dan is dat het soort werk dat we doen binnen onze AI-agents-praktijk.

De audit van vijf minuten die je vandaag kunt doen

Bel je eigen voice agent op het productienummer. Start een stopwatch op het moment dat je de overgangstoon niet meer hoort. Stop hem als je de eerste lettergreep hoort. Doe het tien keer verspreid over een dag, inclusief een zondagochtend. Zit de p95 van die tien gesprekken boven de 1,8 seconden, dan heb je hetzelfde probleem als wij. Het is op te lossen.

Kern

Cold-start, niet first-token latency, is het getal dat je bellers voelen. Benchmark opname-tot-eerste-lettergreep op p95 en houd je worker-pool warm zodat hij daaronder blijft.

FAQ

Welke stack had de laagste cold-start op p95?

LiveKit Agents, op 1,1s met een permanent warme pool van vier workers. Vapi zat op 2,6s op p95 door koude containers aan hun kant die we niet konden voorverwarmen.

Is Vapi een slechte keuze voor Nederlandse voice agents?

Nee, het is de snelste route naar een werkende demo. Maar je wilt bring-your-own TTS voor tandarts- of medisch vocabulaire, en de kosten per minuut tikken aan bij meer dan 1.000 gesprekken per week.

Wanneer zou je Pipecat boven LiveKit kiezen?

Als je controle over de audio-pipeline zelf nodig hebt: custom VAD, eigen TTS, real-time DSP of niet-standaard frame processing. Voor een gewone receptionist-agent was LiveKit makkelijker.

Wat is cold-start latency voor een voice agent?

De tijd tussen het opnemen van de SIP-trunk en het moment dat de agent de eerste lettergreep uitspreekt. Iets anders dan barge-in latency, die wordt gemeten nadat de gebruiker begint te praten.

Hoe meet je dat in productie?

Tap de SIP-laag voor de timestamp van INVITE-accepted en de audio-output voor het eerste niet-stille frame. Het verschil, per gesprek gemeten en geaggregeerd op p95, is wat je bellers daadwerkelijk voelen.

voice agentsai agentsarchitecturecase studyoperations

Iets bouwen?

Start een project