Downloads · 30 days
51
16% of all-time downloads
cknuteson/mythic-voice-4b-GGUF
mythic-voice-4b-GGUF is a text generation model from cknuteson. Use it when you need the model to write or continue text. The card lists the license as apache-2.0.
The 9B does what I wanted, but 9.5 GB of q8 is not something you embed in a game. This is the same model at 4B, so it fits on a machine that is already busy running something else.
Downloads · 30 days
51
16% of all-time downloads
All-time downloads
315
Public
Repo size
15.6 GB
Likes
0
Public
Click a slice to open those files.
.gguf7.2 GB · 100%
From the Hugging Face model README
The 9B does what I wanted, but 9.5 GB of q8 is not something you embed in a game. This is the same model at 4B, so it fits on a machine that is already busy running something else.
Qwen3.5-4B, trained CPT→SFT→DPO with persona-forge on the identical blend that produced mythic-voice-9b - 1,591 SFT rows and 1,025 DPO pairs, all decontaminated. Same elevated archaic register out of the public-domain northern-European epic tradition (Malory, Morris, the Eddas, the Kalevala, KJV cadence), same world-agnostic design. You bring the persona, it brings the voice.
| file | size |
|---|---|
mythic-voice-4b-q4_k_m.gguf | 2.7 GB |
mythic-voice-4b-q8_0.gguf | 4.5 GB |
q4_K_M is the one to use if you are shipping. Loads in llama.cpp, LM Studio, and anything else GGUF - CUDA, Vulkan and Metal all carry the kernels the hybrid attention needs.
The chat template hardcodes thinking OFF at the generation boundary, same as the 9B. The stock Qwen3.5 template leaves it on by default at 4B (and toggleable at 2B), which means a caller reading choices[0].message.content gets an empty string while the whole token budget goes to reasoning_content. Nothing crashes, you just get nothing. Every file here was checked by loading it in llama-server and asserting non-empty content before release.
Held-out seeds, same battery, same judge:
| 9B | 4B | |
|---|---|---|
| voice | 0.983 | 1.000 |
| turn-taking | 1.0 | 1.0 |
| boilerplate | 0.0 | 0.0 |
| in-character | 1.0 | 0.929 |
| assignment accuracy | 1.0 | 0.750 |
| leakage (176 probes, bare) | 0.892 | 0.847 |
The voice got better, which stopped surprising me once I saw the 2B do the same thing. Register is cheap. It is the first thing a small model learns and the last thing it loses.
The 0.750 assignment accuracy is one miss out of four items - a card that answered in perfect voice and never said its own name. I would not read much into it: mythic-voice-2b, which is half this size, scored 1.000 on the same four prompts. Four items is not enough to separate these models and I am not going to pretend otherwise.
The battery cannot see this one. A smaller student can hold voice at 1.0 and in-character at 1.0 while every tale collapses into one shape with the nouns swapped. So I measured it: 32 tales per model, 16 held-out prompts sampled twice.
| 9B | 4B | 2B | |
|---|---|---|---|
| cross-repetition (4-gram Jaccard between tales) | 0.0013 | 0.0008 | 0.0017 |
| distinct-2 | 0.680 | 0.684 | 0.646 |
| distinct-3 | 0.907 | 0.922 | 0.897 |
| mean words | 126 | 129 | 131 |
Cross-repetition is effectively zero at every size - no two tales share a 4-gram. The convergence failure does not happen here, and on lexical diversity the 4B edges the 9B.
One family-wide result worth stating: a judge scoring concrete invented detail (named places, particular objects) rates all three near 0.03. That is not a size effect, it is the design - the model is world-agnostic on purpose, so it has no cast or geography of its own to name. If you want specificity, it comes from your persona and your prompt, not from the weights.
The leakage number is the one that actually moves with size, and it moves the wrong way:
9B 0.892
4B 0.847
2B 0.818
I expected the opposite. A smaller base has memorized less protected material, so I assumed it would leak less. It does not. What shrinks is not the contamination, it is the capacity to hold the trained refusal against the model's own generative pull. The mitigation degrades faster than the problem does.
So the guard matters more here than it does on the 9B, not less. Bare weights pass 84.7% of a
176-probe leakage battery. Behind persona-forge's GuardedTeacher output filter the 9B verified
176/176; if you are shipping this to the public and care about the same legal posture I do, wrap it.
Personal use, load it and go.
CPT on a public-domain corpus in the target register, then SFT + DPO on the judge-filtered synthetic blend: register chat, tales, pack-driven roleplay, provocation and bare-assignment DPO pairs. Every teacher sample passed an 8-gram overlap gate plus a proper-noun blocklist before it entered training.
The GGUFs are header-patched. Qwen3.5 carries mtp_num_hidden_layers=1 in the dense sizes too, the
merge drops the mtp tensors, and the converter still counts them - so block_count went 33 → 32 and
nextn_predict_layers 1 → 0 on every file here. Without that they fail to load on every llama.cpp.
9B - 4B - 2B, same blend and recipe at three student sizes, all in the mythic-voice collection.
Style lineage is documented public-domain sources. No association with any modern author, estate, or trademark is claimed or implied.
Pipeline, guard, eval battery and pack format: github.com/ctkadvisors/persona-forge.