Phrase corrections and pauses
Phrase corrections
A separate cabinet section, Phrase corrections, holds an organization-wide dictionary of “wrong → right” pairs. The replacement is literal: the platform looks for exactly the string you wrote and puts yours in its place. There are deliberately no regular expressions — the people who maintain the dictionary are not programmers, and a mistake in a regex costs more than it saves.- A rule can be bound to one agent; leaving the binding empty means “every agent in the organization”.
- A correction applies both to the audio and to the text in history: the caller hears the corrected phrase and the transcript shows the same one.
- The dictionary is live. Corrections are not frozen into a session snapshot: change the dictionary and the very next utterance comes out corrected, with nothing to restart.
- The agent’s voice panel carries a toggle that enables the dictionary for that agent. It is off by default — existing agents noticed nothing.
The dictionary has no effect in realtime mode. There the speech is synthesized by the model as a whole, and there is simply no point at which the text could be substituted before it is voiced.
Pauses in speech
An agent that reads a phone number or an amount in one breath sounds like a machine. Write[pause N] between two words — N is seconds, from 0.1 to 3.0 — and the agent stops there: Our number is eight [pause 0.4] six six [pause 0.4] two two. The case of the word and extra spaces do not matter; the fractional separator is a dot. The value is rounded to the nearest 0.05 s and pulled to the nearest edge if it is out of range, so [pause 5] is spoken as three seconds and [pause 0] as 0.1 — the phrase is never rejected over its pause.
The tag works in fixed node text, in generated replies, and in everything else the agent says out loud: the opening line, silence reminders, the phrase after a failed transfer, the closing words of an End node. You can also let the model place pauses itself — describe in the prompt when one is wanted and give the tag as the example; a pause the model wrote is handled exactly like one you typed. Copilot knows the tag and will suggest [pause N] rather than a provider-specific form.
What the caller hears depends on the voice. Where the voice supports a pause of an exact length — ElevenLabs on every model except eleven_v3, Cartesia, Inworld, Azure — the pause is real, to within the 0.05-second grid. Where it does not — OpenAI, Soniox, the self-hosted cybernet voice, ElevenLabs eleven_v3 — the platform puts punctuation instead: a comma below 0.4 s, an ellipsis from 0.4 s up. The break is audible, but its length belongs to the voice: measured, punctuation gives between 0.18 and 0.64 s, so [pause 2] on OpenAI sounds like roughly 0.6 s and is indistinguishable from [pause 0.5]. Silence is never inserted as audio — in listening tests that sounded like the line breaking up.
A per-node voice and the reserve voice that steps in when the main one is unavailable each get the pause in the form their own voice understands: the tag is compiled per voice, not once per agent.
Density has a ceiling. Three pauses per request reach ElevenLabs and Cartesia as real pauses (twenty on Inworld, no limit on Azure); from the fourth on, counting left to right, they become punctuation. Voices get unstable when a sentence is stuffed with tags, and three is enough for a phone number if you group the digits.
[pause] without a number is removed, not spoken. So is any unparsed construction that starts with [pause — the word is never read aloud, whatever the typo. A square bracket not followed by pause is ordinary text: [1, 2, 3] is still read as “one, two, three”. The older <break time="0.5s"/> form keeps working and means exactly the same on every voice, including those that never understood it, so existing texts need no rewriting; a half-typed <break is now cut out instead of being read letter by letter.realtime_pause_markup for every place that carries one — a warning, not a block on publishing.

pause_markup event with the status warning is written for a turn only when the compilation lost something: density_capped — the ceiling cut in and the extra pauses became punctuation; value_clamped — a value outside 0.1–3.0 was pulled to the edge; markup_dropped — an unparsed construction or a broken <break was removed. Ordinary compilation writes no event. Separately, a voice with no native pause is recorded once per call as a tts_capability event titled no_native_pause — that is how you tell which case an agent is in without listening. Neither event affects the call’s health verdict.
One accounting caveat: the TTS character counter of a call counts the characters you typed, while the provider bills the compiled text — [pause 0.5] is 11 characters against 20 for <break time="0.50s"/> and 1 for a comma. Expect the provider’s own invoice to differ by about ten characters per pause.
How long to make it. 0.3–0.5 s between groups of digits, after a name, before “right?” — that reads as breathing. 0.8–1.2 s before a question that needs a decision or after bad news. Over two seconds almost never: on the phone that long a silence means “has the call dropped?”, and people start talking over the agent. And not in every sentence — a pause works because the rest of the speech flows.