ConversationRelay vs Media Streams for AI Agents - Zian AI

ConversationRelay vs Media Streams for AI Agents

Quick answer: Choose Twilio ConversationRelay if your AI agent thinks in text and you want Twilio to run speech-to-text, text-to-speech and barge-in for you. Choose bidirectional Media Streams if you need a speech-to-speech model, your own STT/TTS, or raw 8,000 Hz μ-law audio. On Twilio’s US price list (current as of August 2026), ConversationRelay costs $0.07 a minute and Media Streams $0.0044, each added to the voice minute.

Both products put a live Twilio Programmable Voice call onto a WebSocket that your server holds, and both start from a <Connect> TwiML verb. What differs is what travels over that socket. With <Connect><ConversationRelay>, Twilio’s documentation says “Your application receives transcribed caller speech in structured messages and sends responses as text”. With <Connect><Stream>, you get base64 audio frames and send audio frames back. Everything else on this page follows from that one difference: who owns speech recognition (Deepgram or Google inside Twilio, or your own vendor), who owns the voice (ElevenLabs, Google or Amazon Polly inside Twilio, or yours), who decides that the caller has interrupted, and which of the two meters you pay. Twilio writes the product as “Conversation Relay” in prose and <ConversationRelay> in TwiML; this page uses the TwiML spelling. Every Twilio fact below was read on twilio.com on 26 September 2026 and is listed with its link at the end.

Should I use Twilio ConversationRelay or Media Streams for my AI voice agent?

Answer four questions before you look at a price, because each one can settle the choice on its own.

1. Does your model take audio in and give audio out? If you run a speech-to-speech model, ConversationRelay has nowhere to put its output. Its outbound messages are text tokens that Twilio synthesises, play messages that point at a media URL, sendDigits, a language switch and end. None of those five carries a live audio stream you generated. Bidirectional Media Streams exists for exactly that: Twilio’s overview gives “a real-time voice conversation with an AI assistant” as its example use case.

2. Does your agent need to press keys? An outbound agent that has to get through a phone menu needs to send DTMF tones. ConversationRelay has a sendDigits message that accepts the characters 0 to 9, w, # and *. Twilio’s Media Streams overview says that on a bidirectional stream DTMF works “only in the inbound direction” and that “Sending DTMF outbound from your media server toward Twilio is not supported.” Both paths can receive a caller’s keypress; only ConversationRelay has a documented message for sending one over the socket. On a Media Streams call the documented options sit outside the stream: the Calls API SendDigits parameter dials a fixed string of keys when an outbound call connects, and Twilio’s support centre says in-band DTMF tones in G.711 audio are passed through untouched, but does not document tones generated inside a Media Stream, so test that before you rely on it.

3. Where must the audio be processed? Media Streams documentation states you can use it in the Ireland (IE1) and Australia (AU1) Regions. For ConversationRelay, Twilio’s product FAQ answers “Is Conversation Relay regionalized?” with “It depends on which provider options are selected. Regionalized: Amazon, Google. US1: Deepgram.” Deepgram is the default speech-to-text provider for accounts that began using ConversationRelay on or after 12 September 2025, so for those accounts the default speech recognition is the US1 one. Twilio’s own pages do not fully agree: the default-voice table on its voice configuration page lists Google as the transcription provider for every language, and the FAQ’s regional answer does not mention ElevenLabs, the default text-to-speech provider, at all. If audio must stay in IE1 or AU1, set both transcriptionProvider and ttsProvider explicitly and confirm the Region with Twilio.

4. Who on your team will own turn-taking? On ConversationRelay, end-of-turn timing, interruption sensitivity and backchannel filtering are TwiML attributes. On Media Streams they are code you write, test and keep tuning. If nobody owns that code, the attribute route is the realistic one.

If none of the four settles it, the price does, and the arithmetic is further down.

What does each option actually do on a live call?

The table puts the documented behaviour side by side. Each Twilio cell comes from the Twilio docs pages listed in the source table at the end of this page.

Criterion ConversationRelay (<Connect><ConversationRelay>) Bidirectional Media Streams (<Connect><Stream>)
What your server receives JSON prompt messages carrying transcribed text, a lang and a last flag JSON media messages carrying base64 raw audio, inbound track only
What your server sends Text tokens, play (media URL), sendDigits, language, end media (audio), mark, clear
Speech-to-text Twilio-hosted: Deepgram (default for accounts new since 12 September 2025) or Google; the product FAQ also lists Amazon, which the TwiML reference does not accept Yours: any vendor or model you connect
Text-to-speech Twilio-hosted: ElevenLabs (default), Google or Amazon Yours: any vendor or model, or a speech-to-speech model’s audio
Audio format you handle None, you handle text audio/x-mulaw, 8,000 Hz, 1 channel, both directions, no file header bytes
End of turn speechTimeout 600 to 5,000 ms (default auto); eotThreshold 0.5 to 0.9 (default 0.8) on Deepgram Flux You build it (VAD or your STT vendor’s endpointing)
Caller interrupts the agent interruptible, interruptSensitivity (default high), ignoreBackchannel; an interrupt message tells you what was spoken before the cut You detect it, then send clear to empty Twilio’s buffer; mark messages tell you what had played
Caller keypress (inbound DTMF) Yes, with dtmfDetection Yes, dtmf message on bidirectional streams
Agent sends DTMF (outbound) Yes, sendDigits Not supported over the socket; a fixed digit string at dial time via the Calls API SendDigits parameter
Caller’s number on the socket In the setup message (from, to, direction) Not in the start message; pass it yourself as a <Parameter>
Languages 36 language codes in Twilio’s default-voice table; mid-call switching; automatic detection with multi needs Deepgram STT and ElevenLabs TTS Whatever your STT and TTS vendors support
If the WebSocket drops No reconnect; call ends as failed unless your <Connect> action URL returns new TwiML Your fallback is TwiML placed after <Connect><Stream>, which Twilio executes once your server closes the socket
Capacity note 900 concurrent sessions per account on a single host (error 64109), per a Twilio support article that says this is not a fleet-wide limit One bidirectional stream per call
Regions Amazon and Google providers regionalised; Deepgram US1 (product FAQ) US1 default; IE1 and AU1 supported
US price on top of the voice minute $0.07 / min $0.0044 / min

One row surprises most teams. On ConversationRelay the setup message already carries the caller’s number; on Media Streams it does not, and the agent greets a stranger unless you forward it. Our walkthrough on getting the caller’s number into an AI voice agent before the greeting covers the <Parameter> route and its 500-character limit.

Who handles interruptions and turn-taking on each path?

On ConversationRelay, interruption is configuration. The interruptible attribute accepts none, dtmf, speech or any, and defaults to any. interruptSensitivity defaults to high, which Twilio calls “the most responsive and easiest to trigger”; medium “reduces false interrupts” and low “requires more confident, longer speech”. ignoreBackchannel filters “yeah,” “uh-huh,” and “okay” so they do not cut the agent off. When a caller does cut in, Twilio sends an interrupt message with utteranceUntilInterrupt and durationUntilInterruptMs, so your conversation history can record what the caller actually heard rather than what the model generated.

Two defaults are worth checking on day one. First, reportInputDuringAgentSpeech now defaults to none; Twilio notes “The default was any before May 2025”, so code written against older examples may expect speech that no longer arrives while the agent talks. Second, high sensitivity with ignoreBackchannel left at false is the most responsive combination Twilio offers, so it is the first pair to adjust if the agent keeps stopping mid-sentence on a noisy line.

On Media Streams, interruption is a pipeline you own. You decide the caller has started talking (voice activity detection, or your STT vendor’s speech-started event), then send a clear message. Twilio’s specification says clear “empties all buffered audio and causes any mark messages to be sent back”, and the returned marks are how you learn which of your audio chunks were never played. None of this is hard to write. It is hard to tune, because every threshold interacts with line noise, the STT vendor’s endpointing and the length of the audio chunks you send.

ConversationRelay turns barge-in into a few TwiML attributes; Media Streams turns it into a subsystem you maintain.

Which is faster: ConversationRelay or Media Streams?

Twilio publishes a figure for one path only. The ConversationRelay product page claims under 0.5 seconds median latency and under 0.725 seconds at the 95th percentile, footnoted “Based on internal benchmarks with Conversation Relay (p50 491 ms, p95 713 ms) using different models. Results may vary.” The page does not say where that clock starts and stops, so treat it as Twilio’s number for Twilio’s setup, not a prediction for yours. Our breakdown of what vendor voice-latency numbers actually measure explains why two honest figures can differ by hundreds of milliseconds.

The structural difference is where the speech engines sit. Twilio’s FAQ says ConversationRelay runs on “Dedicated, single-tenant, customized infrastructure colocated with call and media edges”, so recognition and synthesis happen next to the call. On Media Streams, audio leaves Twilio for your server, your server calls your STT vendor, your model, then your TTS vendor, and the audio comes back. Each hop is a network round trip that you place. Whether that comes out faster or slower than ConversationRelay depends on where you place those hops, and we found no comparable Twilio figure for Media Streams on the pages we read. The one latency lever both share is streaming: Twilio’s ConversationRelay best-practice page recommends sending LLM text tokens “as soon they become available instead of waiting”, and the same principle applies to audio chunks on Media Streams.

What does ConversationRelay cost compared with Media Streams?

Both are billed on top of the Programmable Voice minute. From Twilio’s US voice pricing page, marked “Pricing current as of August 2026” and read on 26 September 2026:

Line item (Twilio US, pay-as-you-go) Price
Outbound call, United States and Canada $0.0140 / min
Inbound call to a local number $0.0085 / min, plus $1.15 / month per number
Media Streams $0.0044 / min
Conversation Relay $0.07 / min

The gap between the two add-ons is $0.07 minus $0.0044, which is $0.0656 a minute. We call this the $0.0656 rule: if the $0.07 covers Twilio’s own speech engines (Assumption C below), bidirectional Media Streams is only the cheaper path when your own speech-to-text, text-to-speech and media-server costs together stay under $0.0656 per minute of call. The carrier minute and your language model are paid on both paths, so they cancel out of the comparison. (If you move to a speech-to-speech model on Media Streams, your model bill changes too; our cost-per-minute comparison of realtime and pipeline voice AI prices that separately.)

One billing detail makes short calls dearer on the Media Streams path. Twilio’s support article on minute rounding says “any partial minutes (under 60 seconds) are rounded up to the next full minute” and lists Media Streams among the products the policy covers. ConversationRelay is not in that article’s list of five products, and we did not find its rounding rule on the pages we read, so the worked example below applies the same whole-minute count to every meter to keep the comparison like for like.

A worked monthly cost at three volumes

Every step is shown so you can replace our inputs with yours. Twilio prices are from the table above; the three assumptions are labelled and are not quotes from any vendor.

  • Traffic: outbound US calls, each billed at 5 minutes (a call of 4 minutes 20 seconds rounds up to 5 under Twilio’s rounding policy).
  • Volumes: 400, 2,000 and 10,000 calls a month, which is 2,000, 10,000 and 50,000 billed minutes.
  • Assumption A, your STT plus TTS: $0.02 per minute combined. Replace it with your vendors’ published rates.
  • Assumption B, fixed cost of owning a media server: $1,500 a month for hosting plus the share of an engineer’s time spent on turn-taking, reconnects and upgrades. Replace it with your own estimate.
  • Assumption C, nothing else on the ConversationRelay meter: Twilio’s price list shows Conversation Relay as a single $0.07 line and does not say whether its speech-to-text and text-to-speech are included or billed separately. This example assumes they are included; confirm with Twilio before you rely on the crossover.
  • Excluded from both: your language model, phone numbers, recording and taxes.

Step 1, per-minute Twilio cost on each path. ConversationRelay path: $0.0140 + $0.07 = $0.0840. Media Streams path: $0.0140 + $0.0044 = $0.0184.

Step 2, one 5-minute call. ConversationRelay: 5 × $0.0840 = $0.42. Media Streams before your own engines: 5 × $0.0184 = $0.092, then add 5 × $0.02 = $0.10 for Assumption A, giving $0.192.

Step 3, monthly totals.

Billed minutes / month ConversationRelay path ($0.0840/min) Media Streams Twilio lines ($0.0184/min) + your STT and TTS ($0.02/min, Assumption A) + fixed cost ($1,500, Assumption B) Media Streams path total Cheaper path
2,000 $168.00 $36.80 $40.00 $1,500.00 $1,576.80 ConversationRelay by $1,408.80
10,000 $840.00 $184.00 $200.00 $1,500.00 $1,884.00 ConversationRelay by $1,044.00
50,000 $4,200.00 $920.00 $1,000.00 $1,500.00 $3,420.00 Media Streams by $780.00

Step 4, the crossover. Each minute moved from ConversationRelay to Media Streams saves $0.0656 in Twilio charges and costs $0.02 in your own engines, a net saving of $0.0456. Dividing the fixed cost by that saving gives $1,500 ÷ $0.0456 = 32,895 minutes a month (32,894.7 rounded up). Below roughly 33,000 billed minutes a month, on these assumptions, ConversationRelay costs less. Check: at 50,000 minutes, 50,000 × $0.0456 = $2,280 saved, minus $1,500 fixed, equals the $780 in the table.

Step 5, move the assumptions. If your STT plus TTS costs $0.04 a minute, the net saving falls to $0.0256 and the crossover rises to $1,500 ÷ $0.0256 = 58,594 minutes. If it costs more than $0.0656 a minute, Media Streams never wins on price at any volume. The fixed cost is usually the number teams underestimate, because turn-taking code keeps needing attention after launch.

On these labelled assumptions, ConversationRelay is the cheaper Twilio path below 32,895 billed minutes a month, and the $0.0656 gap only pays for your own media pipeline above it.

What you must build yourself on each path

Neither option is a finished agent. Twilio’s own wording for ConversationRelay is that it “allows your system to focus on processing conversational AI logic”, which means the logic is still yours.

Component ConversationRelay Media Streams
Public wss:// server with X-Twilio-Signature validation You build You build
LLM calls, prompts, tools, memory You build You build
Speech-to-text integration and endpointing Twilio You build
Text-to-speech integration, μ-law 8,000 Hz encoding Twilio You build
Barge-in detection and buffer clearing Twilio (configurable) You build
Text normalisation for speech (dates, amounts, email addresses) You, with elevenlabsTextNormalization as an option You or your TTS vendor
Recovery when the socket drops You, via the <Connect> action URL You, via TwiML after <Connect>
Transfer to a human You: send end with handoffData, then return TwiML from the action URL You: update the live call with new TwiML through the Update a Call resource

There is also a third option that removes Twilio’s media layer altogether: pointing your carrier or SBC straight at a model provider’s SIP endpoint. Our guide to running an AI voice agent on direct SIP with no Twilio in the path covers what you give up when you do.

Who each option is wrong for

ConversationRelay is wrong for you if your agent runs on a speech-to-speech model, because it accepts text and a media URL, not a live audio stream; if you need a speech-to-text or voice vendor the TwiML reference does not list (it names Deepgram and Google for recognition; ElevenLabs, Google and Amazon for voices), bearing in mind the product page mentions bringing your own text-to-speech “for a custom integration” without the reference naming an attribute for it, so confirm with Twilio first; if you want automatic language detection while keeping speech recognition outside US1, since multi requires Deepgram and the FAQ lists Deepgram as US1; or if you intend to use its Conversation Intelligence observability hook in IE1 or AU1, because Twilio’s regional availability page lists Conversation Intelligence (classic) as not yet supported in either Region. It is also the wrong economic choice once your volume is well past the crossover you calculated above.

Bidirectional Media Streams is wrong for you if your agent must choose and press keys mid-call in another company’s phone menu, because Twilio documents no way to send DTMF from your media server over a bidirectional stream (a fixed digit string at dial time is possible through the Calls API); if you have no one to own voice activity detection and buffer management after launch; if you want to fork the same call to a second WebSocket as well, because a call can carry only one bidirectional stream; or if your monthly volume sits below the crossover, where the $0.0656 a minute you save does not cover the pipeline you have to run.

Both are wrong for you if what you actually want is outbound calling that books meetings, with the channel logic, follow-up pacing and script testing already built. That is a platform decision rather than a transport decision. Zian AI runs autonomous phone, SMS, email and WhatsApp sales agents in 30+ languages, with private model deployment on your own infrastructure, and has been running outbound acquisition since 2017. It is in partnership-application beta. Apply For Partnership

Frequently asked questions

Is ConversationRelay just Media Streams with speech recognition added?

No. They are separate TwiML nouns with different message sets. ConversationRelay exchanges text prompts and text tokens with your server, while a bidirectional Media Stream exchanges raw audio. Twilio’s product FAQ describes Media Streams as the option that requires you to manage your own media servers, orchestration and integrations.

Can I use OpenAI Realtime or another speech-to-speech model with ConversationRelay?

Not as a speech-to-speech model. ConversationRelay sends your server transcribed text and expects text tokens back, which Twilio then speaks with its own text-to-speech provider. To pass audio straight between the caller and a speech-to-speech model on Twilio, use a bidirectional Media Stream started with Connect and Stream.

How much does Twilio ConversationRelay cost per minute?

$0.07 a minute in the United States, according to Twilio’s US voice pricing page, which is marked as current as of August 2026. It is charged on top of the voice minute, which is $0.0140 for an outbound US call and $0.0085 for an inbound call to a local number.

Does Twilio Media Streams support DTMF?

Partly. On a bidirectional stream Twilio sends your server a dtmf message when the caller presses a key, but the Twilio Media Streams overview states that sending DTMF outbound from your media server toward Twilio is not supported. Unidirectional streams do not support DTMF at all.

What audio format does Twilio Media Streams use?

Mono audio/x-mulaw at 8,000 Hz, base64 encoded, in both directions. Twilio also warns that audio you send back must not contain file header bytes, or it will be streamed incorrectly.

Can I run ConversationRelay in Australia or Ireland?

Twilio’s product FAQ says it depends on the providers: Amazon and Google are regionalised, while Deepgram is US1. Deepgram is the default speech-to-text provider for newer accounts, and the FAQ does not list ElevenLabs, the default voice provider, under either heading, so set speech-to-text to Google and text-to-speech to Google or Amazon explicitly if your speech processing must stay outside the US. Media Streams is documented as supported in both the IE1 and AU1 Regions.

Where every figure on this page comes from

Figure Who published it Link Date read
Conversation Relay $0.07/min; Media Streams $0.0044/min; outbound US $0.0140/min; inbound local $0.0085/min plus $1.15/month; “Pricing current as of August 2026” Twilio Twilio Voice pricing, United States 26 September 2026
Partial minutes rounded up to the next full minute; five products listed, including Media Streams Twilio Support How are Twilio voice and calling product minutes rounded for billing? 26 September 2026
speechTimeout 600 to 5,000 ms; eotThreshold 0.5 to 0.9, default 0.8; interruptSensitivity default high; reportInputDuringAgentSpeech default changed from any before May 2025; Deepgram default for accounts from 12 September 2025; STT providers Google and Deepgram; TTS providers Google, Amazon, ElevenLabs; multi requires Deepgram and ElevenLabs Twilio TwiML Voice: <ConversationRelay> 26 September 2026
setup message carries from and to; sendDigits accepts 0 to 9, w, # and *; no reconnect on WebSocket drop; interrupt message fields Twilio Conversation Relay WebSocket messages 26 September 2026
36 language codes in the default-voice table (31 ElevenLabs, 5 Google) Twilio Picking a Conversation Relay voice 26 September 2026
p50 491 ms, p95 713 ms; Amazon and Google regionalised, Deepgram US1; infrastructure colocated with call and media edges Twilio Twilio Conversation Relay product page and FAQ 26 September 2026
900 concurrent sessions per account on a single host (error 64109) Twilio Support ConversationRelay concurrency limit 26 September 2026
IE1 and AU1 supported; outbound DTMF not supported on bidirectional streams; one bidirectional stream per call Twilio Media Streams overview 26 September 2026
audio/x-mulaw, 8,000 Hz, 1 channel; clear and mark behaviour Twilio Media Streams WebSocket messages 26 September 2026
Parameter name plus value under 500 characters Twilio TwiML Voice: <Stream> 26 September 2026
Conversation Intelligence (classic) not yet supported in IE1 or AU1 Twilio Regional product availability 26 September 2026
SendDigits: keys to dial after an outbound call connects Twilio Call resource 26 September 2026
In-band DTMF tones in G.711 audio passed through untouched Twilio Support What DTMF types do you support? 26 September 2026
Default-voice table lists Google as transcription provider for all 36 languages Twilio Picking a Conversation Relay voice 26 September 2026
$0.0656 gap, $0.0456 net saving, 32,895-minute crossover, all monthly totals Zian AI, derived from the Twilio prices above plus three labelled assumptions This page, worked calculation 26 September 2026

Related Blogs

Related from Zian AI