Onderbreken is geen functie die je aanzet. Het is een oordeel dat je agent meerdere keren per seconde velt, op audio van acht kilohertz vol wachtmuziek, verkeersgeluid en gesprekken van anderen, zonder de mogelijkheid om te vragen of je echt iets wilde zeggen. Zit dat oordeel er een klein beetje naast in de ene richting, dan praat de agent door je bellers heen. Zit het er in de andere richting naast, dan kapt hij ze midden in een zin af. De meeste voice-agents die onbeleefd aanvoelen zijn niet slecht geprompt. Ze zijn slecht afgesteld.
Eén detector, twee totaal verschillende taken
Spraakdetectie klinkt als één ding, en in de meeste codebases is het ook één component. Maar het moet twee vragen beantwoorden die vrijwel niets met elkaar te maken hebben, en het afstellen alsof het één instelling is, is precies waar het misgaat.
De eerste vraag is: is de beller klaar met zijn beurt, en mag ik nu antwoorden? Dat is beurtdetectie, die draait terwijl je agent stil is, en fout zitten kost je een lange ongemakkelijke stilte of een doormidden gehakte zin. De tweede vraag is: praat de beller op dit moment terwijl ik zelf praat, en moet ik dus stoppen? Dat is barge-in, die draait terwijl je agent spreekt, en fout zitten levert je een agent op die over mensen heen walst of een agent die stilvalt zodra er een vrachtwagen langsrijdt.
Dezelfde audio, twee verschillende kosten van fout zitten
Waarom studio-instellingen het op een telefoonlijn begeven
Vrijwel elke gepubliceerde benchmark voor een spraakdetector draait op schone, breedbandige audio met één spreker, opgenomen via een fatsoenlijke microfoon. Een telefoongesprek is niets van dat alles. Klassieke telefonie geeft je acht kilohertz smalband. Daarmee verdwijnt het grootste deel van het frequentiebereik dat medeklinkers onderscheidbaar maakt, en wat overblijft wordt ook nog gecomprimeerd.
Daar komt bij dat het kanaal van de beller zelden stil is, ook niet als de beller dat wel is. Er wordt bewust comfortruis bijgemengd zodat de lijn niet dood klinkt. Er staat een televisie aan, er rijdt een auto, er is een kantoortuin, er huilt een peuter. Er is wachtmuziek van een systeem waarin de beller zelf ook wacht. Een detector die is afgesteld om in een studio goed te werken leest een flink deel daarvan als spraak, en elke valse detectie onderbreekt je agent of overtuigt hem ervan dat de beller nog praat terwijl die op antwoord wacht.
| Omstandigheid | Wat het met detectie doet | Praktische reactie |
|---|---|---|
| 8 kHz smalband | Zachtere medeklinkers en sisklanken vallen weg, waardoor spraakaanzetten minder scherp zijn dan de detector verwacht. | Neem een drempelwaarde niet rechtstreeks over uit een breedbandbenchmark. Stel hem opnieuw af op echte gespreksaudio. |
| Comfortruis | Een kanaal dat permanent niet stil is, waardoor een simpele energiedrempel nooit stilte ziet. | Gebruik een detector op basis van een model in plaats van een simpele energiepoort. |
| Spraak op de achtergrond | Echte menselijke spraak die niet van je beller is. Detectoren signaleren dat terecht en handelen er ten onrechte naar. | Eis een minimale duur voordat je een onderbreking vastlegt. |
| Wachtmuziek en belsignaal | Gestructureerde audio die makkelijk voor stem wordt aangezien. | Bewaak de toestandsmachine en niet alleen de detector: een agent die nog niet in gesprek is, hoort niet onderbreekbaar te zijn. |
| Denkpauzes en haperingen | De beller is niet klaar, maar de stiltereeks is al begonnen. | Geef de beurtdetectie een plafond in plaats van een vaste korte teller, zodat een twijfelgeval ruimte krijgt. |
De valse onderbreking, en wat je daarna doet
De nuttigste knop op dit hele terrein is een minimale onderbrekingsduur: een regel die zegt dat een flard gedetecteerde spraak op het bellerkanaal pas als onderbreking telt als ze lang genoeg duurt om een woord te zijn. Een kuch, een deur, een lettergreep uit andermans gesprek zakken alle drie voor die test en je agent praat gewoon door.
agent speaking: "Your appointment is confirmed for Tues-"
[vad] speech detected on caller channel 0.12s
[turn] below minimum interruption duration (0.30s)
[vad] caller channel silent again 0.19s
---> not an interruption. agent keeps speaking.
agent speaking: "Your appointment is confirmed for Tues-"
[vad] speech detected on caller channel 0.34s
[turn] interruption committed, agent stops
[stt] caller said: "sorry, Wednesday"
---> real interruption. agent yields.Op onze eigen keten ligt die drempel op 300 milliseconden, naar beneden bijgesteld vanaf de 500 die het framework standaard aanhoudt. Wij gaan bewust onder die standaard zitten, omdat een werkelijk ongeduldige beller op een echte telefoonlijn resoluut begint te praten, en een halve seconde wachten voordat je de beurt afstaat lang genoeg is om twee mensen tegelijk aan het woord te hebben, wat precies de situatie is die barge-in moet voorkomen.
De interessantere vraag is wat er gebeurt als er tóch een valse detectie doorheen glipt, want dat gebeurt altijd. Naïeve implementaties stoppen de agent midden in een zin, wachten op een transcriptie die nooit komt omdat het geluid geen spraak was, en laten beide partijen in stilte achter tot de beller iets zegt. Die beller heeft geen idee dat de agent die zin ooit nog zou afmaken.
[turn] interruption committed, agent stops mid-sentence
[stt] ...no transcript. line noise, not speech.
[turn] false interruption timeout reached (1.5s)
---> agent resumes its own sentence instead of standing thereDe oplossing is een tijdslimiet met een hervatting: leverde een onderbreking binnen anderhalve seconde geen transcriptie op, behandel die dan als vals en laat de agent zijn eigen zin afmaken. Dat verandert een dood gesprek in een nauwelijks merkbare hapering, en dat is het verschil tussen een agent die wankel overkomt en een agent die beheerst overkomt.
De knop waar je werkelijk aan draait
Zodra je de twee taken uit elkaar haalt, zien de instellingen er niet langer uit als een configuratiebestand maar als een productbeslissing. Ze wegen stuk voor stuk dezelfde twee faalvormen tegen elkaar af, en er is geen combinatie die ze allebei wegneemt.
Gretig om de beurt af te staan, snel met antwoorden
- Voelt vlot aan, dicht bij een menselijke gespreksstilte
- Onderbreekt bellers die nadenken of een nummer hardop lezen
- Achtergrondspraak en lijnruis leggen de agent midden in een zin stil
- Het beste voor korte, transactionele gesprekken met een bekend script
Geduldig, moeilijk te onderbreken
- Laat mensen uitpraten, verdraagt rumoerige lijnen en trage sprekers
- Voegt dode lucht toe aan elke afzonderlijke wisseling in het gesprek
- Een ongeduldige beller moet over de agent heen praten om gehoord te worden
- Het beste voor open gesprekken, oudere bellers en slechte verbindingen
Dit weegt zwaarder dan het lijkt, omdat de vloer van de beurtdetectie een harde ondergrens is voor hoe snel je agent überhaupt kan antwoorden. Zet je die hoog om valse onderbrekingen te bestrijden, dan heb je stilletjes de vlotheid van het hele product afgetopt, op een manier die geen enkele modelupgrade ooit terughaalt. Dat argument hebben we ontleed in het latency-budget van een telefoongesprek, waar beurtdetectie de grootste afzonderlijke post in een gat van een seconde blijkt te zijn.
Begrens het, zet het niet vast
Wie aan de knop zit: keten of aanbieder
Hier zit een structurele tweesprong waar teams op stuklopen als ze van architectuur wisselen. In een klassieke keten van herkenning, model en synthese bepaal jij de beurtwisseling: de detector draait aan jouw kant en jij bepaalt elke drempelwaarde. In een native-audio realtime-model hoort de beurtwisseling bij de aanbieder, en krijg jij de knoppen die hij beschikbaar stelt.
| Keten | Realtime (speech-to-speech) | |
|---|---|---|
| Wie bepaalt wanneer een beurt eindigt | Jouw detector, lokaal op de audio | De aanbieder, binnen zijn model |
| Wat je kunt afstellen | Drempels, minimumduren, het venster voor het beurteinde | De handvol parameters die de aanbieder aanbiedt |
| Instelbaar per assistant | Platformbreed gedrag, één keer afgesteld op telefoonaudio | Ja, per assistant, binnen het bereik van de aanbieder |
| Waar je op moet letten | Instellingen overgenomen uit breedbandbenchmarks | Stilzwijgend genegeerde parameters en standaardwaarden die per model verschillen |
Aan de realtime-kant stellen we de beurtdetectie-parameters van de aanbieder per assistant beschikbaar in plaats van ze te verbergen, met het bereik begrensd zodat een typefout geen gesprek kan opleveren dat nooit de beurt afstaat. Bij een waarde buiten bereik loggen we een waarschuwing en houden we de standaard aan, want een foute configuratie hoort terug te vallen op verstandig gedrag in plaats van een lopend gesprek onderuit te halen.
llm_config.turn_detection = {
"threshold": 0.5, // 0.0 - 1.0 hoeveel signaal als spraak telt
"prefix_padding_ms": 300, // 0 - 2000 audio bewaard van vóór de aanzet
"silence_duration_ms": 200 // 100 - 2000 stilte voordat de beurt sluit
}Twee van die parameters stellen we bewust helemaal niet beschikbaar, en die reden is het waard om te benoemen: de aanroepen die een modelantwoord aanmaken en onderbreken vormen de bouwstenen van de gesprekslus. Een klant een van beide laten uitzetten levert een assistant op die geen gesprek kan voeren, en dat is een supportticket en geen functie.
Ook de standaardwaarden verschillen per model op manieren die je makkelijk mist. Waar een realtime-model dat dicht tegen tekst aan zit een beurt al na tweehonderd milliseconden stilte kan sluiten, zetten wij een native-audiomodel standaard op een aanzienlijk langer venster en op de minst schrikachtige gevoeligheidsstand die er is, juist zodat een geluid op de achtergrond tijdens een pauze geen beurt opent. De getallen van de ene aanbieder overnemen bij de andere is een betrouwbare manier om een werkende agent kapot te laten aanvoelen.
Waarom we de clouddetector uit het gesprekspad haalden
Er is een populaire optie op dit terrein: beurtdetectie uitbesteden aan een gehoste dienst die met een slimmer model voorspelt of een zin inhoudelijk af is, en niet alleen akoestisch stil. Dat werkt bij twijfelgevallen echt beter. Wij hebben hem gedraaid, en in juli 2026 zijn we bewust teruggegaan naar detectie die lokaal draait.
Drie redenen, in volgorde van hoe zwaar ze wogen. Ten eerste zette het een netwerkverzoek naar een dienst van derden rechtstreeks in het pad van het lopende gesprek, en dat is juist de plek in een telefoniesysteem waar een extra afhankelijkheid het minst welkom is. Ten tweede zat er een verzoeklimiet aan die bij ons volume ruim voldoende was en de schaal waarvoor we bouwen niet zou overleven, waarmee het een plafond wordt in plaats van een bouwsteen. Ten derde, en dat gaf de doorslag: als die dienst traag antwoordde, viel het framework zonder iets te melden terug op gewone lokale detectie, waardoor ons beurtgedrag stilletjes meeveranderde met de reactietijd van iemand anders.
Wisselvallig is erger dan onvolmaakt
Dat is dezelfde redenering die we op failover en op configuratie in het algemeen toepassen: een systeem dat luid faalt is veiliger dan een systeem dat stil terugvalt. Het is ook waarom de lokale detectorinstellingen hierboven platformbreed zijn en niet per assistant. Ze beschrijven hoe onze agents naar een telefoon luisteren, en dat hoort niet per klant te verschillen zonder een gesprek over het waarom.
De andere helft: als de beller niets zegt
Alles hierboven gaat uit van een beller die te veel praat of op het verkeerde moment. Het omgekeerde geval komt vaker voor dan teams verwachten en wordt meestal slechter afgehandeld: de beller die helemaal niets zegt. Hij legt de telefoon neer om een polisnummer te zoeken, of hij belt handsfree in de auto, of hij had simpelweg niet door dat hij aan de beurt was.
Een naïeve agent wacht eindeloos, houdt de lijn open en factureert minuten voor stilte. De vorm die wel werkt is een korte ladder in plaats van één tijdslimiet: merk het snel op, spreek de beller vriendelijk aan, en geef pas daarna op. Wij vragen na een paar seconden of de beller er nog is, spreken de beller op een vast interval opnieuw aan, staan drie pogingen toe en beëindigen het gesprek netjes als er niets terugkomt, in plaats van de lijn open te laten staan.
- 01
Scheid een pauze van een afwezigheid
Dit zijn verschillende toestanden met verschillende tellers. Een denkpauze van twee seconden met dezelfde logica behandelen als een afwezigheid van dertig seconden levert je een agent op die zeurt. - 02
Spreek de beller opnieuw aan voordat je afbreekt
Eén korte vraag redt een verrassend deel van de stille beurten. Bellers die even weggelopen waren komen terug, en het gesprek loopt gewoon door. - 03
Begrens de pogingen en beëindig bewust
Drie keer proberen is genoeg. Afsluiten met een duidelijke reden geeft je een eenduidige eindtoestand in je rapportage, in plaats van een vaag verbroken gesprek dat je niet kunt tellen. - 04
Maak de uitkomst zichtbaar
Een stilte-time-out hoort een eigen eindreden te zijn. Belandt die in dezelfde bak als een beller die ophangt, dan verlies je precies het signaal dat je vertelt dat je te traag reageert of dat je lijn eenrichtingsverkeer is.
Barge-in afstellen is geen detail dat je oppakt als de prompt eenmaal klopt. Het is het verschil tussen een agent waar mensen tegen praten en een agent waar mensen overheen praten.
Klinkt je agent op papier al goed en klinkt hij aan de telefoon nog steeds verkeerd, dan zit het probleem meestal hier en niet in de formulering. Een verwante faalvorm die je eerst wilt uitsluiten is een audiopad dat vanaf het begin al niet gezond was, en dat behandelden we in de SIP-logs lezen als gesprekken mislukken.
Over de getallen De minimale onderbrekingsduur van 300 milliseconden, de time-out van 1,5 seconde voor valse onderbrekingen met hervatting, de vloer van 400 milliseconden en het plafond van 2 seconden voor het beurteinde, de vereiste van 400 milliseconden stilte, de activatiedrempel van 0,4 en de ladder van drie pogingen bij stilte zijn de waarden waarmee ons eigen platform draait, samen met de standaardwaarden van het framework die als vertrekpunt dienden. De parameters voor beurtdetectie in realtime en hun toegestane bereik zijn die uit onze API-specificatie. De overstap weg van een gehoste beurtdetector vond plaats in juli 2026, om de drie beschreven redenen. Smalbandige telefonie, comfortruis en pakketisering gedragen zich zoals in elke SIP-omgeving en zijn niet specifiek voor ons platform.
