simple FastAPI server to host TTS plugins as a service
Project description
OpenVoiceOS TTS Server
Turn any OVOS TTS plugin into a microservice — a small, stateless FastAPI app that exposes a TTS plugin over HTTP.
Install
pip install ovos-tts-server
# Optional: enable non-WAV output (mp3, ogg, flac, ...) via pydub
pip install "ovos-tts-server[audio]"
Companion plugin
Use in your voice assistant via the companion TTS plugin.
Configuration
The plugin is configured the same way as if it were running inside the assistant — through mycroft.conf:
{
"tts": {
"module": "ovos-tts-plugin-piper",
"ovos-tts-plugin-piper": {
"model": "alan-low"
}
}
}
Usage
ovos-tts-server --help
usage: ovos-tts-server [-h] [--engine ENGINE] [--port PORT] [--host HOST] [--cache]
options:
-h, --help show this help message and exit
--engine ENGINE tts plugin to be used
--port PORT port number (default: 9666)
--host HOST host (default: 0.0.0.0)
--cache save every synth to disk
Example — serve the Piper plugin:
ovos-tts-server --engine ovos-tts-plugin-piper --cache
Then GET http://localhost:9666/synthesize/hello.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /status |
Plugin name, supported languages, default voice/model |
| GET | /v2/synthesize?utterance=<text>[&lang=...][&voice=...] |
Primary synthesis endpoint — returns WAV audio |
| GET | /synthesize/<utterance> |
Legacy path-based synthesis endpoint |
CORS is enabled for all origins.
Third-party API compatibility
The server can additionally expose its underlying TTS plugin behind drop-in compatibility endpoints for popular cloud TTS APIs — MaryTTS, ElevenLabs, OpenAI, Coqui, Google Cloud TTS, Amazon Polly, Azure, and Piper. Each vendor lives under its own URL prefix so multiple compat layers coexist with no path collisions. Auth tokens are accepted and silently ignored — wrap behind a reverse proxy if you need real auth.
See docs/api-compatibility.md for the full reference.
Documentation
Docker
Build a small image that serves any plugin:
FROM python:3.11-slim
RUN pip install --no-cache-dir "ovos-tts-server[audio]" {PLUGIN_HERE}
ENTRYPOINT ["ovos-tts-server", "--engine", "{PLUGIN_HERE}", "--cache"]
docker build . -t my_ovos_tts_plugin
docker run -p 8080:9666 my_ovos_tts_plugin
Then GET http://localhost:8080/synthesize/hello.
Each plugin can ship its own Dockerfile in its repository using ovos-tts-server.
Development
pip install -e ".[audio,test]"
pytest test/ -v
Agent Integration
UTCP — Universal Tool Calling Protocol
The server exposes a UTCP manual at GET /utcp. Any UTCP-aware agent
(e.g. ovos-tool-adapters
UTCPToolBox) can point at this URL and auto-discover every synthesis endpoint
without additional configuration.
No extra dependencies are needed — GET /utcp is always available.
Example response (abbreviated):
{
"utcp_version": "1.0.1",
"manual_version": "1.0.0",
"tools": [
{
"name": "tts_synthesize_v2",
"description": "Synthesize speech from text (OVOS v2 endpoint)...",
"inputs": {
"type": "object",
"properties": {
"utterance": {"type": "string"},
"voice": {"type": "string"},
"lang": {"type": "string"}
},
"required": ["utterance"]
},
"tool_call_template": {
"call_template_type": "http",
"url": "http://localhost:9666/v2/synthesize",
"http_method": "GET"
}
}
]
}
ovos-tool-adapters config example:
{
"utcp_config": {
"providers": [
{
"provider_type": "http",
"name": "ovos-tts",
"url": "http://localhost:9666/utcp"
}
]
}
}
MCP — Model Context Protocol
The server can optionally expose a FastMCP server mounted at /mcp,
providing a synthesize tool callable by any MCP-compatible agent (Claude
Desktop, Claude Code, etc.).
Install the extra:
pip install "ovos-tts-server[mcp]"
Start with MCP enabled:
ovos-tts-server --engine ovos-tts-plugin-piper --mcp
Or from Python:
from ovos_tts_server import start_tts_server
app, engine = start_tts_server("ovos-tts-plugin-piper", enable_mcp=True)
The MCP server uses streamable HTTP transport (SSE-compatible) and is mounted alongside the existing FastAPI app — no separate process needed.
Claude Desktop claude_desktop_config.json example:
{
"mcpServers": {
"ovos-tts": {
"transport": "http",
"url": "http://localhost:9666/mcp"
}
}
}
synthesize tool:
| Parameter | Type | Required | Description |
|---|---|---|---|
text |
string | yes | Text to synthesize |
voice |
string | no | Voice/speaker identifier |
lang |
string | no | BCP-47 language code (e.g. en-us) |
Returns a JSON object:
{
"mime_type": "audio/wav",
"data": "<base64-encoded WAV>",
"path": "/tmp/ovos_synth_abc123.wav",
"phonemes": null
}
Credits
Developed by TigreGótico for OpenVoiceOS.
This project was funded through the NGI0 Commons Fund, a fund established by NLnet with financial support from the European Commission's Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101135429.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ovos_tts_server-1.8.0a1.tar.gz.
File metadata
- Download URL: ovos_tts_server-1.8.0a1.tar.gz
- Upload date:
- Size: 24.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfc5112d05b73a068a236a091ee9d740231fe221afa5a2445ad8614ea7145ad4
|
|
| MD5 |
289d7567ebe7478faea39d8ee49ee1ce
|
|
| BLAKE2b-256 |
60bbb5b075d02c8bdfba0376066270cfc261df31c8a1e7efcb6ee056e8dccca9
|
File details
Details for the file ovos_tts_server-1.8.0a1-py3-none-any.whl.
File metadata
- Download URL: ovos_tts_server-1.8.0a1-py3-none-any.whl
- Upload date:
- Size: 28.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4826cf60755c74c104ad8de85ed7a9a024fd4859c470ebd400efb6365a243935
|
|
| MD5 |
f9371b2d7836de3b015b3bcaf51d55b5
|
|
| BLAKE2b-256 |
20c951794fc2cf6ffecea9c7d06928ed83c4ab558da144f80ffb6c78a8d1942d
|