19 Commits
Author SHA1 Message Date
WildAi 9d62b8222f fix(tts): name the tag group in notices
A sound tag and an emotion tag are different things, so the notice says which one the user typed.
2026-10-23 16:02:11 +03:00
WildAi d69e761b97 feat(models): rename nano pack to upstream name
chatterbox-turbo-nano -> chatterbox-nano. The old name stays an accepted alias so saved workflows keep working.
2026-10-23 15:53:50 +03:00
WildAi 6c3441fb78 fix(tts): keep all 19 turbo tags
The ten emotion tags missed the pre-stage-1 claim, so they were parsed as character names and never reached the tokenizer.
2026-10-23 15:53:50 +03:00
WildAi 630291b124 fix(models): list downloadable packs before download 2026-10-22 16:05:36 +03:00
WildAi ceea0c71cf feat(tts): emotion tags reach the model, long scripts are chunked
The upstream Chatterbox README documents paralinguistic tags ([laugh],
[chuckle], [sigh], ...) as native to the Turbo family, and the vendored
Turbo pack passes them straight to the tokenizer -- it never parses them.
Our engine deleted them before the model saw them, so the feature looked
implemented and was inaudible.

* the text engine keeps a Turbo tag verbatim and records its name; on any
  other pack the nine Turbo names stay literal text instead of being
  swallowed as a voice name, and the run says so
* the v2 angle tokens are re-spelled for Turbo (<giggle> -> [giggle]) and
  left untouched everywhere else
* generate_audio now builds one plan for every family, synthesises one
  chunk per model call and joins the chunks; the classic path goes through
  the engine too, which is what makes "[Alice]" open a character segment
* per-chunk seeds (seed + index) keep a chunked run reproducible without
  giving every chunk the same prosody
* four appended widgets on ChatterboxTTS: enable_chunking,
  max_chars_per_chunk, chunk_combination_method, silence_between_chunks_ms
* chunk boundaries prefer a sentence end and never land inside a tag
* Turbo's exaggeration is passed as 0.0: the family ignores it for
  sampling and upstream warns about every non-zero value, once per chunk
2026-10-22 15:01:53 +03:00
WildAi 125e06594b feat(audio): in-memory clips, drop temp wavs
Every entry point that conditions on a reference clip now takes the
waveform in memory: the vendored loaders gained load_audio_at (path,
ndarray or tensor -> float32 mono at the target rate, soundfile +
torchaudio, no librosa), and the resamples ride the new dsp module. The
node hands over preprocess_comfy_audio output at the right rate per
site (S3Gen 24k for conditioning, the tokenizer's 16k for the VC
source), so temp_wav_path and its temp-file machinery are gone -- which
also removes the 16-bit PCM quantization the file round-trip imposed.

Resampling is the one deliberate numerical difference: torchaudio's
sinc kernel instead of soxr, touching only clips supplied at call time.
The built-in-voice shared-assets E2E stays byte-identical
(md5 370acf3f9469d55759c3d6096b2628ff); the reference-clip E2E changes
measurably in the last digits, as expected and reported.
2026-10-09 22:03:41 +03:00
WildAi 2b1cf209d6 feat(loader): dedupe shared weights across packs
- ve/s3gen/s3gen_v3 safetensors + grapheme tokenizer are byte-identical
  across every repo that ships them (sha256-verified): fetched at most
  once into a reserved _shared store, hardlinked into each pack
- downloads carry pack-unique files only (allow_patterns); legacy
  full-repo folders satisfy the store before anything is fetched
- vendored MTL loads ve/s3gen from either serialization, safetensors
  first; upstream's strict load refused every SLP pack (P-036)
- .pt twins (s3gen.pt, s3gen_v3.pt, t3_cfg.pt, ve.pt) are never fetched
2026-10-07 13:22:03 +03:00
WildAi 7b810a7752 feat(tts): add flash params + single lang packs
- flash sampler's num_steps/cfg_scale surface as TTS widgets
- MTL node loads the 6 SLP finetunes: per-pack t3/s3gen
  resolution, companion ve.pt fetch, no-voice packs refuse
  with an actionable error (P-036)
- s3gen loads non-strict: SLP checkpoints predate two
  recomputed tokenizer buffers, strict load refused them
- schema tests pin pack discovery to an empty models root
2026-10-07 11:30:00 +03:00
WildAi 7cb6ba0a89 refactor(vendor): flash flat under src/ 2026-10-07 01:02:50 +03:00
WildAi b5ca0f3cea feat(flash): vendor chatterbox-flash into src/ 2026-10-07 00:38:22 +03:00
WildAi d3e126897e feat(tts): route flash packs through main node 2026-10-07 00:14:21 +03:00
WildAi aee74353bf feat(models): one folder for the turbo family 2026-10-06 22:42:08 +03:00
WildAi bb6b7ad30e feat(tts): route turbo family through main node 2026-10-06 22:09:44 +03:00
WildAi 607aecff51 fix(loader): route nano/flash packs 2026-10-06 20:56:39 +03:00
WildAi 41f4cacbec fix(dtype): exclude fp32-resident frontends 2026-10-06 20:04:00 +03:00
WildAi 06af454126 fix(dtype): walk plain pack containers
Vendored pack classes are not nn.Modules; the dtype cast
crashed on named_modules. Walk their Module attributes, and
delegate into each child's own tree (_modules is invisible
to __dict__ iteration).
2026-10-06 18:47:01 +03:00
WildAi 9574c1bc87 feat(modules): port download and model infra
Borrowed from VoxCPM (HF download stack, settings, routes
support) and VibeVoice (registry, patcher, device/dtype/
attention). Deletes chatterbox_handler.py.
2026-10-06 18:35:59 +03:00
WildAi 8b718b576e ver 1.2.0 2025-07-21 17:12:37 +03:00
Art K a48b65f06b init 2025-05-29 21:40:55 +03:00