14.7 Selecting And Checking Omnivox

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.

14.7.1 Remote Workstation Speech (Preview)

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.