voice block of agent.json. telnyx-acp set voice.<knob> <value> changes one knob, and the next deploy ships it. Phone calls do not reach dev; with web set, the page’s mic button under dev tries the greeting, bargeIn, keypressInterrupts, stt and tts locally, while eager, filler and harness show on the deployed agent only.
Phone Numbers
deploy puts the number on a Call Control application and points its webhook at the agent. A number that is missing from the account, or not active yet, stops the deploy. telnyx-acp status shows whether the webhook still points at the agent. remove phone plus the next deploy, or delete, put the number back where it was. The same number answers texts, which Messaging covers.
A caller hears ringing while the agent instance is placed, typically one to three seconds. The agent then speaks the greeting. Each thing the caller says is a turn, and by default it goes straight to the model and the reply is spoken sentence by sentence. The caller talking over the agent stops it.
voice.harness: true runs the harness per turn instead, with the tools on the call, at the cost of a second or more before the first word; a turn on a call is not a durable run. A tool marked ask stays out of calls, since a call cannot wait for an approval.deploy wires, The Call Webhook for answering, and The Voice Loop for each turn.
STT
stt tunes when a caller’s turn is over. validate holds each value to its range.
Three settings beside it decide what happens at the boundary:
TTS
The reply is passed to TTS sentence by sentence as the model writes it, which is why the instructions for a voice agent ask for short spoken sentences.
Filler
When the model is slow to start, the call says a short phrase so the caller hears that the agent is there. It is on by default.filler.afterMs, 700 by default (100 to 5000), is how long after the caller is confirmed done the phrase is said; filler.phrases are one to ten short sentences said in turn, “One moment.”, “Let me check that for you.” and “Sure, just a second.” by default; filler.maxPerCall caps how many turns in one call are filled, 0 for all of them. telnyx-acp set voice.filler false turns it off. The phrase is spoken, never written to the message log or to memory, and each one is a voiceFiller line in the logs.
Optimize for Latency
On a call the number that matters is the time from the caller falling silent to the first reply audio. On the default settings it is about one second, measured with hosted Llama 3.3 70B and Telnyx STT and TTS. Every choice below adds to that second or takes from it.
Placement is mostly off that path: the instance is woken while the phone is still ringing, for up to four seconds; past that the call is answered anyway and the first turn carries the start-up.
stt.eotTimeoutMs is the longest silence before a turn ends regardless: raise it for callers who pause mid-sentence, lower it for snappier turns. stt.eagerEotThreshold and stt.eotThreshold are the confidences for the early signal and the confirmed one; STT has the ranges. With memory on, the summary read is bounded at one second, and a slow read means the first turn runs without it rather than waiting.
Measure
Calls need a phone: call the number. Each call writes one JSON line per event,voiceWake, voiceCall, voiceTurn, voiceFiller and modelStream among them, and every turn’s voiceTurn line carries toFirstAudioMs and the milliseconds to each stage, so a change can be judged on the next call rather than by ear:
dev print the same voiceTurn line in the terminal, on the direct engine without eager starts, so they measure the model and the speech services rather than a deployed call.
Beta Limitations
- Speech settings. STT and TTS run with their default language and model.
voice.stttunes end-of-turn detection only, andvoice.ttspicks the voice and passes provider settings through. - TeXML applications. A
texml_applicationchannel is declared, validated and wired, but its handler is not implemented, and a webhook to it answers 501. Calls go through a phone number or acall_control_applicationchannel.