Barge-in without cutting the greeting in half
Interruption and a clean opening pull against each other, so Connect separates them rather than compromising. The greeting is synthesised before pickup and played with the caller's audio muted; interruption handling applies to everything after it. Speech detection is then deliberately sensitive, so a one-word answer starts a turn, and a voice still talking two seconds after the caller spoke over it is recorded as an ignored interruption.
Two requirements that fight#
A caller must be able to cut in. A caller who says *I already spoke to someone* four words into a greeting and is talked over for another eight seconds has learnt that nobody is listening. So detection wants to be sensitive.
The same sensitivity destroys the opening. A cough, a door, a *hello?* overlapping the first syllable — any of them will halt a greeting mid-clause and leave the call starting from an unrecoverable position, because the caller now has half a sentence and no idea who they reached. Turning sensitivity down to protect the greeting makes every later interruption worse.
The resolution is that the two are not the same problem. The opening is a fixed, known utterance that must be delivered; everything afterwards is generated dialogue that must be interruptible.
The opening is protected before pickup#
During the ring, the greeting is synthesised by Gemini TTS rather than generated by the live model, which refuses
say()outright.Result A finished audio buffer exists before anyone answers.
The instant the caller picks up, the buffer is played with
say(audio=…)and the caller's audio is muted for its duration.Result No detector can halt it, because nothing is being detected.
Warm processes hold the synthesised line in a
LineCachekeyed by workspace, TTS model, voice, style, language and text.Result Inbound greeting delay went from 3.0 s to 0 ms; a cache miss falls back to live synthesis rather than failing.
Muting the caller for the opening is a deliberate cost: a caller who starts talking during the greeting is not heard for those seconds. It is accepted because the instructions then tell the model the opening has already been said, so the reply that follows answers the caller instead of introducing itself again. Re-introductions across the audited calls went from 1–4 per call to zero.
How an interruption is judged afterwards#
| Control | Setting | Effect |
|---|---|---|
start_of_speech_sensitivity | HIGH | A one-word *yes* starts a turn instead of being swallowed |
| Interruption threshold | Seconds and words, in the Voice Lab | How much speech counts as cutting in rather than a noise |
| Barge-in tolerance | 2 s | Past this, the reply is recorded as an ignored interruption |
| Presence guard | 2.5 s | Nothing is spoken into the line while the caller speaks or was heard within this window |
resume_false_interruption | Off on the host path | A stopped reply is not resumed over the caller |
The tolerance is a measurement rather than a judgement: barge_in records how long the voice kept talking once the caller started, and the review counts the ones past two seconds. That makes *it talks over me* a number that can be shown to have fallen.
The false-interruption trap#
The mirror-image failure is stopping when nobody interrupted — a background voice, a lorry, a line echo. The usual remedy is to resume the halted reply once the interruption is judged false. On the host turn-detection path (rt_turn_detection=connect_semantic, Silero VAD plus the audio end-of-turn model in-process) that remedy was switched off, because there is no transcript to judge falseness by and every resume landed on top of a caller who really was speaking. Two failures were traded for one.
What is still unsolved#
- Interruption quality is bounded by the model's own detection on the model path; the host path only works when the model's detection is switched off.
- On Gemini 3.1 Flash Live no check-in and no goodbye is spoken at all, because the fallback TTS carries the live voice's name and not its sound — the silence is recorded and the hang-up watcher ends true abandonment without a word.
- A caller who speaks during the protected greeting is genuinely unheard for that period. No measurement exists here of how often that happens: UNKNOWN.
- Nothing above removes the floor. The best measured median reply on the realtime path is 3.3 s, and an interruption cannot be answered faster than the model can start.
Questions#
Why mute the caller instead of just making the greeting short?
A short greeting still gets cut in its first syllable by a cough, and shortening it removes the business name a caller needs. Muting bounds the problem to a known utterance of known length, and the prewarmed buffer keeps that length from growing — the greeting itself starts in 0 ms rather than after 3.0 s of synthesis.
Does a sensitive detector not cause constant false stops?
It causes some, which is why they are counted rather than assumed away. The trade was measured on the host path: resuming after a suspected false stop produced more talking over real callers than the false stops themselves cost, so resume is off and the sensitivity stays high.
Can the two-second tolerance be changed?
The interruption threshold in seconds and words is a Voice Lab engine knob and resolves through the normal order — workspace, then profile by purpose, by line number, by contact, then a Lab draft on a test call. The two-second figure is the review's reporting tolerance, which is what keeps findings comparable between calls.