Setting Up Her Voice¶
File: configs/tts.yaml
Command: kenzy-tts [config_path]
This service is Kenzy's voice — text in, speech out. Out of the box it uses a cloud voice (OpenAI's TTS) because it needs zero downloads and sounds good on day one — but the voice can live entirely in your house: the Kokoro provider runs locally on your own hardware, and only what Kenzy says (never what you say) goes to a cloud provider in the default setup anyway.
Switching is a dropdown in the dashboard (Services → tts), and Running Fully Local walks the local path end to end, including the one system package Kokoro needs.
Pulled from the server
kenzy-tts pulls this config from the server at boot — it discovers the server via mDNS (or KENZY_SERVER_URL) and blocks until it answers, so start the server first. Edit it from the dashboard's Services tab (writes configs/services/tts.yaml on the server and restarts the service). Passing an explicit path loads locally instead (dev/offline). log_level (console) and log_capture_level (dashboard viewer depth, default debug) work like every service. See central config for backend services.
Advanced¶
Everything below is the full reference.
Service¶
| Key | Default | Description |
|---|---|---|
host |
"127.0.0.1" |
Bind address |
port |
8769 |
HTTP port |
Provider selection¶
| Key | Default | Description |
|---|---|---|
provider |
"openai" |
TTS backend: openai or kokoro |
OpenAI provider¶
Requires: OPENAI_API_KEY in .env
Long responses are automatically split at sentence boundaries and concatenated, so there is no effective limit on response length.
| Key | Default | Description |
|---|---|---|
openai.model |
"gpt-4o-mini-tts-2025-03-20" (shipped config) |
OpenAI TTS model |
openai.voice |
"sage" |
Voice persona (see below) |
openai.speed |
1.0 |
Playback speed multiplier, 0.25–4.0 |
openai.fallback |
true |
On a cloud failure, silently retry with local Kokoro — only takes effect when the kokoro extra is installed (see below); otherwise the failure surfaces as the error cue. |
Available voices¶
alloy · ash · ballad · coral · echo · fable · nova · onyx · sage · shimmer
Example¶
Kokoro provider¶
Requires:
- The kokoro extra: pip install 'kenzy[kokoro]' (or pip install -e ".[kokoro]" in a source checkout) — installs the kokoro package and PyTorch
- sudo apt-get install espeak-ng (system phonemization library)
- Run kenzy-setup after install to pre-download model weights
Kokoro runs entirely locally with no API key or internet connection required at runtime. It produces high-quality speech and outputs at 24 kHz mono — the same format as the OpenAI provider, so nothing downstream changes.
Note
The voice_prompt style instruction generated by the LLM (e.g. "speak warmly at a conversational pace") is an OpenAI-specific feature. It is silently ignored when using Kokoro.
| Key | Default | Description |
|---|---|---|
kokoro.voice |
"af_heart" |
Kokoro voice name (see below) |
kokoro.device |
"auto" |
Inference device (see below) |
kokoro.speed |
1.0 |
Playback speed multiplier, 0.5–2.0 |
kokoro.lang_code |
(from voice) | Language code. Derived automatically from the first character of the voice name if omitted. |
Device options¶
| Value | Description |
|---|---|
auto |
Detects the best available device at startup: CUDA → MPS → CPU (recommended) |
cpu |
Always use CPU |
cuda |
NVIDIA GPU. Also covers AMD GPUs when using a ROCm-enabled PyTorch build. |
mps |
Apple Silicon GPU (M1/M2/M3/M4) |
Voice names and languages¶
The voice name prefix determines the language:
| Prefix | Language | Example voices |
|---|---|---|
af_ |
American English (female) | af_heart, af_bella, af_sky |
am_ |
American English (male) | am_adam, am_michael |
bf_ |
British English (female) | bf_emma, bf_isabella |
bm_ |
British English (male) | bm_lewis, bm_george |
The lang_code is derived from the first character of the voice name (af_heart → 'a', bf_emma → 'b'). Set it explicitly only if you need to override this.
Example¶
Installation¶
# System dependency
sudo apt-get install espeak-ng
# Python package (or `pip install -e ".[kokoro]"` in a source checkout)
pip install 'kenzy[kokoro]'
# Pre-download model weights
kenzy-setup
Wyoming listener (Home Assistant voice pipelines)¶
Expose this service as a native HA text-to-speech provider, so Assist replies on your phone are spoken in Kenzy's actual voice — see On Your Phone for the full setup.
| Key | Default | Description |
|---|---|---|
wyoming.enabled |
false |
Start the Wyoming protocol listener alongside the HTTP service. Uses the exact same synthesis path (provider, voice, fallback chain) as /speak. Requires the wyoming package (included in the tts extra). |
wyoming.port |
10200 |
Listener port (the Piper convention, so HA operators guess right). |
Wyoming is plain, unauthenticated TCP — the listener follows the service
bind, so it stays loopback-only unless you've deliberately opened the
service to the LAN (KENZY_BIND=0.0.0.0 / --listen-all).