Open TTS v1.6.0
Open TTS v1.6.0 makes the desktop TTS stack production-grade for long local Qwen jobs, dynamic hardware selection, and reliable Reader playback.
Highlights
- Resolves the native Qwen device at runtime instead of hard-coding a target: MLX selects Metal or CPU on Apple Silicon, while the experimental Windows x64 build selects LibTorch CUDA or CPU according to the actual machine
- Runs Qwen3-TTS entirely in the resident Rust bridge with pinned
qwen3-tts-rs; no Python process, cloud inference path, or alternate Qwen backend is involved - Splits long Studio and Reader text into ordered, sentence-aware requests of at most 6,000 trimmed Unicode scalar values while preserving one continuous playback timeline
- Allows only the exact next section of the same job through the inter-request cooldown, while preserving concurrency and unrelated-request limits
- Preserves natural silence between native request sections and keeps completed audio playable when a later section fails
- Uploads Base voice-clone reference audio once per worker session, reuses prepared features by a short-lived job key, and automatically re-seeds a replacement worker after a cache miss
- Adds stronger Reader/player synchronization, progress restoration, section highlighting, seekable partial results, and failed-section audio rollback
Runtime and security hardening
- Keeps the WebSocket bridge loopback-only and protects each resident process with a random, memory-only capability passed through
OPEN_TTS_WS_AUTH_TOKEN, not command-line arguments or user authentication - Makes cancellation authoritative across worker acquisition, activation, transport send, and sender ownership races
- Adds bounded text, base64, WebSocket frame, audio output, chunk-count, idle, and progress limits at the Electron and Rust boundaries
- Pins Qwen model profiles and downloads by architecture/revision, verifies the NeuCodec encoder by size and SHA-256, and strengthens cancellation-safe model downloads
- Pins Kokoro model, tokenizer, cache, and voice requests to its immutable Hugging Face revision across supported URL shapes
- Adds provider-aware inference benchmark options and machine-readable output for Electron/native comparisons
Fixes
- Prevents the 500 ms main-process limiter from aborting fast multi-section Reader and Studio jobs
- Reports cancellation as cancellation instead of a WebSocket transport failure at the acquire/activate boundary
- Restores the 0.2-second pause at Qwen section joins
- Prevents a Reader resume point from being overwritten while persisted audio state is restoring
- Removes audio chunks from a failed section so duration, statistics, seeking, and partial results agree
- Counts request length after outer whitespace is trimmed and uses Unicode scalar semantics consistently
- Avoids repeatedly transferring and validating large voice-clone WAV payloads for every section
Verification
- 506/506 JavaScript tests passed
- 39/39 Rust tests passed
- ESLint passed
- TypeScript and production Vite build passed
- Electron main/preload and optimized Rust desktop bridge builds passed
- MLX Metal kernels and native macOS libraries bundled successfully
- Live Electron probe reported
qwen3-tts-rs 0.2.2, providermlx, devicemetal (accelerated) - Live native Qwen smoke test generated 3.76 seconds of 24 kHz audio in 2.12 seconds with no page or console errors
Qwen remains local-only. Apple Silicon macOS is supported through MLX; Windows x64 remains experimental through LibTorch. Intel macOS, Windows on Arm, and Linux do not package a native Qwen provider in this release, while Kokoro and Supertonic remain available according to browser support.