This release is a pre-release and may not be stable for production use.
Wyoming OVOS TTS Bridge
This bridge exposes any OpenVoiceOS TTS plugin as a Wyoming protocol server. Use it with Home Assistant, Rhasspy, and other Wyoming-compatible voice pipelines.
┌──────────────────────────────────────┐
Wyoming client │ wyoming-ovos-tts │
(Home Assistant, │ │
Rhasspy, etc.) │ ┌────────────────────────────────┐ │
│ │ OVOSTTSEventHandler │ │
Synthesize ───────────►│ │ │ │
AudioStart ◄───────────│ │ asyncio.to_thread() ──────────►│ OVOSTTSFactory
AudioChunk* ◄──────────│ │ TTS.synth(text) │ └──> TTS plugin
AudioStop ◄───────────│ │ │
│ └────────────────────────────────┘ │
Describe ─────────────►│ Info(tts=[TtsProgram(...)]) │
Info ◄─────────────────│ │
└──────────────────────────────────────┘
Features
- Non-streaming TTS: a single
Synthesizeevent returns the complete audio. - Streaming TTS (Wyoming v1.7+):
SynthesizeStart/SynthesizeChunk/SynthesizeStopstreams audio at each sentence boundary, usingsentence-stream(the same segmenter used bywyoming-piper), for lower latency. - Multi-language: the bridge advertises the plugin's
available_languagesin the WyomingInforesponse. - Thread-safe: the blocking
tts.synth()call runs viaasyncio.to_thread(), so the event loop stays responsive. - Error reporting: failures come back as Wyoming
Errorevents. - Signal handling: the bridge shuts down cleanly on SIGINT/SIGTERM.
Installation
From PyPI
pip install wyoming-ovos-tts
You also need the OVOS TTS plugin you want to bridge, for example:
pip install ovos-tts-plugin-server
pip install ovos-tts-plugin-piper
From source
git clone https://github.com/OpenVoiceOS/wyoming-ovos-tts.git
cd wyoming-ovos-tts
pip install -e .
Configuration
The bridge reads plugin configuration from mycroft.conf, under tts.<plugin-name>:
{
"lang": "en-US",
"tts": {
"ovos-tts-plugin-server": {
"host": "https://pipertts.ziggyai.online"
},
"ovos-tts-plugin-piper": {
"voice": "en_US-lessac-medium"
},
"ovos-tts-plugin-espeak": {
"voice": "en+f3"
}
}
}
The language comes from tts.<plugin-name>.lang if set, otherwise from lang at the root level. Each plugin's config section must match the value passed to --plugin-name.
Usage
# TCP server using public OVOS TTS servers
wyoming-ovos-tts --uri tcp://0.0.0.0:7892 \
--plugin-name ovos-tts-plugin-server \
--debug
# With streaming disabled (requires wyoming info)
wyoming-ovos-tts --uri tcp://0.0.0.0:7892 \
--plugin-name ovos-tts-plugin-piper \
--no-streaming
# Unix socket
wyoming-ovos-tts --uri unix:///run/wyoming-tts.sock \
--plugin-name ovos-tts-plugin-server
# Over stdio (for subprocess usage)
wyoming-ovos-tts --plugin-name ovos-tts-plugin-server
CLI Reference
| Argument | Required | Default | Description |
|---|---|---|---|
--plugin-name |
Yes | none | OVOS TTS plugin module name (e.g. ovos-tts-plugin-server) |
--uri |
No | stdio:// |
tcp://HOST:PORT, unix:///path, or stdio:// |
--samples-per-chunk |
No | 1024 |
Audio samples per Wyoming AudioChunk event |
--no-streaming |
No | False |
Disable streaming TTS protocol (only Synthesize) |
--debug |
No | False |
Enable DEBUG-level logging |
--log-format |
No | %(levelname)s:%(name)s:%(message)s |
Python log format string |
--version |
No | none | Print version and exit |
Wyoming Protocol
Non-streaming flow
Client → Describe
Server → Info(tts=[TtsProgram(supports_synthesize_streaming=True, ...)])
Client → Synthesize(text="Hello world", voice=VoiceSettings(...))
Server → AudioStart(rate=22050, width=2, channels=1)
→ AudioChunk (1024 samples of PCM)
→ AudioChunk ...
→ AudioStop
Streaming flow (v1.7+)
Client → SynthesizeStart
Client → SynthesizeChunk(text="Hello. ")
Server → AudioStart → AudioChunk+ → AudioStop (sentence "Hello.")
Client → SynthesizeChunk(text="How are you? I'm ")
Server → AudioStart → AudioChunk+ → AudioStop (sentence "How are you?")
Client → SynthesizeChunk(text="fine.")
Client → SynthesizeStop
Server → AudioStart → AudioChunk+ → AudioStop (sentence "I'm fine.")
Server → SynthesizeStopped
When --no-streaming is not set, sentence-stream segments incoming text into complete sentences. It handles abbreviations (Dr.), decimals (3.14), ellipses, and non-Latin scripts correctly. Each sentence is synthesized and streamed as its own AudioStart→AudioChunk→AudioStop group as soon as it is complete. This lowers time-to-first-audio compared to the non-streaming path.
A trailing partial sentence is flushed when SynthesizeStop arrives, followed by a single SynthesizeStopped.
Supported Plugin Types
The bridge supports any OVOS TTS plugin that implements TTS from ovos_plugin_manager.templates.tts:
ovos-tts-plugin-server: proxy to remote TTS serversovos-tts-plugin-piper: local Piper TTSovos-tts-plugin-espeak: eSpeak NG synthesizerovos-tts-plugin-mimic: Mycroft Mimicovos-tts-plugin-google-tx: Google Translate TTSovos-tts-plugin-nos: NOS TTSovos-tts-plugin-sam: Software Automatic Mouthovos-tts-plugin-azure: Microsoft Azure Cognitive Servicesovos-tts-plugin-ibm: IBM Watson TTSovos-tts-plugin-amazon: Amazon Polly TTS
Documentation
Detailed docs live in docs/:
Credits
TigreGótico develops this project 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.
Metadata
Release files for wyoming-ovos-tts 0.2.1a3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| wyoming_ovos_tts-0.2.1a3.tar.gz | 13.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| wyoming_ovos_tts-0.2.1a3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.9 kB
Release files / wyoming_ovos_tts-0.2.1a3.tar.gz
| Download URL | wyoming_ovos_tts-0.2.1a3.tar.gz |
|---|---|
| Size | 13.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e8f61ad72d40ac29658ab35fa493444c6a8da8823f3905445e8d38048d35a800
|
|
BLAKE2b-256 checksum How to use checksums |
6e66fbc55b7afead0a0f118a87381e4894306d32f265aed3dd11e870a31a8a18
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / wyoming_ovos_tts-0.2.1a3-py3-none-any.whl
| Download URL | wyoming_ovos_tts-0.2.1a3-py3-none-any.whl |
|---|---|
| Size | 8.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dc67bfb18dc434c11d4c3d564cf882a9adfcf8f20d81e9ea62916d763845f977
|
|
BLAKE2b-256 checksum How to use checksums |
4462fd473f3a842d2b44a8a05198b863387b4da7be6fc48281d467dde20a184b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|