Voice agents
Voice agent tandartspraktijk: door de zomerstop heen
Drie receptionistes met zomervakantie, een telefoonlijn die had moeten omvallen, en een voice agent die 547 tandartsafspraken inplande zonder dat er een mens aan te pas kwam.

De telefoonlijn, half juli
Het is een dinsdagochtend in juli bij een tandartsgroep met vier vestigingen in de Randstad. Twee receptionistes zitten op vakantie in Griekenland. Eén heeft een ziek kind. De vierde is de praktijkmanager, en die zit aan de lijn met een lab in Eindhoven over een kroon die niet is aangekomen. De voicemail springt voor de vijfde keer in twintig minuten aan.
Tot deze zomer betekende dat: gemiste afspraken, geïrriteerde patiënten, en een stapel voicemails die iemand op donderdagmiddag wegwerkte, vaak met een half opgegeten broodje naast het toetsenbord. Dit jaar viel de lijn niet stil. Hij werd niet eens trager. Een voice agent nam op bij de eerste keer overgaan, in het Nederlands, en schreef afspraken direct in het praktijkmanagementsysteem van elke vestiging.
Hoe telefoonwerk bij de tandarts er echt uitziet
Voordat we een regel code schreven, zaten we twee volle dagen naast de receptionistes op de drukste vestiging. De telefoon is niet één workflow. Het zijn vijf workflows door elkaar heen gevlochten.
- Nieuwe patiëntinschrijvingen, met een check of de vestiging die maand überhaupt nieuwe patiënten aanneemt.
- Verzetten van afspraken, zo'n veertig procent van het binnenkomende verkeer.
- Annuleringen, die snel een slot moeten vrijmaken zodat de volgende beller het kan pakken.
- Pijnklachten, die triage nodig hebben en een slot op dezelfde dag of binnen dezelfde week.
- Administratieve vragen: verzekering, facturen, en 'heeft de tandarts mijn röntgenfoto al binnen'.
Wie ooit een chat agent heeft gebouwd kent de valkuil. Schrijf je één prompt voor alle vijf, dan doet de agent ze allemaal half. De receptionistes draaien zelf een state machine in hun hoofd. Onze agent moest dat ook, alleen moest de onze zijn state expliciet in code vastleggen.
De randvoorwaarden die we als eerste opschreven
Nederlandse praktijkmanagementsoftware voor tandartsen is een wereld op zich. Deze groep draait Simplex op drie vestigingen en een eigen laag bovenop Exquise op de vierde. Geen van beide leveranciers heeft een echte publieke API. Allebei lekken ze net genoeg via een desktop client en een interne HTTP endpoint dat we een adapter konden schrijven zonder voorwaarden te overtreden.
Drie randvoorwaarden bepaalden de rest van de bouw.
- Latency onder de seconde. Meer dan 1,5 seconde stilte nadat de beller is uitgepraat, en ze herhalen zichzelf of hangen op. Dat hebben we eerst op echte opnames gemeten, voordat we iets beloofden.
- Nederlands met Vlaamse en Duitse randen. De patiëntenmix bij deze groep bestaat uit Nederlandse moedertaalsprekers, Duitse grenspatiënten vanuit de Achterhoek, en een Vlaamse minderheid. De agent moest alle drie aankunnen zonder een handmatige taalwissel.
- Nooit dingen verzinnen. Een verkeerde afspraak is erger dan een gemiste oproep. De agent moet beschikbaarheid uit de echte agenda lezen, mag nooit gokken, en moet elke boeking hardop bevestigen voordat hij hem wegschrijft.
Architectuur
We hebben niets nieuws uitgevonden. We hebben onderdelen gecombineerd die de afgelopen twaalf maanden productieklaar zijn, en daar een strakke harness omheen gezet.
Het gesprek komt binnen via de bestaande SIP trunk van de praktijk. We hebben de telefonieleverancier niet vervangen, want dat zou een politiek gevecht zijn dat elk zorgproject met een kwartaal vertraagt. We hebben een SIP fork toegevoegd naar een Twilio Programmable Voice endpoint die audio bidirectioneel streamt naar een kleine Node service op een Hetzner machine in Falkenstein. Die service houdt per gesprek de conversation state vast.
De pipeline per beurt:
- Streaming speech-to-text via Deepgram Nova-3 in het Nederlands, met het Duitse akoestische model parallel warm voor grenspatiënten.
- Voice activity detection afgesteld op een end-of-turn drempel van 220 milliseconden, agressief, maar het verdient zich terug in gevoelde snelheid.
- Een tool-calling LLM die het gesprek voert. Hij mag geen eigen antwoorden geven over beschikbaarheid. Hij mag alleen de agenda-tool, de patiënt-lookup tool en de booking tool aanroepen.
- Streaming text-to-speech met een Nederlandse stem die we exclusief hebben gelicentieerd voor de vier vestigingen, zodat bellers op elke locatie dezelfde spreker herkennen.
De agenda-tool praat met een kleine Python adapter die zowel de Simplex- als Exquise-endpoints wrapt. Elke vestiging heeft een eigen adapter-instantie met eigen credentials en eigen rate limit, omdat Simplex agressief throttlet en we niet wilden dat één drukke vestiging een andere uithongert.
De voice agent zegt nooit een tijdstip hardop dat niet in de laatste 800 milliseconden uit een tool call kwam. Die ene regel sloeg bijna elke faalcategorie waar we bang voor waren uit het systeem.
Het interruptie-probleem
De helft van alle voice agent demo's valt om zodra een beller door de bot heen praat. Echte bellers doen dat altijd. Ze hoesten. Ze zeggen 'ja, ja' terwijl jij nog aan het praten bent. Ze stellen een vervolgvraag voordat jij je zin hebt afgemaakt. De beleefde bellers zeggen 'sorry, even iets' en vragen het dan alsnog.
We pakken interrupties in twee lagen aan. De eerste is voice activity op de inkomende stream die de uitgaande TTS direct afkapt, midden in een lettergreep als het moet. De tweede is een lichte classifier op het deeltranscript die bepaalt of de onderbreking een backchannel is (een 'hm', een 'ja') of een echte nieuwe beurt. Backchannels worden genegeerd. Echte beurten resetten de state en de agent beantwoordt de nieuwe vraag, in plaats van zijn oude zin af te maken.
Dat is het verschil tussen een agent die menselijk aanvoelt en eentje die aanvoelt als een keuzemenu met extra stappen.
De agenda is geen agenda
Tandartsplanning heeft regels die pas vanzelfsprekend lijken als je de receptionistes ziet werken. We hebben er in twee dagen 37 opgeschreven.
- Een controle duurt twintig minuten, maar alleen bij de eigen tandarts van de patiënt, en alleen op dagen dat die tandarts op die vestiging werkt.
- Een vulling vraagt veertig minuten en een behandelkamer met de juiste apparatuur voor het betreffende kwadrant.
- Een pijnklacht mag de twintig-minuten regel breken. Die gaat in een spoedslot dat de agenda doet alsof het niet bestaat, maar dat elke receptioniste kent.
- Kinderen onder de twaalf worden niet ingepland na 15:30, tenzij een ouder erop staat. Dan zet de receptioniste er een aantekening bij.
- Staat er binnen vier weken na een controle een mondhygiënist-slot open, bied het aan. Patiënten zeggen bijna altijd ja.
Niets hiervan staat in gestructureerde vorm in de agendasoftware. Het zit in de hoofden van de receptionistes. We hebben elke regel omgezet in een kleine functie die draait na de agendalookup en voordat de agent een slot aan de beller mag voorlezen. De agent kent de regels niet. De adapter wel.
Bevestiging, hardop
De agent bevestigt drie dingen voordat een boeking wordt weggeschreven.
- De volledige naam en geboortedatum van de patiënt, voorgelezen uit de lookup.
- Het type behandeling in gewoon Nederlands, geen jargon. 'Controle', geen 'periodiek mondonderzoek'.
- De dag, datum, tijd, en welke tandarts op welke vestiging.
Pas na een duidelijke 'ja' of 'klopt' vuurt de booking tool. Verbetert de beller iets, dan leest de agent het gecorrigeerde slot opnieuw voor. Dat kost ongeveer acht seconden extra per boeking. Patiënten vinden het prima. Het foutpercentage zakte naar een niveau dat de praktijkmanager droog samenvatte als 'lager dan wat we met de hand deden'.
Handoff, vanaf het begin ingebouwd
Elke voice agent loopt vroeg of laat tegen een gesprek aan dat hij niet zelf moet afmaken. De onze markeert het volgende en draagt het over aan de dienstdoende receptioniste, met een geschreven samenvatting van één zin op haar scherm.
- Drie of meer mislukte naamopzoekingen op rij. Meestal een slechthorende beller of een lawaaiige achtergrond.
- Elke melding van bloeden, zwelling die de ademhaling beïnvloedt, of trauma. Daar doet de agent geen triage op.
- Een klacht, gedefinieerd op basis van sentiment plus een korte trefwoordenlijst. Klachten gaan binnen hetzelfde gesprek naar een mens.
- Alles wat te maken heeft met facturen boven de 250 euro of geschillen met de verzekeraar.
De handoff is warm. De receptioniste ziet wie er aan de lijn is, waarvoor de beller komt, en wat de agent al bevestigd heeft, nog voordat ze 'goedemorgen' zegt. De hele overdracht duurt minder dan drie seconden.
De zomertest, in cijfers
De agent ging eind mei 2026 live. De eerste echte test was de tweede week van juli, toen drie van de vier receptionistes tegelijk vrij waren.
Die week handelde de agent 1.184 binnenkomende gesprekken af. Daarvan waren er 612 een boeking of een verzetting. De agent rondde er 547 zelf af, zonder hulp van een mens. 41 gingen naar de dienstdoende receptioniste, op basis van redenen die de agent zelf markeerde. 24 hingen op voor de boeking rond was, ongeveer hetzelfde percentage als in weken met volle bezetting. Geen enkele boeking is achteraf door een patiënt betwist.
Gemiddelde gespreksduur voor een boeking was 1 minuut 47 seconden, tegenover een baseline van 2 minuten 30 seconden in een maartweek met volle bezetting. De agent is sneller omdat hij een beller nooit in de wacht zet om in een tweede venster de agenda na te kijken. Hij heeft de agenda al.
Kosten, en waarom dat niet de kop is
Een voice agent heeft een prijs per minuut. STT, LLM en TTS samen komen op ongeveer 0,11 euro per gespreksminuut bij het volume van deze groep. De vraag die we aan de praktijkmanager voorlegden was niet of de agent zichzelf in pure belminuten terugverdiende. Wel: wat een uur van een getrainde receptioniste waard is op de drukste ochtend van het jaar, en hoeveel van die uren de lijn zonder agent verloren zou hebben.
Haar antwoord was direct. De agent kost per maand minder dan de uitzendkracht die ze vroeger voor de augustusweek inhuurde. De besparing was alleen niet de reden dat ze tekende. De reden was dat de lijn niet meer naar de voicemail doorschiet. Patiënten die een mens aan de lijn krijgen, ook een synthetische, bellen niet de praktijk twee straten verderop.
Wat we anders zouden doen
Twee dingen, als we opnieuw zouden beginnen.
Ten eerste: de Duitstalige ondersteuning in v1 was te licht. De grenspatiënten zijn een klein deel van het volume, maar een luidruchtig deel. We hadden de Duitse akoestische STT al op dag één live moeten hebben, in plaats van pas in week zes.
Ten tweede: we hadden vanaf dag één een dagelijkse samenvatting per e-mail naar de praktijkmanager moeten sturen. We hebben dat in week drie toegevoegd, op haar verzoek. Hij vermeldt elk gesprek dat de agent voerde, elke handoff, elk gemarkeerd transcript, met een link naar de audio. Dat is de feature die meer vertrouwen opbouwde dan welke andere ook, inclusief de boekingsaantallen.
Lever nooit een voice agent op aan een zorgklant zonder een transcriptlog per gesprek dat de praktijkeigenaar zelf kan lezen. Het vertrouwen stort in de eerste keer dat een patiënt terugbelt en de receptioniste niet kan zeggen wat er in het vorige gesprek beloofd is.
Wat je vandaag kunt doen
Run je een praktijk, een bureau, of welke operatie dan ook met een telefoonlijn, dan is het kleinste nuttige ding een audit van vijf minuten. Trek het belregister van vorige maand op. Tel de voicemails. Tel de gemiste oproepen rond lunchtijd. Tel de oproepen die binnenkwamen in de schoolvakantieweek. Valt dat aantal hoger uit dan je dacht, dan staat de business case voor een voice agent op de eerste lijn al voor je geschreven. Je hoeft je receptionistes niet te vervangen. Je hoeft alleen te stoppen met het verliezen van de gesprekken waar ze niet bij kunnen.
Toen we dit voor de tandartsgroep bouwden, zat het ingewikkelde stuk niet in het speechmodel. Het zat in de agenda-adapter die regels moest volgen die niemand ooit had opgeschreven. Dat is het patroon in vrijwel elk project dat we draaien: het interessante werk is de impliciete kennis van de mensen die het werk doen, niet de AI. We bouwen dit soort projecten voor klanten in Nederland en Thailand onder de noemer AI-agents, en het begint altijd met twee dagen aan een echt bureau, terwijl we echt werk zien gebeuren.
Kern
Een voice agent die nooit een tijdstip uitspreekt dat hij niet net uit de agenda heeft gelezen, verslaat elk keuzemenu en overleeft de vakantieweek waar je receptionistes niet doorheen komen.
FAQ
Hoe gaat de voice agent om met een beller die door hem heen praat?
Voice activity op de inkomende stream kapt de uitgaande spraak midden in een lettergreep af. Een kleine classifier bepaalt vervolgens of de onderbreking een backchannel was (een 'ja', een 'hm') of een echte nieuwe beurt. Alleen echte beurten resetten de conversatiestate.
Wat gebeurt er als de agent de beller niet kan verstaan?
Na drie mislukte naamopzoekingen, of bij elke melding van bloeden, ademhalingsproblemen of trauma, wordt het gesprek warm overgedragen aan de dienstdoende receptioniste, met een geschreven samenvatting van één zin al op haar scherm.
Hoe nauwkeurig is Nederlandse spraakherkenning voor medische termen?
Streaming Deepgram Nova-3 in het Nederlands handelt de dagelijkse boekingstaal goed af. We houden een kleine custom termlijst aan voor behandelnamen en achternamen van tandartsen, en we lezen nooit jargon terug. Bevestiging gaat altijd in gewoon Nederlands.
Hoe lang duurde de bouw van kickoff tot livegang?
Ruwweg negen weken. Twee voor discovery op de drukste vestiging, vier voor de conversationele kern en de agenda-adapters, en drie voor hardening, Duitstalige ondersteuning, de dagelijkse samenvattingsmail en de begeleide proefgesprekken.
Verzint de agent ooit een afspraaktijd?
Nee. De agent mag pas een tijdstip hardop uitspreken als dat tijdstip in de laatste 800 milliseconden uit een tool call naar de live agenda kwam. Die regel zit in de harness afgedwongen, niet alleen in de prompt.