tts-voice-creator-clone-and.../CHANGELOG.md
mARTin-B78 e0daafd4e1 feat(voices): export and import voice bundles
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 16:42:28 +02:00

586 KiB
Raw Blame History

Changelog

All notable changes to TTS Voice Creator — Clone and Design are documented here.
Follows Keep a Changelog · versioned with Semantic Versioning.


Unreleased

Added

  • Voice export/import bundles. GET /api/voices/{id}/export streams a <id>.voice.zip (audio, reference.txt, meta.json with seed, design prompt, rating/tags, provenance, audio_problems; optional picture and consent recording; manifest.json with format version, app version and sha256 per file; no temp files). POST /api/voices/import validates at the boundary: 150 MB upload cap, fixed flat member names only (zip-slip/path traversal rejected), per-file, total and compression-ratio caps, hashes verified, audio decoded, meta and provenance re-validated; a taken name gets a _2 suffix, an identical voice is a no-op, nothing is overwritten. Voice library toolbar: "Export selected" and "Import bundle" (44px). Tests: tests/test_voice_bundle.py, tests/voice-bundle.spec.js. See architecture/voice-bundle.md.
  • Consent/provenance field per voice. Each voice gets provenance in its .meta.json (basis: own_voice, consented, licensed, public_domain or unknown; source, licence, note, optional recorded_consent, set_at). Existing voices count as unknown; quick-import-voice prefills the source URL (basis stays unknown). New PUT /api/voices/{id}/provenance (enum, length caps, control characters stripped, http(s) URLs only, no credentials) and POST/GET /api/voices/{id}/consent-recording (audio only, 10 MB cap, stored as <voice>.consent, moves/deletes with the voice). The voice inspector has a "Source & consent" section (typed note or MediaRecorder recording) and voices without a recorded basis show a "Source unknown" badge. Generation is not blocked. Data stays local. Tests: tests/test_voice_provenance.py, tests/voice-provenance.spec.js.
  • Seed Finder: Auto-pick best. POST /api/seed-autopick {voice, text, seeds|count} (default 8, max 16) generates candidates sequentially through the existing temporary-voice path (voices.json is always restored), scores each 0-100 (ASR word accuracy, loudness/clipping, audio_problems) and returns all sub-scores plus the winner. Degrades to loudness/problems when STT is unavailable. The UI highlights the winner; saving stays a click on "Use seed". Tests: tests/test_seed_autopick.py, tests/seed-autopick.spec.js.
  • Voice Design: attribute chips. Toggle chips (gender, age, pitch, pace, accent/region, tone/timbre, emotion; German + English labels) above the design prompt add or remove only their own phrase in the free-text description. The textarea stays fully free-form. Test: tests/design-chips.spec.js.
  • Voice health: timestamped audio problems. core.audio.audio_problems flags long interior silence, clipping and sudden level jumps (problems list with kind, start_s, end_s, detail, plus one warning per kind) in the route-test voice health; existing keys unchanged. Computed on demand and cached by file mtime, not in the voice list. Shown in the routing test result and in the Try-out voice panel (new GET /api/voices/{id}/health); imports store the result in meta (audio_problems). Tests: tests/test_audio_problems.py, tests/voice-health.spec.js.

Changed

  • Magazine interviews: journalist/guest voices. Interview labels such as c't: (also c’t, ct, OCR Cc't), Redaktion, Interviewer, Frage are the interviewing side and are read in the narrator voice; every other recurring label is a guest and gets the second voice. Unlabelled blocks continue the current speaker's turn; headings, decks and bylines stay narrator. Detection stays strict (label starts a block and recurs at least twice). Audio-timing records now store each segment's voice and speaker. Tests: tests/test_magazine.py (InterviewJournalistTests).

1.59.0 — 2026-10-04

Changed

  • Characters: global cast view in the sidebar, per-book characters inside Studio. Library > Characters / Cast is now titled "All characters (all books)": one collapsible band per book (heading, per-book count, aria-expanded), first book open and the rest closed and not rendered until opened (DOM budget), and a Search all books field. Studio > Voices lists only the book picked in Source, under a "Book: