08 · Desktop audio · Local AI

Make Python somebody else’s problem.

Syrinx wraps XTTS generation, cloning, training, models, processes, and logs in a managed Avalonia desktop workflow without pretending the Python backend vanished.

The managed boundary

The awkward workflow is the product.

Local voice tooling normally starts with the right Python version, a virtual environment, backend-specific packages, model folders, launch flags, and a terminal that must remain alive. Syrinx makes those states explicit. Settings select the Python 3.11 environment and model root; setup creates or adopts the environment; model services scan and optionally download with checksum verification; server control launches the discovered backend and polls health.

Backends differ, so the adapter admits it

The preferred launcher is tts-server, with xtts_api_server retained as a legacy fallback. Discovery inspects the selected environment and chooses the preferred backend when both exist. Process services own start, standard output and error capture, cancellation, exit observation, and stop. Health checks and a diagnostic snapshot give the UI more useful states than “connection failed”.

Generation sends text, language, model, and selected voice through the active backend, then records output for playback, history, export, and metadata. Linux playback probes local helpers; Windows and Linux paths remain platform-specific where they actually are.

Two meanings of clone

Quick Clone is conditioning, not training. If the backend exposes a clone endpoint, Syrinx uses it; otherwise it registers the reference audio locally and synthesises with speaker_wav. Fine-Tune is a separate job system with dataset path, base-model selection, readiness checks, run/cancel lifecycle, artifacts, registration, and manual activation. The default engine is the Coqui XTTS trainer, but its command is configurable because Python stacks enjoy changing the furniture.

Local does not mean public

The server binds to the machine's loopback interface by default. Optional LAN mode can be enabled, but host validation blocks public bindings. Reference voices, generated speech, models, and training artifacts should not become a public service because of one careless setting.

Failure needs somewhere to go

Logs carry timestamp, source, and severity, can be filtered and exported, and retain live-tail behaviour. GPU telemetry is optional through local tooling; CPU-only machines remain supported with an explicit warning that generation will be slower. Settings live in platform application-data storage, and machine-specific Python or server commands can be overridden without baking one developer’s environment into the app.

Current trade-off: Syrinx reduces setup and lifecycle friction; it cannot remove backend incompatibility, Python packaging failures, model download cost, or hardware-dependent generation time. It makes those failures visible and recoverable from the desktop.