GGUF Models

August 4, 2026 ยท View on GitHub

audio.cpp can load audio.cpp-native GGUF checkpoints for model families that have a package spec. GGUF is a container for tensors and sidecar files; it is not a universal adapter for arbitrary llama.cpp or whisper.cpp GGUF files. The tensor names and embedded metadata still have to match the selected --family.

Package specs are maintained as model_specs/*.json. New GGUFs contain the selected spec in audiocpp.model_spec.* metadata, so a standalone GGUF does not depend on a model_specs directory or on the binary having that family compiled into its spec catalog.

Runtime resolution is deterministic:

explicit --model-spec-override
              |
              v
package spec embedded in the selected GGUF
              |
              v
compiled catalog (AUDIOCPP_DEPLOYMENT_BUILD=ON)
              |
              v
external model_specs/<family>.json discovery

An explicit override is useful for testing a modified layout without rebuilding or reconverting:

audiocpp_cli --inspect --family qwen3_asr --model /path/to/model.gguf \
  --model-spec-override /path/to/qwen3_asr.json

The override may also be a directory containing <family>.json. The server supports the same command-line option and a model_spec_override field either at the top level or inside an individual model entry. A per-model field takes precedence over the server-wide value.

Support And Test Status

Status labels:

LabelMeaning
DonePackage-spec refactor is in place for this family.
NoPackage-spec refactor is not done, or the tested format is not usable.
Skip (...)Package-spec refactor is intentionally skipped.
PassCovered by the path-test matrix with acceptable output.
Pass (TTS + clone)Both no-reference TTS and reference-audio voice cloning run successfully.
Pass (drift)Loads and runs, with known acceptable output drift.
Pass (ASR match, drift)TTS output has similarity/frame drift but ASR transcript remains usable.
No (...)Known unsupported, failing, or too much output drift.
---Not tested in the current GGUF path-test matrix.
FamilyPackage-spec refactorSafetensors tested after refactororig GGUF tested16-bit GGUF testedq8_0 GGUF tested
ace_stepDonePass---Pass (drift)No (planner sampling can fail)
bs_roformerDonePass------Pass
chatterboxDonePass---Pass (ASR match, drift)Pass (ASR match, drift)
citrinet_asrDonePass------Pass
fish_audioDonePass---PassPass
fun_asr_nanoDonePass---PassPass
glm_ttsDonePass (TTS + clone)------Pass (ASR match, drift)
heartmulaDonePass---Pass (drift)Pass (drift)
higgs_audio_sttDonePass---PassPass
higgs_audio_ttsDonePass---PassPass
htdemucsDonePass---PassPass (drift)
hviske_asrDonePass------Pass
inflect_v2DonePassPass------
index_tts2DonePassPassPass (drift)Pass (ASR match, drift)
irodori_ttsDonePass---PassPass (ASR match, drift)
kroko_asrDonePass------Pass
marblenet_vadBundled (tiny model)Pass---------
mel_band_roformerDonePass---Pass (drift)Pass (drift)
miocodecDonePassPassPass (drift)Pass (drift)
miottsDonePassPassPass (drift)Pass (ASR match, drift)
moss_tts_localDonePass---PassPass (ASR match, drift)
moss_tts_nanoDonePass---PassPass (ASR match, drift)
nemotron_asrDonePass---PassPass (minor filler drift)
omnivoiceDonePass---Pass (drift)Pass (drift)
outettsDonePass (TTS + clone)------Pass (TTS + clone)
parakeet_tdtDonePassPassPassPass
pocket_ttsDonePass---PassPass (drift)
qwen3_asrDonePass---PassPass
qwen3_forced_alignerDonePass---PassPass
qwen3_tts baseDonePassPassPass (ASR match, drift)Pass (ASR match, drift)
qwen3_tts custom voiceDonePass---Pass (ASR match, drift)Pass (ASR match, drift)
qwen3_tts voice designDonePass---Pass (ASR match, drift)Pass (ASR match, drift)
rvcDone------Pass---
seed_vcDonePass---Pass (drift)Pass (drift)
silero_vadSkip (tiny model)------------
sortformer_diarDonePass---PassPass
stable_audioDonePass---Pass (drift)Pass (drift)
supertonicDonePassPass---No (unsupported weight dtype)
vevo2DonePassPassPass (drift)No (mixed route drift; speech ASR match)
vibevoiceDonePass---PassPass (drift)
vibevoice_asrDonePass---PassPass
voxcpm2DonePassPassPass (ASR match, drift)Pass (ASR match, drift)
voxtral_realtimeDonePass---PassPass

Additional lower-bit checks:

FamilyFormatTested
voxtral_realtimeq4_kPass (quick CUDA check; transcripts match Q8 except one capitalization-only difference)

Q8 packaging notes:

  • chatterbox Q8 is intentionally mixed type. Graph-sensitive scalar, norm, bias, and side tensors stay in non-Q8 types while matmul-compatible weights are quantized.
  • pocket_tts Q8 keeps the four flow_lm.flow_net.time_embed.*.mlp.{0,2}.weight tensors in Q8 in addition to the default converter selection. conditioner.embed, cond_embed, and Mimi conv tensors are not forced to Q8 because tested outputs drifted or the current conv path casts quantized conv weights back to F32.
  • qwen3_tts Q8 should keep speaker-sensitive components in their original 16-bit type. The tested Base Q8 package quantizes the talker transformer and projections, talker code-predictor heads, and speech-tokenizer encoder/decoder projection or linear weights, while leaving the speaker encoder, lookup, and codebook-sensitive tensors unquantized. Quantizing those speaker-side tensors can produce long-form quality problems such as large silence.
  • voxtral_realtime also has a tested q4_k package. In a quick CUDA path check it was smaller and faster than Q8_0, while transcript output matched Q8_0 except for one capitalization-only difference.

Build The Converter

cmake --build build/debug --parallel --target audiocpp_gguf

Normal builds leave AUDIOCPP_DEPLOYMENT_BUILD off. Enable it when one binary must also carry fallback specs for safetensors packages or legacy GGUFs that predate embedded spec metadata:

cmake -S . -B build/deploy -DAUDIOCPP_DEPLOYMENT_BUILD=ON
cmake --build build/deploy --parallel

audiocpp_gguf always carries the conversion catalog. This is separate from the optional CLI/server deployment catalog, and keeps a copied converter executable usable when the source checkout and its model_specs directory are not present.

Check the converter interface:

audiocpp_gguf --help

Current shape:

audiocpp_gguf --input [namespace=]<weights> [--input namespace=<weights> ...] \
  --output <weights.gguf> \
  --type <orig|f16|bf16|q8_0|q2_k|q3_k|q4_k|q5_k|q6_k> \
  [--family <family>] \
  [--model-spec <json-or-directory>] \
  [--root <model-dir>] \
  [--sidecar <source>=<destination>] \
  [--bnb-nf4-type q8_0] \
  [--exclude-prefix <logical-prefix>] \
  [--keep-type <tensor-prefix>*=<type>] \
  [--overwrite] \
  [--no-sidecars] \
  [--allow-missing-model-spec]

audiocpp_gguf --inspect <model.gguf>

Convert A Single Tensor Source

Standalone conversion is the default. The converter embeds non-weight files recursively from the first tensor source's directory, or from --root when it is supplied. Use --root when the model has tokenizer, config, processor, or other non-weight files in a different model root. It also finds, validates, and embeds the package spec. Conversion fails before writing when the tensor namespaces or required sidecars do not match that spec.

audiocpp_gguf \
  --input /path/to/model/model.safetensors \
  --root /path/to/model \
  --output /path/to/model-gguf/model.gguf \
  --type f16 \
  --overwrite

Safetensors shard indexes are accepted directly:

audiocpp_gguf \
  --input /path/to/model/model.safetensors.index.json \
  --root /path/to/model \
  --output /path/to/model-gguf/model.gguf \
  --type q8_0 \
  --overwrite

Convert A Multi-Component Model

Use repeated namespaced --input entries when a model has multiple tensor components. The namespace must match the model's package spec.

audiocpp_gguf \
  --input model_weights=/path/to/model/model.safetensors \
  --input codec_weights=/path/to/model/codec/model.safetensors \
  --root /path/to/model \
  --output /path/to/model-gguf/model.gguf \
  --type f16 \
  --overwrite

Convert BitsAndBytes NF4 Sources

Some upstream packages store tensors as BitsAndBytes NF4 data in U8 safetensors plus helper tensors. Use --bnb-nf4-type q8_0 for these sources. The converter decodes the NF4 payload, uses the quant-state shape for GGUF metadata, re-quantizes the decoded weights to GGML Q8_0, and skips the BNB helper tensors from the output.

--keep-type only overrides the GGUF output type for normal tensors. It does not decode raw BNB NF4 U8 tensors by itself.

Use --exclude-prefix <logical-prefix> to omit a tensor subtree that the audio.cpp model does not load, for example an unused vision tower in a shared language-model checkpoint.

audiocpp_gguf \
  --input audio=models/Dramabox/dramabox-audio-components.safetensors \
  --input dit=models/Dramabox/dramabox-dit-v1.safetensors \
  --input gemma=models/gemma-3-12b-it-bnb-4bit/model.safetensors.index.json \
  --input silence=models/Dramabox/assets/silence_latent_frame.safetensors \
  --root build/debug/dramabox_gguf_sidecars_spec \
  --output models/Dramabox-GGUF/dramabox-q8_0.gguf \
  --type q8_0 \
  --bnb-nf4-type q8_0 \
  --exclude-prefix gemma/vision_tower \
  --family dramabox \
  --model-spec model_specs/dramabox.json \
  --overwrite

Add External Sidecars

Use --sidecar <source>=<destination> when a runtime file is needed but does not live under --root, or when it should be embedded at a different path inside the GGUF.

audiocpp_gguf \
  --input /path/to/model/model.safetensors.index.json \
  --root /path/to/model \
  --sidecar /path/to/shared/preprocessor_config.json=preprocessor_config.json \
  --output /path/to/model-gguf/model.gguf \
  --type q8_0 \
  --overwrite

If the default pipeline cannot find any sidecars, conversion fails instead of silently creating a tensor-only file. Supply the correct --root and any required external --sidecar mappings. Pass --no-sidecars only when you intentionally want a tensor-only container; place that GGUF and all package-spec-required sidecars together in one model directory when loading it. --no-sidecars does not remove the embedded package spec and does not disable build-time validation.

Package Spec Discovery During Conversion

The converter selects the first valid source at the highest available priority:

  1. --model-spec <json-or-directory> (also accepted as --model-spec-override).
  2. A spec object, JSON string, or relative path in the model's config.json.
  3. model_spec.json or model_specs/*.json below the model root.
  4. A discovered model_specs/*.json directory from the working directory upward.
  5. The converter's bundled source catalog.

Higher-priority inputs are authoritative. If an explicit override, model-config spec, or local spec is present but does not match the tensor namespaces and required files, the converter reports that error instead of silently falling back to a lower-priority layout.

Use --family <family> to disambiguate models whose configuration does not identify the audio.cpp family. A model configuration can declare it directly:

{
  "audiocpp_family": "qwen3_asr",
  "audiocpp_model_spec": "model_spec.json"
}

audiocpp_model_spec may instead be a JSON string or a path relative to config.json. The nested forms audiocpp.family, audiocpp.model_spec, and audiocpp.package_spec are also accepted. The converter additionally recognizes known upstream model_type values.

--allow-missing-model-spec is an explicit escape hatch for creating a tensor archive that audio.cpp is not expected to load as a model. It is not recommended for deployable GGUFs.

Inspect And Run

Inspect the finished package before using it:

audiocpp_gguf --inspect /path/to/model-gguf/model.gguf

If the GGUF embeds all required sidecars, it can be passed directly as --model:

audiocpp_cli --task asr --family qwen3_asr --model /path/to/model-gguf/model.gguf --backend cuda --audio speech.wav

A directory is also accepted by supported package specs. It resolves to model.gguf when that name is present, otherwise to the single *.gguf inside it โ€” so a downloaded package directory works under its release name without renaming anything:

audiocpp_cli --task tts --family qwen3_tts --model /path/to/model-gguf --backend cuda --text "Hello." --out out.wav
audiocpp_cli --task vc --family vevo2 --model models/Vevo2-GGUF --backend cuda --audio source.wav --voice-ref target.wav --out converted.wav

A directory holding several GGUFs and no model.gguf is ambiguous and is rejected with the candidates listed; pass one of them directly as --model, or keep a single GGUF per directory.

Compatibility summary:

FormatWhere its package spec comes fromOther model files
SafetensorsOverride, compiled deployment catalog, or external discoveryRequired
New standalone GGUFEmbedded in GGUFNone
New tensor-only GGUF (--no-sidecars)Embedded in GGUFRequired sidecars
Legacy GGUF without embedded specCompiled deployment catalog or external discoveryDepends on embedded sidecars

Compatibility with older binaries:

After PR #53 refers to tag release-0.3-gguf-v2, commit bf1ac678758aee4caafa7bb25fc0e6db9c25228f.

BuildGGUF packageRuntime contextResult
Before PR #53 (14e9258)Legacy GGUF without embedded specRepo checkout or external model_specs visiblePass
Before PR #53 (14e9258)New standalone GGUFRepo checkout or external model_specs visiblePass
After PR #53 (release-0.3-gguf-v2), normal buildLegacy GGUF without embedded specRepo checkout or external model_specs visiblePass
After PR #53 (release-0.3-gguf-v2), normal buildNew standalone GGUFRepo checkout or external model_specs visiblePass
Before PR #53 (14e9258)Legacy GGUF without embedded specNo model_specs visibleFail
Before PR #53 (14e9258)New standalone GGUFNo model_specs visibleFail
After PR #53 (release-0.3-gguf-v2), normal buildLegacy GGUF without embedded specNo model_specs visibleFail; use --model-spec-override, a deployment build, or external specs
After PR #53 (release-0.3-gguf-v2), normal buildNew standalone GGUFNo model_specs visiblePass
After PR #53 (release-0.3-gguf-v2), deployment buildLegacy GGUF without embedded specNo model_specs visiblePass through compiled package specs

Type Notes

TypeMeaning
origPreserve the original safetensors storage type where possible.
f16Convert eligible tensors to FP16.
bf16Convert eligible tensors to BF16. Useful for BF16 source models.
q8_0Quantize eligible tensors to Q8_0; unsupported tensors remain in a backend-safe type.
q2_k/q3_k/q4_k/q5_k/q6_kLower-bit quantized formats. Treat as experimental per model and backend.

Quantized GGUF support is model- and route-specific. A model may load successfully but still drift in length, waveform similarity, or recognized text, so validate the exact route you plan to ship.

For measured 16-bit vs Q8 speed and peak VRAM results, see GGUF Q8 performance.