Other
Use any OpenAI-compatible TTS service with OpenReader, including self-hosted servers not covered by a dedicated guide.
Requirements
Your service only needs an OpenAI-compatible speech endpoint:
POST /v1/audio/speech— required.- Voice listing is optional and auto-discovered from
/v1/audio/voices,/v1/voices, or/v1/styles. If none respond, OpenReader falls back to default voices — the Kokoro voice set for Kokoro models, otherwise the standard OpenAI voices (alloy,echo,fable,onyx,nova,shimmer).
The endpoint may return mp3, wav, ogg, or flac — OpenReader normalizes non-mp3 audio to mp3 automatically. An API key is optional.
Known compatible implementations: Kokoro-FastAPI, KittenTTS-FastAPI, Orpheus-FastAPI, Supertonic.
Setup
Recommended (auth + admin): Settings → Admin → Shared providers
- Add a shared provider with type
custom-openai. - Set
API_BASEto your service base URL (typically ending in/v1). - Set API key if your service requires authentication.
- Set a default model/voice supported by your backend.
Legacy bootstrap seed (optional, first boot only):
API_BASE=http://your-tts-server/v1
# API_KEY=optional-key-if-required
Users select the configured shared provider, model, and voice from Settings → TTS Provider.
API_BASE must be reachable from the Next.js server, not just the browser. In Docker, use http://host.docker.internal:<port>/v1 so OpenReader reaches the service's published port on your host. A container name only resolves if OpenReader and the TTS service share a Docker network (Docker Compose, --link, or a shared --network). localhost/127.0.0.1 will not work, since inside the container that points at the container itself.
Troubleshooting
If voices don't load, confirm the server is reachable from the Next.js runtime and that at least one of /v1/audio/voices, /v1/voices, or /v1/styles returns a valid response. If none do, OpenReader falls back to default voices — synthesis still works as long as POST /v1/audio/speech succeeds.