Repository navigation
Description
Feeding an existing package back through audiocpp_gguf to change one piece of metadata produces a package with no voices, exits 0, and prints that the sidecars were reused.
Repro
audiocpp_gguf --input kokoro-82m-q8_0.gguf \
--output kokoro-respec.gguf \
--type orig --family kokoro_tts \
--model-spec model_specs/kokoro_tts.json --overwriteOutput:
note: reusing the sidecars embedded in .../kokoro-82m-q8_0.gguf; pass --root to override
gguf=.../kokoro-respec.gguf
weight_type=orig
tensor_sources=1
embedded_sidecars=true
embedded_model_spec=true
model_spec_family=kokoro_tts
Exit code 0. Both sidecar claims are false:
| voice sidecar entries | size | |
|---|---|---|
kokoro-82m-q8_0.gguf |
54 | 189,611,360 |
kokoro-respec.gguf |
0 | 161,345,952 |
--inspect reports tensors=548 and embedded_sidecars=true for both, so it does not show the difference either.
The result is unusable:
load FAILED: failed to open binary file: /tmp/audiocpp-gguf/911a3828bf36b9f1/voices/zm_yunxia.bin
The spec half works
This is specifically the sidecars. The re-emitted package's embedded spec is correctly replaced — the new option I was testing is present in the output and absent from the input — so --model-spec does its job and only the sidecar payloads are dropped.
Why it is worth more than the exit code suggests
For this package there is no way back. The installed directory holds only the .gguf and a manifest:
kokoro-82m-q8_0.gguf
.audiocpp-package-kokoro_82m_q8_0.json
The 54 voices exist only inside the GGUF, so --root has nothing to point at and the re-emit is lossy with no local recovery — you would have to re-download or re-convert from the original weights. Someone updating a package in place could reasonably delete the input afterwards.
The misleading note is the sharp edge rather than the omission itself. A hard error ("cannot carry embedded sidecars from a GGUF input; pass --root") would be fine, and would have taken about a second to act on. Printing embedded_sidecars=true invites the opposite conclusion.
Suggested shape
Either carry the embedded sidecars through a GGUF-input re-emit, or refuse the combination with a message naming what is missing. Both are fine; silently producing a voiceless package is the part that is not.
To be clear about scope: this is not a request for an in-place spec-patching mode. The embedded spec being authoritative is the right design — the package is self-contained and the package is the unit you rebuild. The ask here is only that a re-emit either preserves what it claims to preserve or says it cannot.
Found while checking whether an existing Kokoro package could pick up a newly declared request option without a full rebuild.
🤖 Generated with Claude Code
Activity