Test the installed server outside Emacs on GNU/Linux/macOS:
omnivox --version omnivox --check omnivox --list-voices
In WSL2, the launcher selects OMNIVOX_PROGRAM first, the per-user recorded
installation next, then a content-addressed source runtime, then omnivox on
PATH:
./servers/omnivox --check
The check initialises engine/output and plays tone then speech. Its success message is conditional on hearing both. Exit zero alone is not audible acceptance.
Select before loading Emacsvox:
export TTS_PROGRAM=omnivox
An export affects that shell and children; a shell-startup entry persists it.
On POSIX, servers/omnivox finds omnivox on PATH; OMNIVOX_PROGRAM
can explicitly override it. The WSL per-user selection persists across shells
and outranks staged source runtimes. Native Windows resolves omnivox.exe
through exec-path or the absolute TTS_PROGRAM. Follow
Installing Native Windows Emacsvox for the supported native x64 route.
In a running session, M-x omnivox temporarily selects that server. M-x tts-speak-version identifies the live adapter and M-x tts-restart restarts after a deliberate configuration change. The complete isolated start, expected speech, and recovery remain in Installation.
Emacs can run on an SSH host while Omnivox, installed voices, and playback stay
on your workstation. This uses Omnivox 1.18.0’s --serve and Emacsvox’s remote
transport. Remote access remains a preview feature.
Create a private token on the workstation. The tool refuses to overwrite or print an existing token:
mkdir -p "$HOME/.config/omnivox"
python3 /path/to/omnivox/tools/create_remote_token.py \
"$HOME/.config/omnivox/remote-token"
Leave the installed server running in a terminal, with the matching Emacsvox sound-pack directory:
omnivox --serve --token-file "$HOME/.config/omnivox/remote-token" \
--sound-root /path/to/emacsvox/sounds
For a Windows service through the WSL launcher, translate both paths:
/path/to/emacsvox/servers/omnivox --serve \
--token-file "$(wslpath -w "$HOME/.config/omnivox/remote-token")" \
--sound-root "$(wslpath -w /path/to/emacsvox/sounds)"
In another workstation terminal, copy the token through verified SSH and open
the reverse forward, replacing user@emacs-host:
ssh user@emacs-host 'mkdir -p ~/.config/omnivox; chmod 700 ~/.config/omnivox'
scp "$HOME/.config/omnivox/remote-token" user@emacs-host:.config/omnivox/remote-token
ssh user@emacs-host 'chmod 600 ~/.config/omnivox/remote-token'
ssh -o ExitOnForwardFailure=yes -o ServerAliveInterval=10 \
-o ServerAliveCountMax=2 \
-R 127.0.0.1:6417:127.0.0.1:6417 user@emacs-host
When Omnivox runs on Windows, use Windows OpenSSH for the final connection:
ssh.exe from WSL or ssh from PowerShell. It must reach Windows loopback;
a WSL client under NAT reaches separate WSL loopback instead. Windows SSH uses
its Windows keys and host-trust configuration.
Installing Remote Emacsvox provides the remote-only installation and isolated
launcher. --remote configures transport before speech starts and needs no
local Omnivox binary. For personal configuration, set before startup:
(setq tts-program "omnivox"
omnivox-remote-host "127.0.0.1"
omnivox-remote-port 6417
omnivox-remote-token-file "~/.config/omnivox/remote-token")
M-x omnivox-remote-connect connects/retries, M-x omnivox-remote-status inspects, and M-x omnivox-remote-disconnect stops and suspends retries. Reconnection refreshes voices/routing and discards unfinished speech. Main and notification retain separate workers. Only one Emacs session owns a service at a time.
If main connects but notification fails, main remains available while the
missing connection retries. Recovery does not replace working main speech.
omnivox-remote-auto-reconnect set to nil disables automatic retry; explicit
disconnect suspends it until another connection. Status retains retry and error
information.
Keep service and forwarded endpoint on loopback; do not enable SSH
GatewayPorts. SSH encrypts the transport and the token excludes other remote
host users. To rotate, stop the service, replace both private token files, and
restart. Typing quit or interrupting the service terminal stops workers.
Inventory belongs to the workstation; install/manage engines there. Bundled
icons resolve by pack-relative name. Personal sounds outside that directory
and sound uploads are unsupported; no --sound-root means no file-based icons.
For an occupied remote port, change the left side of -R and match
omnivox-remote-port. Authentication failure indicates differing tokens or
excessively broad file permissions; a busy service belongs to another connection.