Skip to main content
Lesson 11 of 18 · Realtime API and Voice Agents

Available Voices and Customization

Lesson 11 of 18 Updated November 3, 2026 Developer
On this page
  1. Available Voices and Customization
  2. Standard Voices
  3. Voices in the Realtime API
  4. Influencing Style Through Text
  5. Key Takeaways

Update November 2, 2026 — Audio models. Several models in this course are deprecated: tts-1, tts-1-hd, and gpt-4o-mini-tts will shut down on January 6, 2027 (successor: gpt-realtime-2.1-mini, which the OpenAI TTS guide states is not supported by /v1/audio/speech: TTS migration requires the Realtime API); gpt-realtime, gpt-4o-realtime, and legacy audio models on January 20, 2027 (gpt-realtime-2.1, gpt-realtime-2.1-mini, gpt-audio-1.5); whisper-1, gpt-4o-transcribe, and /v1/audio/translations on February 26, 2027 (gpt-transcribe, gpt-live-transcribe, v1/realtime/translations). For full-duplex voice, GPT-Live 1 has been available in the API since September 10, 2026. Lesson corrected November 3, 2026: the “six main voices” and their personalities no longer matched the documentation, which lists 13 voices for gpt-4o-mini-tts, 9 for tts-1 and tts-1-hd, and 10 for the Realtime API; gpt-4o-mini-tts accepts style instructions (instructions); the voice in a Realtime session is fixed until the first audio response. Sources: Text to speech · Realtime conversations.

Available Voices and Customization

Voice choice is critical to your voice agent’s user experience. A voice that fits the context—professional for customer service, warm for a personal assistant—transforms how users perceive the agent. The TTS API offers several distinct voices, each with its own character and strengths.

Standard Voices

OpenAI’s documentation lists 13 built-in voices, with availability varying by model:

Voicegpt-4o-mini-ttstts-1, tts-1-hdRealtime API
alloy, ash, coral, echo, sage, shimmerYesYesYes
fable, nova, onyxYesYesNo
ballad, verseYesNoYes
marin, cedarYes, recommendedNoYes, recommended

OpenAI recommends marin or cedar for the highest quality and notes that the voices are optimized for English. Rather than relying on descriptions, listen to them in French on OpenAI.fm, OpenAI’s demo site, using your own phrases: a timbre that sounds great in English might disappoint on a street name or a number.

Voice selection can be dynamic based on content type. The table below is an example to fill in after listening, using voices that tts-1 also accepts:

def select_voice(context: str, tone: str = "professional") -> str:
    """Selects the optimal voice based on context."""
    voice_map = {
        "customer_service": {
            "professional": "nova",
            "warm": "shimmer",
            "authoritative": "onyx"
        },
        "education": {
            "professional": "echo",
            "warm": "fable",
            "authoritative": "onyx"
        },
        "narration": {
            "professional": "onyx",
            "warm": "echo",
            "authoritative": "onyx"
        },
        "notification": {
            "professional": "alloy",
            "warm": "shimmer",
            "authoritative": "nova"
        }
    }

    return voice_map.get(context, {}).get(tone, "alloy")

# Examples
voice = select_voice("customer_service", "warm")    # → shimmer
voice = select_voice("education", "professional")    # → echo
voice = select_voice("narration", "authoritative")   # → onyx

Voices in the Realtime API

TTS and the Realtime API share a common voice family, but each has its own set: the Realtime API adds marin and cedar (the two recommended ones) and does not accept certain TTS voices like nova or onyx. You define the voice in session.update:

await ws.send(json.dumps({
    "type": "session.update",
    "session": {
        "type": "realtime",
        "output_modalities": ["audio"],
        "audio": {"output": {"voice": "marin"}}
    }
}))

Choose the voice at session creation or in a response.create: once the model produces audio, you cannot change it for that session. To switch voices, open a new session.

Influencing Style Through Text

With gpt-4o-mini-tts, you control style first through natural language instructions (instructions): accent, emotion, intonation, speed, tone, whispering (Lesson 13). tts-1 and tts-1-hd do not accept these; you are left with punctuation and text formatting:

# Neutral tone
text_neutral = "Your order has shipped. It will arrive tomorrow."

# Enthusiastic tone (exclamations)
text_excited = "Great news! Your order has shipped! It arrives tomorrow!"

# Calm tone (long sentences, commas)
text_calm = "Your order, which was carefully prepared, has just shipped, and it should arrive sometime tomorrow."

# Explicit pause (em dash or ellipsis)
text_dramatic = "The result is... extraordinary."

# Emphasis via partial capitalization
text_emphasis = "This is EXACTLY what you need."

Using SSML-like Effects via Text

The documentation does not include SSML, but you can simulate some effects:

def format_for_tts(text: str, pauses: dict = None) -> str:
    """Formats text to optimize TTS rendering."""
    # Add pauses via ellipses
    if pauses:
        for marker, duration in pauses.items():
            dots = "..." if duration == "short" else "....."
            text = text.replace(marker, dots)

    return text

formatted = format_for_tts(
    "Final result: [pause] you passed the test.",
    pauses={"[pause]": "short"}
)
# → "Final result: ... you passed the test."

Key Takeaways

  • 13 voices for gpt-4o-mini-tts, 9 for tts-1 and tts-1-hd, 10 for the Realtime API; marin and cedar are recommended
  • gpt-4o-mini-tts accepts style instructions (instructions); older models respond only to punctuation
  • Voice choice depends on context: customer service, education, narration, notifications
  • You cannot change the voice mid-session in the Realtime API
  • Punctuation directly affects prosody: exclamation points, ellipses, and dashes create effects
  • Always test voices on your actual content before making a final choice