Setup guide
Use any other model
This page is for models the extension doesn't list directly. Two ways to reach them: a LiteLLM proxy puts one OpenAI-compatible endpoint in front of providers you already hold keys for (ElevenLabs, MiniMax, Vertex AI/Gemini, and more), with nothing to host beyond the proxy itself. Or host an open model on your own machine, where nothing leaves your computer and there is no per-character charge. Either takes about 10 minutes if you're comfortable with a terminal.
What you'll need
- For the proxy path: an API key for the provider you route to (billed at its rates)
- For self-hosting: a computer that can run the engine (some models want a GPU, smaller ones don't)
- A terminal, and Python or Docker depending on the path
- About 10 minutes
Path 1: Add a LiteLLM proxy
A LiteLLM proxy gives you one OpenAI-compatible endpoint in front of providers you already hold keys for: OpenAI, Azure, AWS Polly, Vertex AI/Gemini, ElevenLabs, or MiniMax. You host the proxy, not the models, so it runs fine on any machine.
1. Install it
You need Python 3.10 or newer. Then:
pip install 'litellm[proxy]'
2. Quick start with one backend
Export the backend's key and start the proxy with the model you want to route to. It listens on port 4000:
export OPENAI_API_KEY=sk-...
litellm --model openai/tts-1
# RUNNING on http://0.0.0.0:4000
3. Or route to several providers
Put each backend in a config.yaml. The model_name aliases you choose here are what you'll type into the extension's Models field:
model_list:
- model_name: tts
litellm_params:
model: openai/tts-1
api_key: os.environ/OPENAI_API_KEY
- model_name: eleven
litellm_params:
model: elevenlabs/eleven_multilingual_v2
api_key: os.environ/ELEVENLABS_API_KEY
# optional: require a key from clients (paste it into the
# extension's API key field)
general_settings:
master_key: sk-your-proxy-key
litellm --config config.yaml
MiniMax, Vertex AI/Gemini, Azure, and Polly entries follow the same pattern; the exact model strings are in the LiteLLM TTS docs and its per-provider pages.
4. Point the extension at it
Server URL http://localhost:4000/v1; API key only if you set a master key; Models field tts, eleven (your aliases). For voices, OpenAI names like alloy work everywhere, and LiteLLM maps them per backend (for ElevenLabs, raw voice IDs also pass through unchanged).
Path 2: Host an open model (optional)
Skip this if the proxy path covers you. Hosting an engine yourself keeps every request on your machine and costs nothing per character. Common choices:
- LocalAI: a full local OpenAI replacement that loads multiple TTS backends, such as Kokoro, Piper, and Coqui
- Speaches: a lighter server that runs Kokoro and Piper voices behind one endpoint
- Kokoro-FastAPI: the quickest start if the Kokoro model is all you need
- openedai-speech: a small server that serves open TTS models on this API
For Kokoro-FastAPI, one Docker command starts a server on port 8880:
docker run -d --name kokoro -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu
The other engines document their own installs: see the LocalAI or Speaches getting-started pages. Most run as a Docker container or a Python package and listen on a local port.
Connect the extension
- Click the extension icon in your browser toolbar
- Open Settings → OpenAI-compatible
- Paste the Server URL: http://localhost:4000/v1 for LiteLLM, http://localhost:8880/v1 for Kokoro-FastAPI, or your engine's own port
- Enter an API key only if the server requires one (local servers usually don't)
- Optionally list voice names separated by commas, and one or more models, also separated by commas (the default is tts-1, which most servers accept)
- Click Save & test
The extension first asks the server for its voice list, so you can usually leave the voices field empty. If the server doesn't report voices, it falls back to OpenAI's nine standard voice names, and anything you type in the field takes priority. Each model you list becomes its own row per voice in the voice picker, so one server can expose several models at once and you can switch between them per read. Once the test passes, highlight text on any page, right-click, and choose Read aloud, or press Ctrl/Cmd+Shift+S.
Costs
The two paths bill differently. Through a LiteLLM proxy, each request is billed by the backend it routes to at that provider's own rates, and your text goes to that provider; LiteLLM itself is free software. A self-hosted engine is free to run once you have the hardware, with no per-character charge and nothing leaving your machine. For provider rates, see our provider comparison.
Remove access when you're done
- Stop the server process (Ctrl+C) or delete its container.
- In the extension, open Settings → OpenAI-compatible and clear the saved fields (or turn the provider off).
Troubleshooting
Connection refused or network errors
The server isn't reachable at the URL you saved. Check that it's actually running, that the port in the URL matches the one the server listens on, and that the URL ends in /v1. Then click Save & test again.
401 or unauthorized errors
The server requires an API key. Paste it into the extension's API key field; for a LiteLLM proxy with authentication enabled this is the proxy's master or virtual key, not the backend provider's key.
No voices, or the wrong voices, in the picker
The extension asks the server for its voice list first and falls back to OpenAI's standard names if that fails. If your server's voices don't show up, type their names into the Voices field yourself, separated by commas, and save again.
For no audio, missing voices, or keyboard shortcut problems, see the troubleshooting guide.
Rather skip the setup? A hosted service works with the same extension settings; see OpenAI-compatible. Or pick a cloud provider: Amazon Polly, Azure Speech, Google Cloud TTS, or OpenAI.