Available Voices and Customization
On this page
Update November 2, 2026 — Audio models. Several models in this course are deprecated:
tts-1,tts-1-hd, andgpt-4o-mini-ttswill 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/translationson 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 forgpt-4o-mini-tts, 9 fortts-1andtts-1-hd, and 10 for the Realtime API;gpt-4o-mini-ttsaccepts 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:
| Voice | gpt-4o-mini-tts | tts-1, tts-1-hd | Realtime API |
|---|---|---|---|
alloy, ash, coral, echo, sage, shimmer | Yes | Yes | Yes |
fable, nova, onyx | Yes | Yes | No |
ballad, verse | Yes | No | Yes |
marin, cedar | Yes, recommended | No | Yes, 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 fortts-1andtts-1-hd, 10 for the Realtime API;marinandcedarare recommended gpt-4o-mini-ttsaccepts 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