Skip to main content

OpenAI TTS voices, mapped to Kokoro alternatives

OpenAI's text-to-speech API started with six voices — alloy, echo, fable, onyx, nova and shimmer — and now lists 13 (9 on tts-1 and tts-1-hd, all 13 on gpt-4o-mini-tts, per OpenAI's text-to-speech guide, checked September 2026). Every team migrating off OpenAI's per-character pricing asks the same first question: which EasyVoice voice replaces the one we already shipped? For the six original voices, the answer is the 6-row mapping table the rest of this page walks through; ash, ballad, coral, sage, verse, marin and cedar are not mapped, because OpenAI publishes no description of how they sound — audition them against the catalog by ear. Each row pairs an OpenAI voice to its closest Kokoro-82M sonic match, characterizes the tone in plain language, lists the use cases each pair fits, and gives you a 1-2 sentence sample script you can paste into both vendor APIs to A/B them blind. 1 of the 6 matches (af_nova) is on the free tier; the other 5 need Pro ($9.99/mo). Every voice's sample plays free, so you can listen to all 6 before paying anything. After the table, we cover the 60 additional voices the EasyVoice catalog has beyond the six matches, plus practical guidance on running blind listening tests before committing to a mapping.

5,000 characters per day free, no credit card. Pro $9.99/mo unlimited (fair use 10M characters per 30 days).

How to read this mapping table

Voice perception is subjective. The mappings below are starting points, calibrated to match pitch range, register, brightness, and cadence — the four properties listener-perception research shows people actually notice when comparing TTS voices. For most use cases, the suggested EasyVoice voice will land close enough that your users won't notice the swap. For literary fiction, character voice acting, or any product where the voice is part of the brand identity, the right next step is a blind A/B: generate the same passage in both vendor voices, hand a coworker the two audio files unlabeled, and ask which they prefer. Pick whichever wins the blind test — even if it isn't the one the table suggests.

The 'when to use' column captures the concrete content domains each pair fits — accessibility, audiobook narration, ad voiceover, IVR / chatbot prompts, podcast intros, brand films. Some pairs are dual-purpose (af_alloy works for both accessibility and chatbots); others are register-specific (am_onyx is wrong for casual chatbot tone, right for movie-trailer narration). The sample scripts are 1-2 sentence neutral prompts written to expose differences in pacing and register; they're not optimized to make either vendor sound better than the other.

The mapping table — OpenAI → EasyVoice

Six rows below. Each row: the OpenAI voice name (as you'd pass to openai.audio.speech.create), the EasyVoice voice ID (as you'd pass to /api/v1/audio/speech), the friendly EasyVoice voice name, a one-paragraph tone characterization, the concrete use cases the pair fits, and a sample script you can copy-paste into both APIs for blind comparison. On the API you do not have to translate anything: the six OpenAI voice names work as they are, and EasyVoice resolves each one to the voice ID in the table. 1 of the 6 matches (af_nova) is on the free tier; the other 5 need Pro ($9.99/mo). Every voice's sample plays free, so you can listen to all 6 before paying anything.

Click through any EasyVoice voice name to reach its dedicated voice page at /voices/[id], which includes a longer character profile, audio preview embed, and the full FAQ entries for that specific voice. The voice pages live under the same wedge — flat $9.99/mo Pro unlimited, 5K chars/day free, no credit card — so you can preview without committing to anything.

Beyond the six — 60 more voices the OpenAI catalog doesn't have

OpenAI's voices are one shared set for every language, and OpenAI notes they are currently optimized for English. EasyVoice's catalog has 66 voices total — the six matches above plus 60 more across British English (10 voices), Spanish (3), French (1), Italian (2, beta), Portuguese (3), Japanese (5), Hindi (4), Arabic (10 Modern Standard Arabic voices, beta), and additional American English registers. The catalog grew from solving the multilingual-app problem: your French onboarding shouldn't be read by an English-trained voice approximating an accent.

Common gaps the OpenAI catalog leaves that we cover: native French speaker (ff_siwis) for French-language content, native Hindi speaker (hf_alpha) for Indian-market apps where Hindi listeners reliably tell English-engine voices apart from native voices, multiple American English age bands (am_adam mid-range vs am_michael slightly older vs am_onyx deeper-and-older), and contemporary British register (bf_emma modern professional vs bf_alice slightly more reserved). For accessibility products that let listeners choose a voice, a larger roster in more languages gives them more to choose from.

Running a blind A/B test before you commit

The single best validation step before swapping production TTS vendors is a blind listening test on real content. Pick three representative passages from your actual product (not a generic 'hello world' — your actual support-bot script, your actual onboarding voiceover, your actual ad copy). Generate each passage in both the OpenAI voice you're using now and the suggested EasyVoice replacement from the table above. Save the six audio files with anonymized filenames (a.mp3, b.mp3, c.mp3...). Hand them to two or three coworkers, ask 'which sounds more natural / on-brand for our product' — and tally the votes.

Two things to watch for. First, listener preference for an unfamiliar voice often runs against it on the first hearing — humans like what they've heard before. If your team has been listening to your current OpenAI voice for months, they may rate the EasyVoice replacement lower simply because it's unfamiliar. Mitigate by including the swap in the test with at least one listener who has never heard your current voice — their judgment is the cleaner signal. Second, pay attention to specific failure modes (wrong word stress, awkward pause between clauses, mispronounced proper nouns) more than overall vibe. Fix-rate matters more than first-impression delta.

Voice consistency, regression risk, and how to migrate safely

Once you've picked your mapping, the safe migration pattern is gradual rollout: cut new traffic over to EasyVoice first, leave existing content (already-generated audio files cached on your CDN) untouched. If your product caches generated audio by some kind of (text + voice + format) hash, the existing OpenAI-generated files will still serve correctly for repeat playback — only new generations switch over. This avoids the worst-case migration regression where every customer's previously-listened-to content suddenly sounds different.

For apps that regenerate audio on every request (no caching), the safer pattern is voice-pinning per user. Detect on the user record whether they were created before or after the migration date; old users keep getting OpenAI-mapped voices (you keep paying OpenAI's per-character rate for that cohort), new users go straight to EasyVoice. Over weeks-to-months the OpenAI cohort shrinks as users churn, leaving you on flat $9.99/mo Pro across the active population. This is more conservative than a hard cutover but eliminates the 'why does the bot sound different' support ticket entirely.

Voice mapping table — OpenAI → EasyVoice

Click any EasyVoice voice name to reach its dedicated voice page with audio preview. Each voice is marked Free or Pro: Pro voices need a Pro plan to generate audio, and every voice's preview sample is free to play.

OpenAI voiceEasyVoice equivalentTone characterizationWhen to use
alloyAlloyaf_alloy · ProWarm female mid-range — the closest direct sonic match in the EasyVoice catalog. Bright but unhurried, identical register to OpenAI's default voice.Default narration, accessibility read-aloud, neutral chatbot responses, product onboarding voiceover. Use this as your starting-point swap if your app was built on OpenAI's default voice and you don't want to change personality during migration.
echoEchoam_echo · ProNeutral American male, slightly above OpenAI baseline pitch. Clean and unornamented — the 'news reader' register rather than the audiobook narrator.News-style narration, dispatcher / IVR prompts, transactional confirmations (booking confirmations, order updates), enterprise B2B onboarding. Pair with am_adam for variety when one product needs two male voices.
fableFablebm_fable · ProBritish male storytelling voice — measured pace, slight literary lilt, Received Pronunciation. The natural fable-narrator fit OpenAI's voice was named for.Audiobook narration, fiction read-aloud, podcast intros that want a British register, history and documentary voiceover, children's stories. For a contemporary British male with less literary register, see bm_lewis.
onyxOnyxam_onyx · ProDeep American male baritone — the heaviest voice in either vendor's catalog. Slow cadence, dramatic weight, cinematic register.Movie-trailer-style ads, dramatic narration, video game cutscene voiceover, brand films, gravitas-heavy product launches. Avoid for conversational chatbot use (too dramatic for short prompts); pair with am_michael for variety in the same product.
novaNovaaf_nova · FreeBright female with energy — matches the 'nova' brand signal: confident, modern, slightly higher placed than af_alloy. The most expressive female in the OpenAI-equivalent set.Social media ads, hook-driven short-form video voiceover, energetic product demos, marketing email audio versions, YouTube channel intros for lifestyle / fitness / tech reviewer formats.
shimmerLilybf_lily · ProSoft female with airy upper register — captures the 'shimmer' brightness OpenAI's voice was named for, but with a subtle British placement that lends warmth without losing brightness.Meditation and wellness apps, ASMR-adjacent narration, lullabies and bedtime stories, gentle product onboarding for premium consumer apps, lifestyle podcast cold opens. For an American-female alternative with similar airiness, try af_jessica.

Sample scripts for blind A/B testing

Paste each into both vendor APIs (OpenAI's audio.speech.create and EasyVoice's /api/v1/audio/speech) to compare blind.

alloy ↔ af_alloy (Alloy)

"Welcome to your daily summary. Here are the three updates worth your attention this morning, in two minutes or less."

echo ↔ am_echo (Echo)

"Your appointment is confirmed for Thursday at three p.m. We've sent the details to your inbox. Reply 'reschedule' to change the time."

fable ↔ bm_fable (Fable)

"It was the kind of morning the village had not seen in a generation — quiet, golden, and so still that the bells of St. Mary's seemed to sound from another century."

onyx ↔ am_onyx (Onyx)

"In a world where every second counts, the difference between hesitation and action is measured in heartbeats. This is your moment."

nova ↔ af_nova (Nova)

"Three things you didn't know your phone could do — number two will save you ten minutes every morning, no joke."

shimmer ↔ bf_lily (Lily)

"Take a slow breath in… and let it go. You're exactly where you need to be. Listen for the next two minutes — that's all this takes."

Code samples

Real working code, not pseudo-code. Every request below assumes you've set EASYVOICE_API_KEY and OPENAI_API_KEY as env vars where shown.

Generate both vendor voices for blind A/B

Bash — generate alloy.mp3 (OpenAI) and af_alloy.mp3 (EasyVoice) from the same text
# OpenAI tts-1 with alloy
curl -X POST https://api.openai.com/v1/audio/speech \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "tts-1",
    "voice": "alloy",
    "input": "Welcome to your daily summary. Here are the three updates worth your attention this morning.",
    "response_format": "mp3"
  }' \
  --output a.mp3

# EasyVoice with af_alloy (a Pro voice; on a free key use af_nova, the free match for OpenAI's nova)
curl -X POST https://easyvoice.ae/api/v1/audio/speech \
  -H "Authorization: Bearer $EASYVOICE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "voice": "af_alloy",
    "input": "Welcome to your daily summary. Here are the three updates worth your attention this morning.",
    "response_format": "mp3"
  }' \
  --output b.mp3

# Rename randomly, hand both files to a coworker, ask which they prefer.

Voice map lookup in Python

Optional reference: EasyVoice already resolves these OpenAI names for you; use the map to pin EasyVoice voice IDs in your own code
OPENAI_TO_EASYVOICE = {
    "alloy":   "af_alloy",
    "echo":    "am_echo",
    "fable":   "bm_fable",
    "onyx":    "am_onyx",
    "nova":    "af_nova",
    "shimmer": "bf_lily",
}

def to_easyvoice(openai_voice: str) -> str:
    """Map an OpenAI voice name to its closest Kokoro equivalent."""
    return OPENAI_TO_EASYVOICE.get(openai_voice, "af_alloy")

# Existing code that pins an OpenAI voice keeps working:
#   voice = pick_voice_for_user(user)        # returns "onyx"
#   audio = tts(text, to_easyvoice(voice))    # calls EasyVoice with "am_onyx"

Voices to try

Every voice below is callable via the same voice parameter — preview audio samples and read the full character profile.

Frequently asked questions

What's the closest EasyVoice voice to OpenAI's alloy?▾

af_alloy — same warm female mid-range register, intentionally named to match. It's the closest direct sonic match in the EasyVoice catalog and the right starting point if your product was built on OpenAI's default voice and you don't want to change personality during migration. Listen to its free sample at /voices/af_alloy before committing — generating with af_alloy needs Pro.

Which EasyVoice voice replaces OpenAI's onyx?▾

am_onyx — deep American male baritone, the heaviest voice in either vendor's catalog. Same dramatic weight and cinematic register OpenAI's onyx delivers. Best for movie-trailer-style ads, brand films, and gravitas-heavy launches. Don't use it for casual chatbot tone — pair with am_michael or am_adam for that use case.

Are these mappings exact matches?▾

Approximate — calibrated to pitch range, register, brightness, and cadence. For most use cases (accessibility, chatbot prompts, transactional confirmations, narration), the suggested mapping will land close enough that users won't notice the swap. For literary fiction, character voice acting, or any product where the voice is part of brand identity, run a blind A/B on three representative passages from your actual product before committing.

Does EasyVoice have voices OpenAI doesn't?▾

Yes — 60 voices beyond the six OpenAI matches. The catalog covers British English (10 voices), Spanish (3), French (1), Italian (2, beta), Portuguese (3), Japanese (5), Hindi (4), Arabic (10 Modern Standard Arabic voices, beta), and additional American English age bands. Native-speaker voices in each non-English language, not English-engine voices reading translated text. Common gaps OpenAI leaves that we cover: native French speaker for French-language content, native Hindi for Indian-market apps, multiple British registers for UK content.

Can I preview before paying?▾

Yes. Every voice's sample plays free, and af_nova — the match for OpenAI's nova — generates on the free tier (12 free voices in total; 2,000 characters a day with no signup, 5,000 a day with a free account, no credit card). The other 5 matches need Pro at $9.99/mo, which also removes the daily cap. You can ship the integration and run blind A/B tests against your current OpenAI voice on a free key with the free voices, then upgrade for the rest.

What if blind testing picks a different voice than the suggested mapping?▾

Use whichever wins the blind test. The mapping table is a starting point, not a prescription. If your team prefers af_bella for content you'd map to alloy, ship af_bella. The catalog has 66 voices — the suggested mappings are six of them, picked for the closest sonic match. Other voices in the catalog may fit your specific product better. The whole point of the free tier is letting you compare before committing.

Related OpenAI migration guides

Vendor comparison: EasyVoice vs OpenAI TTS

Side-by-side feature comparison covering voices, languages, pricing tiers, free limits, API surface, and the why-people-look / where-each-wins breakdown.

API reference: /audio/speech, Jobs API and limits

Every request parameter, rate limit and error code, the Jobs API for long text, and copy-paste examples using the official openai SDK with the EasyVoice base URL.

Start migrating off OpenAI TTS today

5,000 characters per day free, no credit card. Pro $9.99/mo unlimited replaces per-character bills once they grow past the breakeven shown on the pricing page.

More OpenAI alternative guides