AI Development

Grok Voice 3.0: Build a Speech-to-Speech Agent (and When Not To)

October 14, 2026
11 min read
Studio microphone on a dark desk with a soft glowing sound waveform behind it
Share:

On October 14, 2026, xAI announced Grok Voice 3.0, its speech-to-speech model for real-time voice agents. The price did not move: $0.08 per minute, the same as Grok Voice 2.0, and anyone calling the grok-voice-latest alias was switched to 3.0 automatically.

Two weeks earlier, on October 1, Microsoft shipped the opposite philosophy: separate streaming transcription and voice models you wire into your own pipeline. Here is how to choose between the two routes, what each costs per minute using only listed prices, and a minimal client you can adapt.

1. The launch facts

xAI’s announcement calls Grok Voice 3.0 “the world’s most intelligent speech-to-speech model”, which is positioning, not evidence. What is concrete: one model that takes audio in and returns audio out over a WebSocket, with server-side voice activity detection, tool calling, 20 listed language codes and billing per minute of conversation.

Microsoft’s October 1 launch has a different shape: MAI-Transcribe-2-Streaming (speech to text), MAI-Voice-2.1 and MAI-Voice-2.1-Flash (text to speech). None of them is a speech-to-speech model, so they are building blocks for the STT → LLM → TTS route. Microsoft Learn labels the streaming transcription model a public preview without an SLA.

Spec sheet

  • • Launch: October 14, 2026 (xAI announcement) — model ID grok-voice-3.0; the alias grok-voice-latest now points to it; grok-voice-2.0 is listed as deprecated
  • • Price: $0.08 per minute ($4.80 per hour), unchanged from 2.0 (xAI pricing page)
  • • Endpoint: wss://api.x.ai/v1/realtime?model=grok-voice-latest — Bearer API key on the server, ephemeral token for browsers
  • • Audio: audio/pcm (default 24000 Hz, 8000 to 48000 supported), audio/pcmu and audio/pcma at 8000 Hz, audio/opus at 24000 Hz
  • • Session: server_vad turn detection, built-in voice eve (default) or custom voices, tools: function, web_search, x_search, file_search, mcp
  • • Microsoft (Oct 1): MAI-Voice-2.1 $22 per 1M characters, MAI-Voice-2.1-Flash $15 per 1M characters, MAI-Transcribe-2-Streaming $0.54 per audio hour (introductory, through the end of the year)

2. What improved vs Grok Voice 2.0

xAI’s post compares 3.0 with 2.0 using numbers collected by Artificial Analysis on October 13, 2026. The Speech-to-Speech Index goes from 81.3 to 86.9, Big Bench Audio (speech reasoning) from 97.2% to 98.5%, and the Speech Agent Arena Elo from 1011 to 1070. Task success barely moves: 94.6% to 94.8%.

The jumps that matter for agents are in conversation mechanics. Full Duplex Bench, which tests pauses, turn-taking and interruptions, goes from 95.1% to 97.0%. τ-Voice, support-call scenarios with accents, background noise and interruptions, goes from 56.5% to 71.6%. The price stayed flat, so on paper it is a free upgrade.

Rule of thumb

If your agent already runs on grok-voice-latest, you have 3.0 today. Before celebrating, replay your own recorded calls: the alias moved under you, and your prompts were tuned on 2.0.

3. Evidence, and who measured it

Unlike many launch posts, the headline numbers here are not xAI grading itself: they come from Artificial Analysis, an independent benchmarking site with a public leaderboard. What xAI did choose is the comparison set and the metrics it highlights, so I read the leaderboard row by row on October 14 to see the full picture.

Grok Voice 3.0 leads the Index and time to first audio in that table, but it does not win every column: GPT-Live-1 (Astra, medium) scores higher on τ-Voice, Gemini 3.8 Live has the highest Arena Elo of the five, and GPT-Live-1 (Sol, low) edges it on Full Duplex Bench.

Artificial Analysis speech-to-speech snapshot

Selected rows from the public leaderboard, read on 2026-10-14.

ModelIndexFull Duplexτ-VoiceArena EloFirst audio
Grok Voice 3.086.997.0%71.6%10700.81 s
GPT-Live-1 (Astra, medium)83.294.9%74.5%10561.34 s
GPT-Live-1 (Sol, low)80.197.3%59.3%10571.24 s
Gemini 3.8 Live76.096.1%30.1%10881.18 s
Gemini 3.8 Live (Ext. Thinking, High)82.691.9%68.6%9931.35 s

Source: Artificial Analysis. xAI’s own post shows slightly different Elo values for some competitors (for example 1048 for GPT-Live-1 Astra), so treat Elo gaps of a few points as noise.

What the sources support

  • • Index 86.9, Full Duplex 97.0%, τ-Voice 71.6% and task success 94.8% for Grok Voice 3.0 (Artificial Analysis data of Oct 13, 2026, as cited by xAI)
  • • 0.81 s vs 1.34 s to first audio against GPT-Live-1 (Astra, medium) on the leaderboard: about 40% lower, consistent with xAI’s claim (the ratio is my arithmetic)
  • • EVA-Bench (ServiceNow, enterprise voice agents): 74% accuracy, which xAI reports as the highest in that benchmark

Read the fine print

The Tesla (“millions of conversations a day”) and Starlink (about 20,000 calls a day, roughly 70% resolved without a human) figures are xAI’s own statements, not audited numbers. The benchmark data is a snapshot from October 13 and leaderboards move. I have not run any of these benchmarks myself.

4. Speech-to-speech or STT → LLM → TTS?

A speech-to-speech model listens and speaks in one step, so turn-taking, interruptions and prosody live inside the model. A pipeline chains three services (transcribe, think, synthesize) and you own the glue: voice activity detection, barge-in, buffering and the text in the middle.

That text in the middle is the real trade. With a pipeline you can log it, redact it, run guardrails on it and swap the LLM whenever a cheaper one appears. With speech-to-speech you write less orchestration and, per Artificial Analysis, get a fast first audio, but you have less to inspect unless you turn on transcription events.

How I would choose

🎙️

Speech-to-speech if…

natural interruptions matter more than text-level control, you want one vendor and one bill, and your tools are few and fast.

🧩

Pipeline if…

you must log or redact text between steps, need a specific LLM or a branded voice, or cost per minute is the binding constraint.

🔀

Hybrid exists

Microsoft’s Voice Live API lets you set the transcription model (MAI-Transcribe) apart from the chat model and the voice, in one WebSocket session.

Cost per minute, from listed prices only

Prices come from xAI’s pricing page and Microsoft’s launch post. The per-minute totals depend on assumptions that are mine.

RouteListed pricesEst. USD per minute
Grok Voice 3.0 (speech-to-speech)$0.08 per minute$0.080
xAI pipeline: STT streaming + grok-4.7 + xAI TTS$0.20/h STT · $2 in / $6 out per 1M tokens · $15 per 1M chars≈ $0.036
Microsoft pipeline: MAI-Transcribe-2-Streaming + same LLM + MAI-Voice-2.1-Flash$0.54/h STT · same LLM · $15 per 1M chars≈ $0.042
Microsoft pipeline with MAI-Voice-2.1$0.54/h STT · same LLM · $22 per 1M chars≈ $0.048

Assumptions (mine, not measurements): 900 characters of agent speech per call minute (about 150 words), 4 turns per minute, 2,000 input and 150 output tokens per turn on grok-4.7 at its listed under-200k-token prices, which comes to about $0.02 per minute. Excludes hosting, telephony, retries and any tool or search charges. Replace them with your own traffic.

Reading the table honestly

On paper a pipeline costs roughly half of Grok Voice 3.0 per minute. What you pay the extra for is fewer moving parts and, if the leaderboard holds on your traffic, better turn-taking. If your agent speaks only 30% of the time, the TTS share of the pipeline shrinks further.

5. Quickstart: a minimal client

Everything below is adapted from xAI’s voice docs and verified against them on 2026-10-14. I have not run it against a live key: treat it as a text-in, audio-out smoke test you can extend with a microphone.

Install the websockets package, export XAI_API_KEY, run the script and open reply.wav. The audio is linear16 PCM at 24 kHz; I assume mono because the docs do not state a channel count.

Smoke test: text turn in, audio out

Mirrors the docs’ Python example (websockets, Bearer header, session.update). additional_headers is the argument name in recent websockets releases, as used in xAI’s example.

import asyncio
import base64
import json
import os
import wave

import websockets

URL = "wss://api.x.ai/v1/realtime?model=grok-voice-latest"
HEADERS = {"Authorization": f"Bearer {os.environ['XAI_API_KEY']}"}


async def main():
    async with websockets.connect(URL, additional_headers=HEADERS) as ws:
        await ws.send(json.dumps({
            "type": "session.update",
            "session": {
                "voice": "eve",
                "instructions": "You are a helpful customer support agent.",
                "turn_detection": {"type": "server_vad"},
                "audio": {
                    "input": {"format": {"type": "audio/pcm", "rate": 24000}},
                    "output": {"format": {"type": "audio/pcm", "rate": 24000}},
                },
            },
        }))
        await ws.send(json.dumps({
            "type": "conversation.item.create",
            "item": {
                "type": "message",
                "role": "user",
                "content": [{"type": "input_text", "text": "Hello!"}],
            },
        }))
        await ws.send(json.dumps({"type": "response.create"}))

        pcm = bytearray()
        async for message in ws:
            event = json.loads(message)
            if event["type"] == "response.output_audio.delta":
                pcm += base64.b64decode(event["delta"])
            elif event["type"] == "response.done":
                break

    with wave.open("reply.wav", "wb") as f:
        f.setnchannels(1)   # mono (assumed, not stated in the docs)
        f.setsampwidth(2)   # 16-bit linear PCM
        f.setframerate(24000)
        f.writeframes(bytes(pcm))


asyncio.run(main())

Stream a microphone and handle a tool call

The docs say append takes base64 audio but do not print the JSON, so the audio field name comes from Pipecat’s open-source xAI event models. The function tool fields (type, name, description, parameters) match the docs’ field list. With parallel calls, send every function_call_output before one response.create, and wait for current playback to finish first.

# 1) microphone -> model (with server_vad, append is the only audio event you need)
async def send_audio(ws, chunks):  # chunks: raw PCM16 at 24 kHz
    async for chunk in chunks:
        await ws.send(json.dumps({
            "type": "input_audio_buffer.append",
            "audio": base64.b64encode(chunk).decode(),
        }))

# 2) a function tool, declared inside session.update -> session.tools
tools = [{
    "type": "function",
    "name": "get_order_status",
    "description": "Look up an order by id.",
    "parameters": {
        "type": "object",
        "properties": {"order_id": {"type": "string"}},
        "required": ["order_id"],
    },
}]

# 3) when the model calls it, return the output, then ask for the spoken reply
if event["type"] == "response.function_call_arguments.done":
    result = lookup_order(**json.loads(event["arguments"]))  # your code
    await ws.send(json.dumps({
        "type": "conversation.item.create",
        "item": {
            "type": "function_call_output",
            "call_id": event["call_id"],
            "output": json.dumps(result),
        },
    }))
    await ws.send(json.dumps({"type": "response.create"}))

Browser clients: ephemeral token, not your API key

From xAI’s ephemeral-tokens page. The docs do not document the response schema, so read the token from the JSON body you get back.

# server: mint a short-lived token (never ship XAI_API_KEY to the client)
curl -X POST https://api.x.ai/v1/realtime/client_secrets \
  -H "Authorization: Bearer $XAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expires_after": {"seconds": 300}}'

// browser: pass the token as a WebSocket subprotocol
const ws = new WebSocket("wss://api.x.ai/v1/realtime",
  ["xai-client-secret." + token]);

The Microsoft route: MAI-Transcribe + a MAI voice in Voice Live

Assembled from three snippets in Microsoft Learn’s Voice Live how-to (updated 2026-10-08): the transcription model name, the MAI-Voice-2-Flash voice example and the turn_detection type. The chat model goes in the model query parameter of wss://<resource>.services.ai.azure.com/voice-live/realtime?api-version=2026-04-10. The docs name the voice MAI-Voice-2-Flash (Preview) while the launch post says 2.1-Flash, so check the voice catalog before copying.

{
  "type": "session.update",
  "session": {
    "input_audio_transcription": {"model": "mai-transcribe-2-streaming"},
    "modalities": ["text", "audio"],
    "instructions": "You are a helpful assistant.",
    "voice": {"name": "en-US-Harper:MAI-Voice-2-Flash", "type": "azure-standard"},
    "turn_detection": {"type": "azure_semantic_vad_multilingual"}
  }
}

6. Honest limits and what to do this week

Limits to plan around

  • • Undocumented ceilings: xAI’s docs do not state a maximum session length, rate limits or concurrency limits (checked on 2026-10-14). Ask before sizing a call center on it.
  • • Moving alias: grok-voice-latest already changed models once without a deploy on your side. Pin grok-voice-3.0 in production and upgrade on purpose.
  • • Benchmarks are a snapshot: GPT-Live-1 (Astra, medium) scores 74.5% on τ-Voice against 71.6%, and even 71.6% means a real share of support-call tasks fail. Keep a human handoff.
  • • Pricing gaps: the pricing page does not say whether server-side tools such as web_search add charges to voice sessions, and a “$0.004 / text input” line sits under the per-minute price without a stated unit.
  • • Languages: xAI lists 20 language codes and says others work with varying accuracy. For Spanish and Portuguese the transcription hint needs a regional code (es-MX, es-ES, pt-BR, pt-PT).
  • • Microsoft side: MAI-Transcribe-2-Streaming is a public preview with no SLA and not recommended for production on Microsoft Learn, and its $0.54 per hour is introductory through the end of the year.

Checklist for this week

  1. 1. Pin the model: grok-voice-3.0 in production, grok-voice-latest only in a staging canary.
  2. 2. Replay 20 to 30 real recordings (accents, noise, interruptions) and score task completion and time to first audio from your own region.
  3. 3. Set audio.input.transcription.model to grok-transcribe to receive transcript events, so you have text to log, review and evaluate.
  4. 4. Recompute the cost table with your own characters per minute and tokens per turn; the gap between routes depends on them.
  5. 5. Mint ephemeral tokens on your server for any browser or mobile client. Never ship the API key.

Data handling is a contract question

xAI’s docs say audio is processed in real time and not stored or used for training, and list SOC 2 Type II, HIPAA eligibility (BAA available) and GDPR compliance with EU data residency options. Those are vendor statements: get the ones you need written into your contract, not just a docs page.

Verdict

Grok Voice 3.0 is a credible upgrade: the same $0.08 per minute, better conversation mechanics on an independent leaderboard, and a protocol simple enough to smoke-test in about 50 lines of Python. It is not the cheapest route per minute, and it does not win every benchmark column.

My rule: prototype with speech-to-speech because it gets you to a working conversation in an afternoon, then price a pipeline once you know your real characters and tokens per minute. If you need text-level control or the cheapest minute, Microsoft’s MAI components are worth a look as soon as they leave preview.

Sources for this post

Primary and independent

  • • xAI: Grok Voice 3.0 announcement (Oct 14, 2026)
  • • xAI docs: voice agent protocol, ephemeral tokens and pricing
  • • Artificial Analysis: Speech-to-Speech leaderboard
  • • Microsoft AI: streaming transcription and MAI-Voice-2.1 launch (Oct 1, 2026)
  • • Microsoft Learn: MAI-Transcribe-2-Streaming and Voice Live API
  • • Pipecat: open-source xAI realtime event models
Diego Rodriguez

Diego Rodriguez

Senior Full-Stack & AI Engineer

Diego has 10+ years of experience building production-grade AI-powered applications, from LLM orchestration and RAG pipelines to ML-driven risk detection and algorithmic trading systems.

Learn more about Diego →