Skip to main content
Version: v5.0.0

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

  1. Add a shared provider with type custom-openai.
  2. Set API_BASE to your service base URL (typically ending in /v1).
  3. Set API key if your service requires authentication.
  4. Set a default model/voice supported by your backend.

Bootstrap seed (optional, first boot only):

API_BASE=http://your-tts-server/v1
# API_KEY=optional-key-if-required
API_MODEL_NAME=your-model-name

Users select the configured shared provider, model, and voice from Settings → TTS Provider.

Provider reachability

Speech synthesis runs in the compute worker, while optional voice discovery runs in the Next.js app server. The provider URL should be reachable from both. See the provider topology table for native, Docker, Compose, and remote-worker examples.

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. If synthesis fails, confirm the same provider URL is reachable from the compute worker and that POST /v1/audio/speech succeeds.

References​