Translate both sides of one bridged call so each participant speaks and hears their chosen language.
translation
The claim
Two people who share no language hold one conversation. The caller speaks Spanish and hears the agent’s English as Spanish. The agent speaks English and hears the caller’s Spanish as English. No third party joins, no interpreter is scheduled, and neither side installs anything.
Why it holds
This is a call-level verb, not an AI agent. There is no prompt to write and no model to govern.
How it works
live_translate opens a translation session, then connect bridges the second party. The order matters. connect blocks until the bridge ends, so a live_translate placed after it never runs while anyone is talking.
The schema requires from_lang, to_lang and direction, and two of those carry the behaviour.
direction decides which legs are translated. Its values are remote-caller and local-caller. Listing only one gives one-way translation, which is a transcript read aloud rather than a conversation.
from_voice and to_voice decide what each side hears: the caller hears to_voice, the agent hears from_voice. Omit one and that direction falls back to the default voice.
webhook is where translation events are POSTed while the call runs, with live_events adding partial results and ai_summary a summary at the end. This recipe sets them and stops there, because the event payload is not something it can prove offline.
Limitations
The action union is start, stop, summarize and inject. There is no update, so changing the language pair mid-call means stopping the session and starting a new one.
Translation is sequential: a side hears the other after the utterance completes, not while it is being spoken. Long turns feel like long pauses, so tune vad_silence_ms before blaming the network.
What to change first
Set direction to [remote-caller] alone and call it. Only the caller is translated, which is the difference between an interpreter and a subtitle.