Releases: CrispStrobe/CrispTTS
Release list
v0.6.0 — Lazy registry, caching, 254 tests
What's New
Lazy Handler Registry (Phase 10)
The single biggest performance improvement: handlers now import only when first used, not at startup.
| Before | After |
|---|---|
| 6+ min startup (loads all 21 handlers) | Instant (loads only requested handler) |
| ~2 GB RAM (torch + transformers + outetts) | ~200 MB for crispasr-only use |
| 350s test suite | 60s test suite |
Import Hang Fix (Phase 9)
Root causes identified and fixed:
config.py: OuteTTS import hangs indefinitely (protobuf compilation) — removedutils.py: pygame/sounddevice block on headless machines — deferred to first usedecoder.py: SNAC model download at import — deferred to first use
New CLI Features
| Flag | Description |
|---|---|
--backend NAME |
Shortcut for CrispASR backends (e.g., --backend kokoro) |
--batch |
Split input at blank lines, produce numbered output files |
--lexicon TSV |
Custom word→phoneme mappings for CrispASR |
--list-models --check |
Probe backend availability |
--cache-stats |
Show synthesis cache statistics |
--cache-clear |
Clear cached synthesis results |
--rate-limit N |
Max requests/min/IP for server (default 10) |
Server Improvements
- Threaded: Concurrent requests via ThreadingMixIn
- Rate limiting: Token bucket per IP (429 on exceed)
- Synthesis caching: Hash-based LRU, serves identical requests from cache
- Enhanced /health: Reports loaded handlers, memory RSS, registered backends
- Content-Disposition: Proper download filename headers
Performance Optimizations (Phase 8)
- Reduced file I/O in watermark pipeline (4 ops → 3)
- Lazy watermark model loading (~200MB deferred until first synthesis)
- Streaming synthesis concurrency limit (Semaphore(4))
- Subprocess stdout → DEVNULL (only stderr captured)
Test Coverage (Phase 11)
254 tests passing in ~60s:
- 30 new tests for cache, crossfade, lazy registry, rate limiting, config validation, --backend shortcut
- New test files: test_cache.py, test_server.py
Audio Utilities
crossfade_segments(): Linear crossfade for concatenating chunked audio- Config validation at startup with clear warnings
- Batch error recovery (failed paragraphs skipped, summary at end)
v0.5.0 — 14 CrispASR backends, TADA inline cloning
What's New
4 New CrispASR TTS Backends
CrispTTS now exposes 14 native C++ TTS backends via CrispASR (up from 10):
| Backend | Type | Sample Rate | Voice Cloning |
|---|---|---|---|
| BananaMind-TTS | Tacotron-lite + HiFi-GAN | 22050 Hz | No |
| Dots.TTS | Qwen2.5 LLM + DiT + BigVGAN | 48000 Hz | Yes (CAM++) |
| CosyVoice3 | Multi-GGUF (LLM+flow+CAM+++HiFT) | 24000 Hz | Yes |
| CSM/Sesame | Llama-3.2 + Mimi codec | 24000 Hz | Yes |
TADA Inline Voice Cloning
New --ref-text flag enables one-command voice cloning with TADA — no separate --make-ref step needed:
python main.py --model-id crispasr_dots_tts \
--input-text "New speech" --german-voice-id ref.wav --ref-text "transcript of ref audio" \
--i-have-rights --output-file cloned.wavExpanded Model Parameters
12 new --model-params keys for per-request tuning: top_k, min_p, cfg_scale, do_sample, num_candidates, num_steps, noise_temp, noise_scale, noise_w, speaker_id, max_speech_tokens.
Performance Optimizations
- Lazy watermark loading: Neural backends (WavMark/AudioSeal ~200MB) now load on first synthesis, not at CLI startup.
--list-modelsand--helpare instant. - Reduced file I/O: Post-synthesis watermark + metadata pipeline uses fewer read/write cycles.
- Streaming concurrency limit: Semaphore(4) prevents unbounded thread growth.
- Subprocess optimization: Stdout no longer buffered (only stderr captured for errors).
- Server fixes: File handle leak fixed, Content-Disposition header added.
Other Changes
--no-spoken-disclaimerflag to skip AI disclosure prefix on cloned audio- Voice-cloning detection expanded for dots-tts, cosyvoice3, csm, tada backends
- Release workflow fixed to handle pre-existing releases
- 224 tests passing (py3.10/3.11/3.12 + ruff)
v0.4.0 — EU AI Act Art. 50 compliance
What's New
EU AI Act Article 50 Compliance (deadline: Aug 2, 2026)
Watermark embedding on all outputs — the critical gap where watermark functions existed but were never called is now closed. Every synthesized audio file gets:
- Audio watermark: WavMark (MIT, preferred), AudioSeal, or spread-spectrum (always-on fallback)
- File metadata: WAV LIST/INFO, MP3 ID3v2, FLAC Vorbis comments, Opus OGG tags — all declare
AI_GENERATED=true - C2PA content credentials: cryptographically signed provenance manifests (when cert/key configured)
Voice Cloning Safety
- Server API consent gate:
POST /v1/audio/speechnow requires"i_have_rights": truefor cloning models; returns 403 with explanation otherwise - Expanded detection: CrispASR cloning backends (vibevoice, indextts, voxcpm2, qwen3-tts, f5-tts) now caught by keyword matching
- Persistent audit log: consent attestations written to
~/.cache/crisptts/consent_audit.log(not just stderr) - Spoken disclaimer: uses CrispASR kokoro (local) first, Edge TTS fallback, beep marker last resort
New CrispASR TTS Backends
crispasr_f5_tts— F5-TTS flow-matching, voice cloning, 24 kHz (Apache 2.0)crispasr_melotts— MeloTTS VITS2, 44.1 kHz (MIT)crispasr_piper— Piper VITS via C++, 250+ community voices, 30+ langs
WavMark Neural Watermark (MIT license)
Added as the preferred neural watermark backend — fully MIT licensed (code + model weights), unlike AudioSeal (CC-BY-NC weights). Priority chain: WavMark → AudioSeal → CrispASR GGUF → spread-spectrum.
Tests
212 tests passing across Python 3.10–3.12. 13 new tests covering watermark embedding, voice cloning detection, audit logging, FLAC/Opus metadata, and multi-sample-rate dispatch.
Install optional features
pip install crisptts[watermark-mit] # WavMark (MIT neural watermark)
pip install crisptts[metadata] # FLAC/Opus metadata via mutagen
pip install crisptts[provenance] # C2PA content credentialsv0.3.0
What's Changed
- fix(ci): unblock Dependabot dependency-graph submission by @CrispStrobe in #1
- chore(release): prep v0.3.0 — dependency triage + release workflow by @CrispStrobe in #9
New Contributors
- @CrispStrobe made their first contribution in #1
Full Changelog: https://github.com/CrispStrobe/CrispTTS/commits/v0.3.0