AI agents
Voice agent telefonie: Twilio vs Vapi vs LiveKit, gerangschikt
De telefoon van een planningscoördinator gaat 1.640 keer per week. Diensten ruilen, adressen wijzigen, codes opnieuw uitgegeven. De agent die opneemt staat of valt met z'n telefonie-stack.

Het planningskantoor zit boven een fysiotherapiepraktijk aan de Westzijde. Twee schermen, drie koffiebekers, één rooster voor 23 verzorgenden die samen ongeveer 1.640 cliënt-zijdige dienstwissels per week dekken. Tot vorig najaar eindigde elk van die wisselingen in een telefoontje. Nu eindigt het merendeel in een telefoontje dat door een voice agent wordt opgenomen.
De agent werkt. De vraag die we kregen, en die deze post beantwoordt, is welke telefonie-laag eronder moet. We benchmarkten er drie: Twilio Voice gekoppeld aan ElevenLabs, Vapi end-to-end, en een zelfgebouwde pipeline van LiveKit + Deepgram + Cartesia achter een SIP trunk. Het scoreblad had drie kolommen: kosten per gesprek op productievolume, AVG-verdedigbaarheid onder de Wkkgz-bewaarregels, en het antwoord op één specifieke vraag — wie pakt de pieper op als KPN ZBC het 075-nummer opnieuw routeert op een vrijdagavond.
De Zaandamse nulmeting
1.640 wekelijkse roostermutaties, gemiddelde gespreksduur gemeten over zes weken pilotdata: 84 seconden. Ongeveer 91% inbound van verzorgenden die bellen met een "ik kan niet" of "ik sta vast in de file vanuit Purmerend"; de rest outbound vanuit de agent die een vervangingswissel bevestigt. Ongeveer de helft van de gesprekken triggert een function call naar Nedap ONS voor de daadwerkelijke roostermutatie; de andere helft beantwoordt een "wanneer is mevrouw De Wit ingepland" zonder iets weg te schrijven.
Drie randvoorwaarden waarover we niet konden onderhandelen:
- De gespreksaudio raakt gezondheidsdata, omdat verzorgenden reflexmatig namen en aandoeningen van cliënten noemen. Dat trekt de hele pipeline binnen de AVG-perimeter en onder het Wkkgz-dossierbewaarregime.
- Het nummer waar mensen naar bellen is een bestaande 075-lijn, geport via KPN ZBC. Niemand gaat de verzorgenden een nieuw nummer aanleren.
- Het latentiebudget is 600 ms turn-around, oor-tot-oor gemeten, want alles trager en de verzorgende begint zichzelf te herhalen.
Twilio Voice + ElevenLabs
Twilio is de saaie keuze en dat is, grotendeels, een compliment. Je richt je 075-trunk op een Twilio Programmable Voice endpoint, opent een Media Streams websocket en pijpt de inkomende audio-frames naar je eigen orchestrator: Deepgram of Whisper voor STT, GPT-4.1 of Claude voor de planner, ElevenLabs voor het antwoord. Twilio regelt DTMF, jitter buffer, codec-onderhandeling met de carrier en de SIP-kant van de nummerportering.
from twilio.twiml.voice_response import VoiceResponse, Connect
response = VoiceResponse()
connect = Connect()
connect.stream(url="wss://agent.thuiszorg.nl/twilio")
response.append(connect)
# Twilio post de TwiML; onze orchestrator beheert de websocket
Kostenplaatje: Twilio inbound op een Nederlands geografisch nummer zit momenteel rond $0,0085/min voor het gesprek en $0,004/min voor Media Streams. ElevenLabs Turbo v2.5 in het Nederlands komt op ongeveer $0,18 per 1.000 tekens, wat bij ons gemiddelde van 230 tekens/beurt neerkomt op circa $0,05 per gesprek. Deepgram Nova-3 (Nederlands wordt ondersteund) voegt $0,0043/min toe. Round-trip per gesprek van 84 seconden: ongeveer $0,09 aan infra, exclusief LLM-tokens.
Wat je inlevert: orchestratie. Elke barge-in, elke interruptie, elke "sorry, ik viel weg"-handoff moet je zelf opdraden. Twilio levert frames; het conversatiemodel is jouw probleem.
Vapi
Vapi is de tegenovergestelde ruil. Je configureert een assistent in hun dashboard, richt een SIP trunk op hun endpoint, en zij beheren de STT-naar-LLM-naar-TTS-loop, barge-in, function calling en gespreksopname. Je kunt je eigen model meenemen (wij gebruikten Claude) en je eigen stem (weer ElevenLabs). Ze rekenen ~$0,05/min voor orchestratie bovenop de doorbelaste kosten van de leverancier.
Bij 84 seconden en Nederlandse TTS kwam onze infrakost per gesprek op Vapi uit op ongeveer $0,11 — iets hoger dan de Twilio-zelfbouw door de orchestratie-fee, maar met misschien drie dagen implementatiewerk in plaats van drie weken. De adder zit niet in de prijslijst: het data plane van Vapi draait primair in de VS. Voor een AVG-perimeter workload die ook nog Wkkgz-dossierbewaring raakt, heb je óf een schriftelijke EU-residency-toezegging in je DPA nodig óf een verdedigbare reden voor de overdracht. Lees je verwerkersovereenkomst voordat je live gaat.
LiveKit + Deepgram + Cartesia
De derde optie is wat veel teams pakken als ze de Vapi-DPA lezen en fronsen. LiveKit Agents is een open-source framework voor realtime voice-pipelines; het praat SIP via een sidecar, biedt een schone Python/Node API voor de turn-taking loop, en laat je elke byte aan audio pinnen aan een EU-regio. Combineer dat met Deepgrams Nederlandse model voor STT en Cartesia Sonic voor TTS, en je hebt een pipeline die je op Hetzner in Falkenstein kunt deployen zonder transatlantische hop.
from livekit.agents import AgentSession
from livekit.plugins import deepgram, cartesia, anthropic, silero
session = AgentSession(
stt=deepgram.STT(model="nova-3", language="nl"),
llm=anthropic.LLM(model="claude-sonnet-4-5"),
tts=cartesia.TTS(model="sonic-2", voice="nl-female-warm"),
vad=silero.VAD.load(),
)
Je hebt nog steeds een SIP trunk nodig. Wij gebruikten Twilio Elastic SIP Trunking als carrier-zijdige edge — directe KPN ZBC SIP-peering is mogelijk, maar de inkoopcyclus duurt maanden. Per-minuut infra op deze stack op productievolume: $0,006 carrier, $0,0043 STT, ~$0,025 TTS, plus een vaste ~€90/maand voor de LiveKit Cloud Agents tier (Frankfurt). Per gesprek kom je uit op ongeveer $0,08 — de goedkoopste van de drie, maar pas na de bouw.
De kostenoptelling bij 1.640 gesprekken per week
Wekelijks volume × 84s gemiddeld ≈ 2.296 minuten. Op jaarbasis, exclusief LLM-tokens:
- Twilio + ElevenLabs zelfbouw: ~€7.200/jr aan infra.
- Vapi: ~€9.400/jr.
- LiveKit + Deepgram + Cartesia: ~€6.400/jr, plus het LiveKit Cloud-abonnement.
Het infra-verschil tussen goedkoopste en duurste is zo'n €3.000/jr. Tegen de loonkosten van een 23-koppige thuiszorgorganisatie is dat afrondingsruis. Dus we hebben niet op prijs gekozen.
AVG en Wkkgz: wie houdt de opname
De Wkkgz verplicht een zorgaanbieder genoeg vast te leggen om een klacht af te kunnen handelen, kwaliteitsaudits te ondersteunen en — daar waar het gesprek zelf een zorgbesluit documenteert — het cliëntdossier te voeden. In de praktijk voor een planningsgesprek betekent dat een transcript plus een kort bewaarvenster op de audio: lang genoeg om een klacht op te vangen, kort genoeg om niet te verzuipen in PII.
De AVG-laag stelt twee lastigere vragen. Waar staat de audio fysiek, en wie is de verwerker? Voor Twilio kun je Media Streams pinnen aan Dublin en hun DPA tekenen; voor LiveKit kun je volledig binnen een EU-project deployen; voor Vapi moet je het schriftelijk navragen, en op dit moment is het antwoord met voorbehoud.
Bevat het gesprek gezondheidsgegevens, dan is je stack-keuze geen leveranciersvoorkeur. Het is input voor je DPIA. Beslis over dataresidentie vóór je beslist over telefonie.
Vrijdagavond, 21:47
In april verhuisde KPN ZBC het 075-nummer naar een nieuwe trunk en de inbound calls stopten. De agent bleef booten; het dashboard bleef groen; de verzorgenden kregen voicemail.
Dit is de kolom op het scoreblad die de doorslag geeft. De vraag is niet "werkt de stack" maar "als 'ie om 21:47 op een vrijdag stopt, wie repareert het, hoe snel, en vanwaar."
Op Twilio open je een ticket en kijk je naar de SIP debugger in de console. Hun carrier-team is wakker op een vrijdagavond; de mediane tijd tot een bruikbaar antwoord ligt in onze ervaring rond de 40 minuten. Op Vapi ping je hun Discord — responsief, maar je zit downstream van hun carrier-leverancier, wat één extra hop is in de escalatieketen. Bij de LiveKit-zelfbouw ben jij het carrier-team. Jouw telefoon gaat. Jij SSH't naar binnen. Jij leest de SIP packet capture aan de trunk-kant.
Voor een 23-koppige organisatie zonder NOC is die laatste optie romantisch tot de eerste vrijdagavond dat het gebeurt. We bouwden de optie, we leverden de optie en we schreven het runbook — maar het runbook is zes pagina's lang en een planningscoördinator hoort dat niet om 22:00 te zitten lezen.
Wat we voor Zaandam hebben opgeleverd
Twilio Voice + ElevenLabs, met een dunne LiveKit-achtige orchestrator bovenop Media Streams, en een tertiaire call-forwarding regel in KPN ZBC die het 075-nummer omleidt naar een menselijke voicemailbox als de agent z'n health check langer dan 60 seconden mist. Audio staat in de Twilio Dublin-regio; opnames worden gehasht naar S3-EU met een 90-dagen TTL; transcripts gaan via een function call naar Nedap ONS — en dat, niet de audio, is het Wkkgz-verdedigbare artefact.
De saaie keuze won, omdat op deze schaal de marginale infrakost niet uitmaakte en het stand-by-antwoord wél. Toen we de planning-agent voor het Zaandamse team bouwden, was waar we tegenaan liepen niet de spraakkwaliteit of latency — het was de tweede vrijdagavond, toen de trunk hikte en we een leverancier nodig hadden wiens pieper eerder afging dan de onze. We hebben dat opgelost door die pieper bij Twilio in te kopen. Stitch je voice agents aan een Nederlandse carrier, prijs die afweging dan vroeg in.
Audit van vijf minuten voor morgen: open je verwerkersovereenkomst, zoek de clausule die de sub-verwerkers van audio benoemt, en check of er eentje buiten de EU zit. Kun je dat niet uit je hoofd beantwoorden, dan heb je je maandagochtendklus.
Kern
Op thuiszorgschaal is de goedkoopste voice stack niet de juiste; kies de leverancier wiens pieper eerder afgaat dan die van jou als de SIP trunk op vrijdagavond wegvalt.
FAQ
Waarom niet gewoon de op papier goedkoopste stack pakken?
Bij 1.640 gesprekken/week is het jaarlijkse infra-verschil tussen de drie zo'n €3.000. Dat wordt overschaduwd door de kosten van één storing op een vrijdagavond, dus de stand-by-verantwoordelijkheid beslist, niet de prijs.
Is Vapi gediskwalificeerd voor Nederlandse zorg?
Niet automatisch. Het hangt af van wat hun DPA schriftelijk vastlegt over EU-dataresidentie en of jouw DPIA de overdracht accepteert. Vraag het na vóór je bouwt, niet erna.
Kunnen we LiveKit gebruiken zonder zelf SIP te beheren?
Ja. LiveKit Cloud termineert SIP via een trunk die jij meebrengt (Twilio Elastic, Telnyx of een Nederlandse carrier). De trunk blijft van jou, de media-infrastructuur niet.
Hoe zit het met het bewaarvenster voor audio onder de Wkkgz?
De wet legt dossierbewaring vast, geen audiobewaring. De meeste teams houden transcripts langdurig en audio 30 tot 90 dagen — genoeg om een klacht te onderzoeken zonder PII te hamsteren.