Speech recognition and voice
The speaker needs speech recognition and a voice. They come either from Homer nodes — the homer-node program on your home computers, which installs everything itself, without Docker — or from your own speaches server.
Through Homer nodes
This is how a home is set up from the start. You need at least one computer with homer-node (Settings → Nodes → Add node, then homer-node pair and homer-node install on that computer; details — Homer Node). The node downloads by itself:
- recognition: GigaAM v3 by Sber (MIT) for Russian and Parakeet TDT 110M by NVIDIA (CC BY 4.0) for English, in the sherpa-onnx engine. They run on the CPU, no GPU needed. GigaAM makes 2–4 times fewer mistakes in Russian than whisper and handles 11 seconds of speech in 0.6 s. It writes numbers as digits: “22°C”, “50%”. The node picks the recognition model by the language of the request; Russian is the default;
- voice: on a node with an NVIDIA GPU the speaker talks in your own voice on Qwen3-TTS, by default the built-in “Homer” voice; without NVIDIA, the same “Homer” voice in Piper for Russian and the English (
en_US) Piper voices kristin, norman, john. Native Piper without Python: 0.1–0.3 s per phrase. The Russian piper-voices (irina, dmitri, denis, ruslan) are not installed since 1.0: their licenses are not fit for a product; - Vosk models for the speaker's name detection, Russian and English.
In Speaker speech and voice, the Homer nodes option is selected: models and voices come from the nodes, and voice tests and recognition of your own voice recordings go through them too. With several nodes, the Homer server picks one that answers; if none answers, the speaker switches to the fallback (Vosk and the Windows voice), as without speaches.
Which voices to install is set by voices in the node's node.json (["homer"]); by default all from the node's manifest. In an English home, pick an English voice in Speaker speech and voice: the default voice is Russian. Speech only, without a language model: "roles": ["stt", "tts"].
Your own voice on Qwen3-TTS takes about 6 GB of video memory. If the same GPU is needed for chat and games, the node setting voiceWeights: "int8" (in node.json or via POST /config, applied after a node restart) shrinks the language part of the model: about 1.4 GB less video memory, no audible difference, and the price is a phrase about half a second longer. The default is bf16. With int8, the GPU guard unloads the smart model for the voice less often.
A shared GPU
If a big model from another program (llama-swap, LM Studio, Ollama) runs on the same GPU, the node gives way: it runs its own language models on the CPU, doesn't start your own voice (the speaker talks in a Piper voice), and doesn't keep the “offline” brain loaded in Ollama. 5 minutes after the other model unloads, everything returns to the GPU. The threshold and behavior are set by the gpu section in node.json; details in docs/homer-node-plan.md, “GPU guard”.
Piper voice licenses
The Russian piper-voices — irina, dmitri, denis, ruslan — are fine-tuned from the English lessac voice, whose dataset is for research only; ruslan is CC BY-NC-SA, and irina's license is unknown. So the nodes don't install them and speak with the “Homer” voice — Homer's own, with its owner's consent. On your own speaches they are available as before: that's fine for your own home. The English voices kristin, norman and john have a clean license: MIT, trained on public-domain LibriVox recordings. For a commercial install in Russian, a voice with a clean license is your own voice on Qwen3-TTS (Apache 2.0), which needs an NVIDIA GPU, or Piper “Homer”.
Your own speaches
speaches is an open server with an OpenAI-compatible API: whisper for recognition and Piper or Kokoro for synthesis. Choose Own speaches at address and enter its address.
1. Running it in Docker
With an NVIDIA GPU:
docker run -d --name speaches --restart unless-stopped --gpus all -p 8770:8000 ^
-v speaches-cache:/home/ubuntu/.cache/huggingface/hub ^
ghcr.io/speaches-ai/speaches:latest-cudaWithout a GPU, use the latest-cpu image. It is slower, about 2–4 seconds per phrase:
docker run -d --name speaches --restart unless-stopped -p 8770:8000 ^
-v speaches-cache:/home/ubuntu/.cache/huggingface/hub ^
ghcr.io/speaches-ai/speaches:latest-cpuThe speaches-cache volume keeps downloaded models so they survive re-creating the container.
2. Models
speaches downloads nothing by itself. You need a recognition model and at least one voice:
curl -X POST http://localhost:8770/v1/models/deepdml/faster-whisper-large-v3-turbo-ct2
curl -X POST http://localhost:8770/v1/models/speaches-ai/piper-ru_RU-irina-mediumThere are four Russian Piper voices:
| Voice | Model |
|---|---|
| irina | speaches-ai/piper-ru_RU-irina-medium |
| ruslan | speaches-ai/piper-ru_RU-ruslan-medium |
| dmitri | speaches-ai/piper-ru_RU-dmitri-medium |
| denis | speaches-ai/piper-ru_RU-denis-medium |
For an English home, download an English Piper voice (en_US) and pick it in Homer. If your own voice fails in an English home, the speaker falls back to amy:
curl -X POST http://localhost:8770/v1/models/speaches-ai/piper-en_US-amy-mediumThe whisper model above is multilingual and recognizes English too.
TIP
Kokoro's multilingual models have 50-plus voices, but none of them is Russian.
To check what is downloaded: curl http://localhost:8770/v1/models.
3. Setting it up in Homer
Settings → Speaker → Speaker speech and voice.
- Homer nodes / Own speaches at address: where recognition and voice come from.
- speaches address (only for your own speaches): the address of the computer with Docker and port 8770, e.g.
http://192.168.1.20:8770. The Check button asks speaches and shows how many voices and recognition models are already downloaded. You can check the address before saving. - Recognition: a whisper model from the downloaded ones.
- Voice model and voice: when you change the model, the voice switches to one of its voices.
- Speed: from 0.5× to 2×.
- Test phrase: ▶ Play here plays the test on your phone or in the browser, 🔊 On the speaker makes the speaker say it.
- Save: the speaker picks up the setting within a minute, without a restart. Defaults restores the original values.
An empty field means the speaker keeps its own default: address http://127.0.0.1:8770, voice irina. In an English home, pick an English voice: the default is Russian.
4. Your own voice
The speaker can answer in the owner's voice. A 10–15 second recording is enough, but it can be longer, or you can upload a ready file: the Qwen3-TTS model on the GPU of the speaker's PC repeats the voice from it. speaches can't do this, so a separate service, tools/voiceclone, runs next to it.
The model is Qwen3-TTS 1.7B, fine-tuned to follow Russian stress. Before synthesis, RUAccent places the stress: it tells homographs apart by meaning. Both models and the faster-qwen3-tts build are under free licenses (Apache 2.0 and MIT) and can be used in commercial installs too.
Your own voice in English
In an English home, the service speaks with the base multilingual model Qwen3-TTS 1.7B Base (HOMER_CLONE_MODEL_EN or --model-en), without RUAccent and the stress dictionary. Homer Node downloads it in the background after the Russian model (about 3.7 GB more); until then, the Russian model speaks. It loads on the first English request and replaces the Russian model, so only one model is on the GPU at a time. If it fails to load, the service speaks with the Russian model until restart.
The text to read when recording is still in Russian for now: the stress model is Russian.
Start the service once on a PC with an NVIDIA GPU (about 6 GB of video memory):
powershell -ExecutionPolicy Bypass -File tools\voiceclone\install-autostart.ps1You need Python 3.12 and git. The script creates a Python environment with PyTorch for CUDA 12.8 (it works for RTX 50xx too), registers the homer-voiceclone task at sign-in and starts it right away. Port 8771, log tmp\voiceclone.log. The models (about 4.5 GB) download on first start; stress placement is ready about a minute after start. The backup speaker on the GPD reaches the service over the network, so allow the port in the firewall (as administrator):
New-NetFirewallRule -DisplayName homer-voiceclone -Direction Inbound -Protocol TCP -LocalPort 8771 -Profile Private -Action AllowRecord a voice in the same “Speaker speech and voice” card, Custom voices block:
- Press Record and read the text on screen calmly, in your normal voice, in a quiet room, holding the phone 20–30 cm away. When done, press Stop. You can record as long as you like, up to half an hour.
- Or press Upload file and choose a ready recording: wav, mp3, m4a, ogg, flac — anything ffmpeg reads, up to 300 MB.
- Play recording: make sure there is no noise or music, because the clone will repeat them too. Name the voice and press Add voice.
- In a Russian home, choose the grammatical gender the speaker uses about itself («включил» or «включила»): it can't be guessed from the recording. English doesn't need this.
- ▶ Try: listen to the voice. Speak with it: the speaker starts answering in this voice right away.
You can keep several voices (up to 20) and switch between them on the fly. Name renames a voice, Delete removes it from the home and the nodes. If the speaker was using a deleted voice, it goes back to the default voice.
Long recordings. Qwen3-TTS doesn't train on the recording: it imitates an 8–12 second sample. A longer sample only slows every answer down and doesn't make the voice more accurate. So from a long recording Homer picks the best piece itself: the one with the most speech, no clipping, and pauses at the edges so it doesn't cut mid-word. In the list such a voice is labeled, for example, “11 s sample of 3 min”. The whole recording is kept too. Record a minute or two at a calm pace so there is something to choose from.
Voice per name. You can call the speaker by different names, and each answers in its own voice: “Homer, …” in one, “Tony, …” in another. In the Voice per name block, add a name and pick a voice, then press Save names. The voice in the list gets the label “answers to “Tony””. The speaker hears a name from here even if it isn't among the speaker names. From then on, whoever was called keeps talking until called by another name. A name wins over the room voice.
Voice per room. Speakers in different rooms can talk in different voices: one in the kids' room, another in the living room. In the Voice per room block, pick a voice for the plan rooms you want; the other rooms use the home voice. The speaker knows its room from the HOMER_ROOM setting (by default «Гостиная», the living room). The GPD backup speaker and Smartbox send it to the main speaker with every phrase, and it answers in that room's voice.
A phrase in your own voice is synthesized in 0.5–1.5 seconds; common answers come from ready recordings. Each voice has its own speed: the Voice speed slider changes the voice selected above and saves right away. It applies in rooms and names too. Your own voice is sped up separately (Qwen3-TTS has no speed setting; ffmpeg changes the tempo without changing pitch), and the home speed set earlier doesn't apply to it. If the voice service is down, the speaker answers for 30 seconds in the default voice from speaches, then tries your own again.
Stress marks
This applies to Russian only. Your own voice places stress itself and is almost always right. If it gets a word wrong, enter it in the Stress marks field with the stressed vowel in upper case, one word per line:
замОк
гостИнаяThe dictionary wins over automatic placement. Each word form is written separately: «гостИная» won't fix «гостиной». Other notations work too — «зам+ок» and «замо́к»; they are saved in the upper-case form. The speaker picks up the dictionary within a minute, and common answers with the new stress are re-recorded.
Your own voice model
In the Custom voice service field, you can set another synthesis server instead of tools/voiceclone, for example on another computer or with your own model. An empty field means the service on the same PC as the speaker. The server must answer the same way:
PUT /v1/voices/<id>: body is the recording in wav; answer{id, text, seconds};POST /v1/audio/speechwith body{voice, input, stress}: answer is wav; 404 if no voice with thatidis loaded (the speaker then sends the recording itself);GET /: state.
The speaker also sends the home language in the lang field of the synthesis request (ru if missing).
Your model's license
Whoever runs a model on their own server is responsible for it. Many voice cloning models, including F5-TTS and XTTS, have licenses that allow only non-commercial use.
If speaches is down
The speaker doesn't break: for 30 seconds it switches to the fallback — Vosk for recognition and the Windows voice for answers — and then tries speaches again. In the speaker log this is the line «speaches недоступен — резерв» (speaches unavailable, fallback).
Warm-up
speaches unloads the recognition model after a few minutes idle, and the first phrase then waits 4–6 seconds for it to load. To avoid this, the speaker sends half a second of silence every 4 minutes of idle time.