Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Wyoming OVOS TTS Bridge

MIT License Python Wyoming OVOS

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 Synthesize event returns the complete audio.
  • Streaming TTS (Wyoming v1.7+): SynthesizeStart/SynthesizeChunk/SynthesizeStop streams audio at each sentence boundary, using sentence-stream (the same segmenter used by wyoming-piper), for lower latency.
  • Multi-language: the bridge advertises the plugin's available_languages in the Wyoming Info response.
  • Thread-safe: the blocking tts.synth() call runs via asyncio.to_thread(), so the event loop stays responsive.
  • Error reporting: failures come back as Wyoming Error events.
  • 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 AudioStartAudioChunkAudioStop 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 servers
  • ovos-tts-plugin-piper: local Piper TTS
  • ovos-tts-plugin-espeak: eSpeak NG synthesizer
  • ovos-tts-plugin-mimic: Mycroft Mimic
  • ovos-tts-plugin-google-tx: Google Translate TTS
  • ovos-tts-plugin-nos: NOS TTS
  • ovos-tts-plugin-sam: Software Automatic Mouth
  • ovos-tts-plugin-azure: Microsoft Azure Cognitive Services
  • ovos-tts-plugin-ibm: IBM Watson TTS
  • ovos-tts-plugin-amazon: Amazon Polly TTS

Documentation

Detailed docs live in docs/:

Credits

TigreGótico develops this project for OpenVoiceOS.

NGI0 Commons Fund

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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wyoming_ovos_tts-0.2.1a1.tar.gz (13.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wyoming_ovos_tts-0.2.1a1-py3-none-any.whl (8.5 kB view details)

Uploaded Python 3

File details

Details for the file wyoming_ovos_tts-0.2.1a1.tar.gz.

File metadata

  • Download URL: wyoming_ovos_tts-0.2.1a1.tar.gz
  • Upload date:
  • Size: 13.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for wyoming_ovos_tts-0.2.1a1.tar.gz
Algorithm Hash digest
SHA256 b2b54e893fe2f87cf3c35ea73507b9919fd545c964dcf630c98bdf90490ed538
MD5 6ca359124fbb142bfa5051d755877e10
BLAKE2b-256 c3002a27d4771c294c2189823d49f45eed466941030b6f39b3c9f3a27245119b

See more details on using hashes here.

File details

Details for the file wyoming_ovos_tts-0.2.1a1-py3-none-any.whl.

File metadata

File hashes

Hashes for wyoming_ovos_tts-0.2.1a1-py3-none-any.whl
Algorithm Hash digest
SHA256 15ae2a203f248e0a186f5b6109eb3ea70bfc8b5dbf0430fe5da2c1f7526bab16
MD5 bc664bf50440510c15d8c36b5dc4d603
BLAKE2b-256 6fbe9061f522ad9667d3c8bee1f877a4b06b415239241697b74b660473f788e3

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.2.1a1 This release

2 files

0.2.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page