On January 6, 2027, OpenAI removes tts-1, tts-1-hd and both gpt-4o-mini-tts snapshots from its API (deprecations page, entry dated 2026-10-01). Those are every model that /v1/audio/speech serves today, so any client.audio.speech.create(...) call will start failing that day.
The catch: the official replacement, gpt-realtime-2.1-mini, does not run on /v1/audio/speech. OpenAI's own TTS guide says it's "a change of API workflow." Here is what that means and what your real options are.
1. Find every call site first
grep -rnE "audio\.speech|tts-1|gpt-4o-mini-tts|/v1/audio/speech" --include=*.{py,js,ts,go,rb} .
Also check config files and env vars where a model name may be stored. To monitor programmatically, GET /v1/models now exposes a shutdown_date field per model.
2. Option A: move to the Realtime API (OpenAI's path)
You open a Realtime session (WebSocket, WebRTC or SIP), send your text as an input_text conversation item, then call response.create with audio output and collect the audio deltas. Things to plan for:
- It's a conversational model, not a reader. It responds to the prompt. OpenAI staff said in the community thread that the docs don't guarantee verbatim reading. Use strict instructions ("Read the following text exactly, add nothing") and test with your real inputs, especially text that contains questions.
-
Voices differ.
fable,novaandonyxaren't in the current Realtime list. Map them before cutover. - More code. A stateless HTTP POST becomes a session lifecycle with streaming events and error handling.
- Pricing units change from per-character to per-token (audio output tokens). Re-estimate cost with a sample of real traffic.
3. Option B: gpt-audio-1.5 via Chat Completions
A single HTTP request to /v1/chat/completions with audio output, no WebSocket. Same verbatim caveat as above: it generates a response, so validate output on your inputs.
4. Option C: an OpenAI-compatible /v1/audio/speech provider
Many providers and self-hosted servers (e.g. Kokoro-FastAPI) accept the same request shape, so the migration is a base_url and API key change. Before you pick one, check:
- Formats: does it really return MP3 when you ask for MP3, or something else?
- Voices: do OpenAI voice names map to distinct voices or one voice?
-
Parameters: are
speedandinstructionsapplied or silently ignored? - Errors and limits: same 400/429 shapes so your retry logic still works?
- Data handling: is your text stored?
5. A safe cutover checklist
- Put the TTS base URL and model in config, not code.
- Run old and new side by side on a fixed test set; compare duration, and transcribe the new audio to confirm the words match the input.
- Check your audio pipeline handles the new format (WAV vs MP3 vs PCM).
- Ship behind a flag well before Jan 6, then flip.
Disclosure: I'm with Swift Labs, and we run TTS Swap, one Option C provider: a base_url swap that keeps your audio.speech.create calls working. Be aware of its trade-offs: it uses the open-source MeloTTS voice (one voice per language, not OpenAI's voices), returns WAV even when MP3 is requested, and ignores speed for now. This article was drafted with AI assistance.
— Swift Labs
Top comments (0)