Skip to content

Open TTS v1.6.0

Choose a tag to compare

@cyanxxy cyanxxy released this 17 Jul 15:51

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, provider mlx, device metal (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.