14.6 Building Omnivox For WSL2

This advanced path maintains the reproducible Windows bundle or optional engine integrations. Ordinary WSL2 installations should use the prebuilt Windows release. This source target produces x86-64 Windows.

Requirements are:

Rust, MinGW, CMake, Clang/libclang, eSpeak NG, Roslyn, Visual Studio, and .NET reference assemblies need not be installed in WSL; the controlled toolchain pins/builds them. Eloquence, DECtalk, and RHVoice runtime/data remain optional and unnecessary for WinRT.

Check prerequisites with:

cd /path/to/emacsvox
make verify-windows-omnivox-toolchain

The first run downloads pinned .NET compiler packages, builds the pinned Docker image, and checks exact Rust, MinGW, libclang, Roslyn, and Framework versions. It is not a read-only presence check. Failures identify missing host tools or unsupported Framework before the full build.

With clean Emacsvox and sibling Omnivox tracked files, run:

cd /path/to/emacsvox
make windows-omnivox

This reproducible release path builds a pinned Windows-GNU executable and stages a content-addressed runtime under servers/omnivox-bin. When the Piper lock identifies the matching integrations, it includes the checksum-pinned Piper companion, RHVoice helper without runtime, Flite with CMU US SLT, and RuTTS with male/female Russian voices. It bundles no Piper model or RuLex. The payload is also copied to Windows-local storage to avoid WSL filesystem cost during discovery. It does not download Eloquence, DECtalk, or RHVoice runtimes or require them for WinRT.

The final live gate starts that exact runtime, discovers Flite SLT and both RuTTS voices, and requires nonempty WAV synthesis from each helper. Repeat without rebuilding using make verify-windows-omnivox-live.

To register Piper, review its model/card and keep the adjacent .onnx.json or .json. Supply the absolute model path while staging:

OMNIVOX_PIPER_MODEL=/absolute/path/to/voice.onnx make windows-omnivox

Model/configuration are copied to separate content-addressed Windows LocalAppData storage with recorded hashes, not bundled into the runtime. Omitting that variable installs the companion but leaves Piper unregistered. After staging, check with a fresh process:

./servers/omnivox --engine piper --list-voices

Restart both speech processes or Emacs, then inspect running engines with C-e H v b. Piper requires the newly staged server and successfully loaded model/helper. The direct C-e d e preference chooser is not a read-only inventory command; use the browser to inspect without selecting a preference.

For tracked development changes, use the route in Integration Maintenance rather than bypassing the clean-release guard:

OMNIVOX_RHVOICE_LIBRARY=/mnt/c/path/to/RHVoice.dll \
  OMNIVOX_RHVOICE_DATA=/mnt/c/path/to/RHVoice/data \
  make windows-omnivox-dev
./servers/omnivox --engine flite --list-voices
./servers/omnivox --engine rutts --list-voices

It builds current source, stages RHVoice’s helper, Flite SLT, and RuTTS 6.3.3 male/female voices, deliberately omitting the older pinned Piper companion. RuTTS needs no separate install; RuLex is excluded. RHVoice needs compatible RHVoice.dll and language/voice data. Supplied library/data variables are validated and Windows path pointers retained beside the local runtime; the launcher restores them for fresh sessions. Also set OMNIVOX_RHVOICE_CONFIG for a separate configuration directory. These external files are not copied into the payload. Omnivox’s docs/RHVOICE.md and docs/RUTTS.md give validation details. Restart after restaging/changing inputs, then inspect with C-e H v b.

Piper tests against newer committed Omnivox use windows-omnivox-piper-dev and a native Windows CI artifact. It requires the published SHA-256 and a reviewed external model, rejecting dirty or different source. See Integration Maintenance for provenance and the complete command. This does not alter the reproducible release’s pinned companion.