OpenAI is removing tts-1, tts-1-hd and the gpt-4o-mini-tts snapshots on 6 January 2027
OpenAI's deprecations page lists tts-1, tts-1-hd and two gpt-4o-mini-tts snapshots for removal on 6 January 2027 (checked 16 October 2026). To keep an OpenAI SDK speech call working, change the base URL and API key to EasyVoice's. The six OpenAI voice names work unchanged; only nova is free. A speech request returns a complete file, with no streaming.
Source: OpenAI deprecations page, 2026-10-01: Text-to-speech models
If your code sends tts-1, tts-1-hd, gpt-4o-mini-tts-2025-03-20 or gpt-4o-mini-tts-2025-12-15 to OpenAI's /v1/audio/speech endpoint, it needs a different model or a different provider before 6 January 2027. EasyVoice's endpoint takes the same request shape, so keeping an existing speech call working is a change to two values: the base URL and the API key. This page lists the exact model IDs, shows the change in Python, Node and curl, maps the OpenAI voice names, and says plainly what is not the same, including that there is no streaming. It ends with a ten-line script you can run on a free key today.
5,000 characters per day free, no credit card. Pro $9.99/mo unlimited (fair use 10M characters per 30 days).
Which OpenAI models are affected, and when
OpenAI's deprecations page lists four text-to-speech model IDs for removal on 6 January 2027, in its "2026-10-01: Text-to-speech models" entry (announced 1 October 2026). The table below repeats them exactly. We read the page on 16 October 2026; OpenAI can change it, so read it again before you rely on a date.
OpenAI names gpt-realtime-2.1-mini as the replacement. As of 16 October 2026, OpenAI's own model page for gpt-realtime-2.1-mini lists the v1/audio/speech endpoint as not supported, so a call to that endpoint cannot use that model.
The bare name gpt-4o-mini-tts is not in OpenAI's table, so check the exact model string your code sends.
Model IDs as OpenAI lists them in its "2026-10-01: Text-to-speech models" entry, read 16 October 2026.
| Model ID | Removal date | Note |
|---|---|---|
| tts-1 | 6 January 2027 | Nine voice names on OpenAI (guide checked September 2026) |
| tts-1-hd | 6 January 2027 | Nine voice names on OpenAI (guide checked September 2026) |
| gpt-4o-mini-tts-2025-03-20 | 6 January 2027 | A gpt-4o-mini-tts snapshot dated 2025-03-20 |
| gpt-4o-mini-tts-2025-12-15 | 6 January 2027 | A gpt-4o-mini-tts snapshot dated 2025-12-15 |
The switch: change the base URL and the key
Keep the OpenAI SDK you already use and change two values when you create the client: the API key becomes your EasyVoice key, and the base URL becomes https://easyvoice.ae/api/v1. The request itself, with its voice and input fields, stays as it is. The Python, Node and curl examples under Code samples show exactly that.
Put your key in the EASYVOICE_API_KEY environment variable. You create it on your EasyVoice account page after you sign up, and a free account can make one.
The model field can stay as it is: EasyVoice accepts any string in the model field and ignores it, so tts-1, tts-1-hd or a gpt-4o-mini-tts snapshot ID all succeed.
Voices: six names work as they are
The six OpenAI voice names alloy, echo, fable, onyx, nova and shimmer work as they are: EasyVoice maps each one to a voice in its own catalog, shown in the table. Only nova is a free voice; a free key that sends one of the other five gets 403 plan_required.
OpenAI's text-to-speech guide (checked September 2026) lists 13 voice names. The seven that EasyVoice does not map are ash, ballad, coral, sage, verse, marin and cedar: a Pro key or a 7-Day Unlimited Pass key that sends one gets 400 invalid_voice.
For tts-1 and tts-1-hd the guide lists nine names, so the extra names there, beyond the six, are ash, coral and sage. If your code sends one of them, change it to one of the six names or to an EasyVoice voice ID your plan includes.
| OpenAI voice name | EasyVoice voice | Free voice? |
|---|---|---|
| alloy | af_alloy | No |
| echo | am_echo | No |
| fable | bm_fable | No |
| onyx | am_onyx | No |
| nova | af_nova | Yes |
| shimmer | bf_lily | No |
What is not the same
There is no streaming. A speech request returns one complete file. A stream_format field, even "sse", is accepted but has no effect, and you still get a single MP3 body with no data lines. The instructions field is accepted and ignored too. If your product starts playback before the whole file has arrived, it will wait for the full file instead.
Request mp3, wav or pcm. mp3 is the default. pcm is raw 16-bit mono samples at 24 kHz, sent with Content-Type audio/pcm. opus, aac and flac are accepted, but the body that comes back is MP3 with HTTP 200, so do not rely on them.
speed works from 0.5 to 2.0. EasyVoice clamps a value outside that range instead of rejecting it, so speed 4 behaves as speed 2.
Each OpenAI name maps to a named EasyVoice voice: alloy to af_alloy, echo to am_echo, fable to bm_fable, onyx to am_onyx, nova to af_nova, shimmer to bf_lily. Listen to the samples on the voices page before you switch.
EasyVoice has 66 voices across 9 languages, so beyond the six names above you can also send any EasyVoice voice ID your plan includes; a free key gets the 12 free voices.
Voice clones speak English. A clone copies the sound of a voice, its tone and pitch, but not an accent or a speaking style. For other languages, choose one of the built-in voices for that language.
A free key takes up to 5,000 characters per request, from the same daily allowance as the web app. A Pro key takes up to 50,000 characters per request on Kokoro voices; the API reference page lists the lower limits for Arabic and cloned voices.
Test it in ten lines
Use a free key with the Python script under Code samples, the last one on this page. It sends one short request with the voice nova, saves hello.mp3 and prints the size in bytes and the wall-clock seconds the request took on your machine and network.
Run it before you change anything in production, and listen to hello.mp3. If it works, the same two values go into your real client.
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.
Python (OpenAI SDK)
Two changed values: the key and the base URLimport os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["EASYVOICE_API_KEY"], # changed: your EasyVoice key
base_url="https://easyvoice.ae/api/v1", # changed: the EasyVoice base URL
)
response = client.audio.speech.create(
model="tts-1", # accepted and ignored
voice="nova", # unchanged: nova is a free voice
input="Hello from EasyVoice.",
)
with open("out.mp3", "wb") as f:
f.write(response.content)Node (OpenAI SDK)
Two changed values: the key and the base URLimport OpenAI from "openai";
import { writeFileSync } from "node:fs";
const client = new OpenAI({
apiKey: process.env.EASYVOICE_API_KEY, // changed: your EasyVoice key
baseURL: "https://easyvoice.ae/api/v1", // changed: the EasyVoice base URL
});
const response = await client.audio.speech.create({
model: "tts-1", // accepted and ignored
voice: "nova", // unchanged: nova is a free voice
input: "Hello from EasyVoice.",
});
writeFileSync("out.mp3", Buffer.from(await response.arrayBuffer()));curl
The same request over plain HTTPcurl -X POST https://easyvoice.ae/api/v1/audio/speech \
-H "Authorization: Bearer $EASYVOICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"tts-1","voice":"nova","input":"Hello from EasyVoice."}' \
--output out.mp3Ten-line test script (Python)
Run it with a free key; nova is a free voiceimport os, time, requests
start = time.time()
res = requests.post(
"https://easyvoice.ae/api/v1/audio/speech",
headers={"Authorization": "Bearer " + os.environ["EASYVOICE_API_KEY"]},
json={"model": "tts-1", "voice": "nova", "input": "Testing the switch."},
)
res.raise_for_status()
open("hello.mp3", "wb").write(res.content)
print(len(res.content), "bytes in", round(time.time() - start, 2), "seconds")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
When does OpenAI remove tts-1?▾
OpenAI's deprecations page lists tts-1 for removal on 6 January 2027. The same page lists tts-1-hd and two gpt-4o-mini-tts snapshots for the same date. The removal was announced on 1 October 2026 and we read the page on 16 October 2026; check the page itself for any change.
Which OpenAI model IDs are affected?▾
The four IDs in OpenAI's table: tts-1, tts-1-hd, gpt-4o-mini-tts-2025-03-20 and gpt-4o-mini-tts-2025-12-15. The bare name gpt-4o-mini-tts is not in OpenAI's table, so check the exact model string your code sends.
Do I have to change the voice names?▾
No, not for the six: alloy, echo, fable, onyx, nova and shimmer work as they are, and only nova is free. The seven newer names, ash, ballad, coral, sage, verse, marin and cedar, are not mapped: a Pro key or a 7-Day Unlimited Pass key that sends one gets 400 invalid_voice.
Does EasyVoice support streaming?▾
No. A speech request returns one complete file. A stream_format field is accepted but has no effect, and you still get a single MP3 body.
Which output formats does EasyVoice return?▾
Request mp3, wav or pcm. mp3 is the default, and pcm is raw 16-bit mono samples at 24 kHz. opus, aac and flac are accepted, but the body that comes back is MP3 with HTTP 200.
How can I test the switch for free?▾
Create a free API key and run the ten-line script on this page. A free key has 5,000 characters a day, 12 voices (of the six OpenAI names, only nova) and 20 requests a minute.
Is EasyVoice an official OpenAI replacement?▾
No. EasyVoice is a separate service at easyvoice.ae, based in Dubai, United Arab Emirates. OpenAI names gpt-realtime-2.1-mini itself as the replacement, and EasyVoice is not a realtime service.
Related OpenAI migration guides
Migrate from OpenAI TTS to EasyVoice: change the base URL and key
Keep the official OpenAI SDK: change the base URL and API key. The six OpenAI voice names work as they are (nova is free; the other five need Pro).
OpenAI TTS quickstart — first audio in 5 steps, no credit card
OpenAI TTS quickstart alternative. EasyVoice: 5 steps, no credit card, first audio in under 2 minutes. Account, API key, curl request, mp3 playback — free tier.
OpenAI TTS API reference — audio.speech.create mapped to EasyVoice
OpenAI TTS API reference mapped to EasyVoice: audio.speech.create params, error codes 400/401/403/404/429/5xx, request/response shapes.
OpenAI TTS voices, mapped to Kokoro alternatives
Map OpenAI's six original TTS voices (alloy, echo, fable, onyx, nova, shimmer) to the closest EasyVoice Kokoro voices: tones, when to use each, sample scripts.
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.