AI & VOICE / VOICE OUTPUT

Voice output (TTS)

On-device neural TTS with three engines: Piper (primary, ONNX neural), Pocket-TTS (Kyutai's voice-cloning neural engine), and espeak-ng as a lightweight automatic fallback.

Engines

GPU acceleration

VoxCtrl supports GPU acceleration (CUDA) for the Piper engine only — it appends a --cuda flag to the spawned Piper subprocess at runtime. Pocket-TTS (Candle-based) does not currently expose a GPU toggle. If GPU initialization fails, Piper automatically and gracefully falls back to the CPU without crashing.

Piper voice catalog

Voice Quality Sample rate
en-us-libritts-high High 22050 Hz
en-us-ryan-high High 22050 Hz
en-us-ryan-medium Medium 22050 Hz
en-us-ryan-low Low 16000 Hz
en-us-lessac-medium (default) Medium 16000 Hz
en-us-lessac-low Low 16000 Hz
en-us-amy-low Low 16000 Hz
en-us-kathleen-low Low 16000 Hz
en-us-danny-low Low 16000 Hz
en-gb-southern_english_female-low Low 16000 Hz
en-gb-alan-low Low 16000 Hz

Voices are downloaded as .tar.gz archives and extracted into the configured voice directory (default ~/.local/share/voxctrl/piper-voices/).

Pocket-TTS voice catalog

ID Name
alba Alba (Female, default)
anna Anna (Female)
vera Vera (Female)
charles Charles (Male)
michael Michael (Male)

Drop a .wav reference clip into the configured pocket_tts.voice_dir (default ~/.local/share/voxctrl/pocket-tts-voices/) to add a custom voice — no re-encoding or extra metadata needed. The filename (without extension) becomes the voice's id, e.g. narrator.wav adds "Narrator (Custom)". Naming a clip after a built-in voice (e.g. alba.wav) overrides that voice's bundled reference clip instead of adding a new entry.

Setup

Stop key

Default KEY_ESCAPE. Press it from any window to interrupt TTS playback instantly — playback can be interrupted mid-generation, not just between utterances. Configure in Settings → TTS → Stop Key.

Response overlay

When enabled (tts.response_overlay), a green "SYSTEM RESPONDING" speaking pill slides up from the bottom of the recording overlay while TTS plays, with a live mini-equalizer and the active target label — distinct from the recording state so you always know when the app is speaking.