Start Speaking Plan: wait seconds live
What it is. The answer delay: how long the agent waits after it believes the caller has finished before it starts speaking its reply. Lower feels snappy; higher gives pause-heavy callers room to keep going.
Runtime. Feeds the user_speech_timeout of the stop strategy (base_service.py:1497-1503,1537). In chat-mode the userTurnStopTimeout safety-net is clamped to waitSeconds + 0.1 (see Part 7).
base_service.py:1497). You will observe 0.6s behavior, not 0.4s. Always set waitSeconds explicitly when tuning instead of relying on the default.
- When to change: lower toward 0.2–0.3 for a snappy, conversational feel in clean audio; raise toward 0.8–1.0 for pause-heavy callers who think mid-sentence, so the bot does not jump in early.
Symptom it fixes: "awkward gap before the bot replies" → lower it. "the bot jumps in before I finish" → raise it (and check Part 7 VAD stop delay).
Stop Speaking Plan: number of words live
What it is. The barge-in threshold: how many words the caller must say before their speech interrupts the bot mid-utterance. This is the single most important knob for noisy call centers.
Runtime. Selects the start strategy (base_service.py:1471-1490): 0 ⇒ DynamicVADUserTurnStartStrategy (pure-VAD barge-in — any detected speech interrupts), ≥1 ⇒ DynamicMinWordsUserTurnStartStrategy(min_words=N) (needs N words before interrupting).
- When to change: raise to 2–3 in noisy call centers so a stray cough or background "evet" does not kill the bot's sentence; set to 0 for a maximally interruptible, conversational feel in clean audio.
Symptom it fixes: "background noise keeps stopping the bot mid-sentence" → raise it. "I say 'stop' and it keeps talking" → lower it (or add an interruption phrase, Step 13).
Acknowledgement phrases live
What it is. Short backchannels ("evet", "hı hı", "tamam") that should not interrupt the bot — the caller is just signalling they are listening, not trying to take the turn.
Runtime. base_service.py:1473,1488. Only a whole-utterance match counts as an acknowledgement (it will not interrupt). Disabled in the UI when numberOfWords = 0, because pure-VAD mode does no word matching at all.
- When to change: add the exact backchannels your callers actually use, so they do not accidentally truncate the bot mid-sentence.
Symptom it fixes: "when I say 'okay'/'evet' to show I'm listening, it stops talking" → add those words here.
Interruption phrases live
What it is. Phrases that force an immediate interruption even before the word threshold is met ("dur", "bekle", "hayır hayır"). This is the hard stop-word path.
Runtime. base_service.py:1474,1489; bypasses numberOfWords entirely to stop the bot instantly. A one-word "dur" interrupts even when numberOfWords is 3.
- When to change: give callers hard stop-words even when you have raised
numberOfWordsfor noise immunity. This is how you get both noise resistance and responsive stopping — the two paths do not conflict.
Symptom it fixes: "I have to repeat 'stop' three times before it listens" → add those stop-words here.
Voice seconds dead
What it is. Nominally, how much continuous voiced audio counts toward stopping the bot.
voiceSeconds — changing it does nothing at call time. Note also the default mismatch: the validator says 0.4 while defaults.ts says 0.3. Do not promise a customer a barge-in fix via this knob; use numberOfWords + interruption phrases instead. (Verify with your pair — it may be wired in a newer branch.)
Symptom it fixes: none it can fix today — included here only so you do not waste a tuning cycle on it.
Back off seconds dead + hidden
What it is. Nominally a cooldown after an interruption.
backOffSeconds, and worse, the UI slider is rendered inside a hidden div (tts-config-panel.tsx:1076), so it is not even user-visible in the dashboard. Never tune it (today).
Symptom it fixes: none.
Try it — barge-in simulator
The bot speaks for the band below. The caller starts talking somewhere inside it. Whether the bot actually stops depends on three things: how many words the caller spoke, the numberOfWords threshold, and whether the caller's phrase is on the interruption-phrases list (which bypasses the threshold entirely).
base_service.py:1471-1490 and explain how numberOfWords picks between DynamicVADUserTurnStartStrategy and DynamicMinWordsUserTurnStartStrategy, and where the interruption-phrase shortcut bypasses the word count."Try it — answer-delay (waitSeconds)
The caller finishes at the marker. The bot waits waitSeconds before it starts replying. Watch the gap.
Reminder: if this field were absent from the config, the runtime would use 0.6 (base_service.py:1497), not whatever the slider shows. Set it explicitly.
Try it — acknowledgement vs interruption matcher
Interruption list: dur, bekle, stop, hayır hayır. Acknowledgement list: evet, tamam, hı hı, okay. Matching is whole-utterance.
Tying barge-in to symptoms (recipe)
The fast lookup from "what the customer says" to "which knob to turn". When two knobs are needed they do not conflict.
| Symptom | Knob move |
|---|---|
| Bot interrupted by call-center background chatter | numberOfWords 1 → 2 or 3 |
| Caller can't interrupt at all | numberOfWords → 0, or add interruption phrases |
| "Okay"/"evet" stops the bot | add to acknowledgement phrases |
| Want noise immunity and instant stop on command | keep numberOfWords high + add interruption phrases |
| Awkward gap before bot replies | lower waitSeconds |
| Bot jumps in before caller finishes | raise waitSeconds (and see Part 7 VAD) |
Checkpoint
Noisy call center: callers complain the bot both gets cut off by noise and ignores them when they say "dur". One change to fix both?
You can't do it with one knob, but you can with two that don't conflict: raise numberOfWords to 2–3 (noise immunity) and add "dur" to interruptionPhrases (instant stop bypasses the word threshold). The interruption-phrase path ignores numberOfWords entirely, so you keep noise resistance while still giving the caller a reliable hard stop-word.
ttsConfig.stopSpeakingPlan.voiceSeconds and backOffSeconds have any consumer in pipecat-agent (grep both keys), and show me the hidden div at tts-config-panel.tsx:1076 that wraps the back-off slider."