openreader/docs-site/docs/configure/tts-providers.md
Richard R 3a21f2a5f5 refactor(config): migrate compute and runtime env vars to new naming scheme
- Replace `OPENREADER_COMPUTE_MODE` and related variables with `COMPUTE_MODE`
- Replace `OPENREADER_*` PDF/Whisper model URLs with `PDF_LAYOUT_MODEL_BASE_URL` and `WHISPER_MODEL_BASE_URL`
- Remove legacy `NEXT_PUBLIC_*` runtime config seeds in favor of `RUNTIME_SEED_*`
- Update documentation, code, and environment references to match new variable names
- Remove deprecated `scripts/fetch-models.mjs` and related npm script
- Update runtime config SSR injection from `window.__OPENREADER_RUNTIME_CONFIG__` to `window.__RUNTIME_CONFIG__`
- Adjust Next.js config to use new compute mode env var and optimize output file tracing for ONNX dependencies

BREAKING CHANGE: Environment variable names for compute mode, model URLs, and runtime config seeding have changed. Update `.env` files and deployment configs to use `COMPUTE_MODE`, `PDF_LAYOUT_MODEL_BASE_URL`, `WHISPER_MODEL_BASE_URL`, and `RUNTIME_SEED_*` as appropriate. Legacy `OPENREADER_*` and `NEXT_PUBLIC_*` variables are no longer supported.
2026-05-19 13:27:07 -06:00

3.2 KiB

title
TTS Providers

OpenReader routes all TTS requests through the Next.js server to an OpenAI-compatible API. There are three places provider configuration can live:

Admin-managed shared providers (Settings > Admin > Shared providers): DB-backed instances configured by an admin and visible to all users. Keys are encrypted at rest and never exposed to the client. Available only when auth is enabled and your account is in ADMIN_EMAILS. See Admin Panel.

Per-user Settings modal (Settings > TTS Provider): provider + API key stored in the user's browser and sent with every TTS request. This path is available only when the admin/runtime setting restrictUserApiKeys=false.

Environment variables: API_KEY and API_BASE exist as a one-shot first-boot seed that auto-creates a default-openai admin shared provider. After the first boot they are no longer read by the running app.

:::tip If you're running a private/self-hosted instance and want per-user BYOK behavior, turn off Settings → Admin → Site features → Restrict user API keys. Legacy first-boot seed via RUNTIME_SEED_RESTRICT_USER_API_KEYS=false is still supported for no-admin bootstrap flows. :::

Providers

  • OpenAI: Cloud. Base URL pre-filled (https://api.openai.com/v1). API key required.
  • Replicate: Cloud. Base URL managed internally by OpenReader. API key required.
  • DeepInfra: Cloud. Base URL pre-filled (https://api.deepinfra.com/v1/openai). API key required.
  • Custom OpenAI-Like: Self-hosted or any custom endpoint. API_BASE must be set manually (typically ending in /v1). API key optional.

For OpenAI, DeepInfra, and Replicate you only need to supply an API key. For Custom OpenAI-Like you must also set API_BASE.

Built-in model catalogs

  • Replicate models: alphanumericuser/kokoro-82m, google/gemini-3.1-flash-tts, minimax/speech-2.8-turbo, qwen/qwen3-tts, inworld/tts-1.5-mini (or choose Other and enter any Replicate model ID, such as owner/model or owner/model:version)
  • OpenAI models: tts-1, tts-1-hd, gpt-4o-mini-tts
  • DeepInfra models: includes hexgrad/Kokoro-82M and additional hosted models (depending on API key / feature flags)

Custom provider requirements

Self-hosted or custom providers must expose OpenAI-compatible audio endpoints:

  • GET /v1/audio/voices
  • POST /v1/audio/speech

:::warning TTS requests are server-side TTS requests originate from the Next.js server, not the browser. API_BASE must be reachable from the server runtime. In Docker, use container names or host.docker.internal rather than localhost. :::

Provider guides