Fun-CosyVoice3 0.5B
FunAudioLLM's Fun-CosyVoice3-0.5B-2512, exported for loom.cpp: a Qwen2-0.5B speech-token LM, a flow-matching DiT and a HiFT vocoder, 9 languages, 24 kHz. Encodes text itself.
This is a loom.cpp export: a single self-describing GGUF that carries its own graph topologies, tokenizer (if any) and driver script, produced by loom-exporter.
Original model
Exported from FunAudioLLM/Fun-CosyVoice3-0.5B-2512. Weights are unmodified; this repo packages the same parameters into
loom.cpp's GGUF format.
License
apache-2.0, inherited from the base model above.
Language(s)
zh, en, ja, ko, de, es, fr, it, ru
Usage
Run it with loom-py -- loom-py-rt on PyPI:
pip install -U "loom-py-rt[hub]"
import loom
model = loom.Model.from_pretrained("loom-ai-org/fun-cosyvoice3-0.5b-loom")
# This model encodes text itself -- no phonemiser needed at all.
print(model.tokenizer) # kind, vocabulary size, default language
# sample_rate=24000: a rate is not something a checkpoint necessarily carries, so it is a value
# you have to know from the model's documentation and pass. It is used only if the GGUF declares none;
# a wrong rate does not fail, it plays the voice at the wrong speed.
audio = model.text2speech.infer("hello world", sample_rate=24000)
audio.save("out.wav")
# That uses the voice the file itself defaults to. Whether it carries others is under "Known
# limitations" (and, where it does, a section below says how to pick one).
Cloning a voice
A voice is a few seconds of a speaker plus what they say, turned ONCE into a small voice file by the reference's own front end -- that step needs two ONNX models this GGUF does not carry, so it runs in Python with the upstream checkpoint:
python -m loom_exporter.cosyvoice3_voices Fun-CosyVoice3-0.5B-2512 -o voices \
--wav me.wav --text "What the clip says, word for word." --name me --license "CC0-1.0"
Then pass it by path (or by name, for a file under voices/ beside the model):
model.text2speech.infer("hello world", voice="voices/me.gguf", seed=7).save("me.wav")
A voice file is stamped with a fingerprint of the weights it was made for, and a file made for other
weights is refused by name. The clip must be 16 kHz or more and at most 30 s; the licence is the
recording's, which is why --license is required.
The layer underneath
The call above is the high-level door: one per task, named for the modality pair it maps between, with
the windowing, sampling and assembly this model needs already applied. Under it, model.infer(...)
passes your arguments straight to the driver this GGUF embeds -- which is where you go for a knob the
door does not name.
model.driver_source prints that driver, including a header comment documenting every argument it
accepts for this model, and is the authority on it. See loom-py for the API and
loom.cpp for what the engine does between the two.
Known limitations
One voice is built in, computed when the file was exported. The release ships no speaker table; the file carries the voice every example in the release's README uses (asset/zero_shot_prompt.wav from the Apache-2.0 CosyVoice repository, a Mandarin speaker, with its transcript), encoded ONCE by the release's own ONNX speech tokenizer and speaker encoder. English and the other languages are spoken in that voice cross-lingually. Other voices are voice files (see "Cloning a voice"): making one needs those ONNX models and Python once, using one needs neither.
Text is normalised by the reference's rules, not its FST normaliser. Digits are spelled out, Chinese punctuation is mapped, and a paragraph is split into sentence-sized pieces that are generated one after another and joined -- matching the reference's own text_normalize id for id when wetext is not installed. With wetext installed the reference reads dates, money and units as words; this file spells their digits one number at a time.
Sampled, so two calls differ. The LM samples every speech token (top-k 25, top-p 0.8, with the reference's repetition-aware redraw). Pass seed to reproduce a call. Verified against the reference with its draws pinned: the same 76 tokens, and a waveform within the reference's own float32-vs-float64 spread.
Needs loom 1.0.0-rc11 or later. An older engine ignores three sampler options this file uses and samples differently without saying so.
Slow on a small CPU. 3.4 GB at F32; on a 2-core x86 laptop a second of audio takes 16-20 seconds.
Files
fun-cosyvoice3-0.5b.gguf-- the model, exported with loom-exporter.