- Add experimental
--backend omnivoicefor OmniVoice TTS via onnxruntime--omnivoice-stepsto configure MaskGIT decode steps (default: 32)--omnivoice-ref-dirfor custom voices: a directory of voices organized
as<language>/<voice_name>/, loaded at startup and advertised as voices.
Each voice directory is either a cloning voice (ref.{wav,txt}) or a
voice-design voice (instruct.txt, whose text describes the desired voice
style). Adefaultvoice is also advertised for every supported language;
it (or an empty/unknown voice name) uses the built-in speaker.--omnivoice-languageto set the default synthesis language (default:
English); per-request language codes (en_US,en-US) are also honored.
Thedefaultvoice is advertised for the ~128 languages with an ISO 639-1
tag (plus Cantonese, Standard Arabic and Odia) rather than all 646 codes
OmniVoice lists; the rest are still reachable, just not advertised--omnivoice-onnx-repoto override the HuggingFace repo for the ONNX graph- block-wise int4 quantization is hardcoded for now (clean audio at low step
counts, e.g.--omnivoice-steps 10); reproduce with
script/quantize_omnivoice.py - the ONNX model is used from a
--data-dirif present there, otherwise
downloaded into--download-dir(used as the HuggingFace cache) - install with the
omnivoiceoptional dependencies. For Docker, this is a
separaterhasspy/wyoming-piper:omnivoiceimage (amd64 only) so the
default image doesn't grow a torch/transformers dependency.
- Require Python 3.10 or later (the
omnivoicedependencies need it) - Add
--local-files-onlyto run the HuggingFace loader in offline mode - Add
--web-serverfor a web UI (runs alongside the Wyoming server) to manage
custom and cloned voices. Custom Piper voices are managed across every
--data-dir, not just--download-dir(where uploads still land). Missing
dependencies and an unavailable port are reported at startup, before the
backend loads its model. - Fix voices added or removed while the server runs being ignored until the
process restarted. The voice list was built once at startup, so a voice added
through the web UI was never advertised, and requesting it silently fell back
to the OmniVoice built-in speaker. Voices are now rescanned perDescribeand
when an unknown voice is requested. - Fix custom voices being advertised under their
datasetname instead of their
file name, which made them impossible to synthesize when the two disagreed.
Thedatasetname is still accepted as an alias, including as--voice. - Fix a custom voice with missing or unreadable files (a leftover
.onnxwith no
.onnx.json, for example) stopping the server from starting. It is now skipped
with a warning; a broken--voiceis still an error.