Qwen3-TTS 12Hz 1.7B VoiceDesign: synthesize.cpp GGUF

GGUF conversions of the official Qwen3-TTS-12Hz-1.7B-VoiceDesign checkpoint for synthesize.cpp.

Ported from QwenLM/Qwen3-TTS revision 022e286b98fbec7e1e916cb940cdf532cd9f488e and validated on 2026-08-20 against the pinned upstream PyTorch implementation at bfloat16 on CUDA.

Description-driven voice design, not cloning. Hand it a natural-language description of a voice -- pace, pitch, timbre, mood -- and it synthesizes text in a voice built from that description; no reference recording is ever involved, and none can be supplied. This package catalogues NO preset voices: with no Voice Profile supplied, which speaker a request produces follows no fixed identity, and the only way to pin one is a Description Text Voice Profile.

That is the structural difference from both siblings shipped so far: CustomVoice selects from nine preset voices and cannot design one, and Base clones from a reference recording and cannot design one either. This is the family's third distinct Voice Profile source, following Reference Audio (Base) and the preset catalog (CustomVoice).

Downloads

Profile Download Size Tensor storage SHA-256 What to know before choosing it
BF16 qwen3-tts-12hz-1-7b-voicedesign-BF16.gguf 4096.9 MB (4,295,891,904 bytes) 404 BF16 + 255 F32 d0af76177b5d2e2cdbd39b5deae7b4493f89990f372055e932b3b6877c295524 The source profile, and the reference the other three are cut from and compared against. RTF 4.64 is the slowest of the four shipped profiles on this host, in the expected direction: this variant's talker runs 3.2x larger per layer than the Base variant's own.
F16 qwen3-tts-12hz-1-7b-voicedesign-F16.gguf 4097.2 MB (4,296,175,040 bytes) 267 F16 + 392 F32 5a6f52d3bc48bdd46527b675edcfec5aff0e800a463181b82faa17e94dcb1465 LARGER than the BF16 source by 283,136 bytes (0.0066%) -- both are two-byte types, so the matrix weights do not shrink while the sensitive tensors widen BF16 to F32, the same shape Base's own F16 shows. F16 is a speed profile for this family, not a size one: on the aarch64/GB10 host this was measured on, ggml's CPU backend has a NEON-vectorized GEMM path for F16 and none for BF16, so F16 measures roughly 2.8x faster (RTF against BF16's own 4.64 row above, both from this table) for a package that costs nothing measurable on accuracy (replay headroom 3.45x, next to BF16's own 3.44x). The task that first measured this pairing computed 2.87x against BF16's earlier n=3 pass (RTF 4.73); recomputed against this table's own later n=8 BF16 row, it is 2.81x -- both real numbers from the same tree, and neither is a cross-platform constant.
Q8_MIXED qwen3-tts-12hz-1-7b-voicedesign-Q8_MIXED.gguf 2383.6 MB (2,499,423,680 bytes) 267 Q8_0 + 392 F32 f8540471d2d7a9b353bd5c6d165e9caaf9bed3b90a20a4ec8fe410f993fdf92a The smallest profile that CLEARS its accuracy gate, and the fastest of the four -- 41.82% smaller than BF16 at RTF 1.05 -- with the thinnest passing replay headroom, 1.63x against BF16's 3.44x and F16's 3.45x, still comfortably above the 0.01 bound. Blind-indistinguishable from BF16 in the 2026-08-20 listening audit. This is the recommended choice for anyone who wants numerical fidelity to the reference at a reduced size; Q5_K_MIXED below is smaller but does not clear the gate.
Q5_K_MIXED qwen3-tts-12hz-1-7b-voicedesign-Q5_K_MIXED.gguf 1698.2 MB (1,780,723,136 bytes) 267 Q5_K + 392 F32 a47479d90a61a32e7b2fb5f6b8bd3d47405aac1cc98cf278ab3fc0c2d1c282bb Published despite FAILING its accuracy gate, on jiangzhuo's explicit ruling of 2026-08-20 after the blind listening audit found it indistinguishable from BF16 (one clip, one sentence, one seed, one listener). Smallest of the four at 28.75% below Q8_MIXED, but its prefill probe measures 0.031029 and 0.030366 against a committed 0.01 bound -- roughly 3x over, headroom 0.32x. The measurement stands as measured; only the publication decision changed. Choose Q8_MIXED instead if you need the gate cleared. See the note under the table.

All profiles use the same Qwen3-TTS architecture and public synthesize.cpp API. The profile name describes a versioned storage policy, not the language or Execution Backend.

Q5_K_MIXED FAILS A COMMITTED ACCURACY GATE AND IS PUBLISHED ANYWAY. Read both halves of that sentence before choosing it. It is the fourth row above, and it is the only profile in this project shipped over a numerical gate failure.

The breach, measured. Its replay-stage prefill probe exceeds the committed 0.01 max_relative bound on both measured cases -- 0.031029 (empty instruct) and 0.030366 (non-empty instruct), roughly 3.10x and 3.04x over, headroom 0.32x. That is a real gate failure, not a thinner margin: the other three profiles clear the same bound at 3.44x (BF16), 3.45x (F16) and 1.63x (Q8_MIXED). The public stage's own all_passed reads false for this profile too -- 10 of its 11 non-skipped checks pass, the one failure being the prefill-tolerance relation itself. The measurement has not been revised, reweighted or recalibrated, and the tolerance ledger still records gate_passed: false for this cell, because that remains true.

The decision, and who made it. jiangzhuo ruled on 2026-08-20 that this profile ships, after the blind half of that day's listening audit found it indistinguishable from BF16. The audit's strength is exactly this: one clip, one sentence, one seed, one listener. Q5_K_MIXED was included unlabelled among the other three pairs (BF16 vs F16, BF16 vs Q8_MIXED, BF16 CPU vs CUDA), A/B positions shuffled from a recorded seed (20260820), every pair confirmed to differ in bytes before anyone listened. A separate, labelled description-control pass returned "yes, in the described direction" -- weak evidence by design, recorded as weak, and it does not bear on this profile at all.

What that does and does not mean. It is a data point about this gate's conservatism at this margin, on one clip. It is not a recalibration of the bound, not a Quality Evaluation (still deferred, ADR 0017), and not a general finding that a 3x breach of this probe is inaudible. A reader who needs numerical fidelity to the reference should choose Q8_MIXED, which clears the same gate at 1.63x and is 40.36% larger (2,499,423,680 against 1,780,723,136 bytes; equivalently, Q5_K_MIXED is 28.75% smaller than it). A reader who wants the smallest package and accepts a disclosed, unresolved numerical breach on one listener's word can choose this one. See docs/quantization.md's "VoiceDesign's Q5_K_MIXED" section for the full arithmetic, Task 4's original do-not-publish recommendation kept as history, and the dated note recording that this ruling supersedes it.

Validation status

validation_level: port_validated

2 graph stages were replayed for 2 cases on DGX Spark CPU, NVIDIA GB10 CUDA 13.3. This variant introduces no new graphs of its own -- no reference-audio path, so no speaker or codec encoder to place -- so there is no placement decision here beyond the one Stage 1 already made: the codec decoder runs on the device and the autoregressive half (talker and code predictor) stays on the CPU under the discrete-outputs rule, because a sampled codec token conditions the next step and the sequence length itself. Measured end to end on this variant's own fixed workload, CUDA buys 6.16% (18.9220s to 17.7564s, RTF 4.6377 to 4.3520, BF16, n=8 medians) -- narrower than the Base variant's own 6.47%/6.35%, in the direction a 3.2x larger talker predicts. The replay stage's prefill probe never touches CUDA: its driver hardcodes the CPU device, and only codec.decoder.-prefixed tensors are mirrored to the GPU at all, so the talker has no device-side weights to run against regardless. No CUDA sub-grid is committed in the tolerance file, for that same structural reason -- matching the Base variant's own declined sub-grid, not a new omission.

Profile Public-seam checks Replay prefill headroom (0.01 bound) CPU real-time factor
BF16 11 passed, 3 skipped as inapplicable 3.44x 4.64
F16 11 passed, 3 skipped as inapplicable 3.45x 1.65
Q8_MIXED 11 passed, 3 skipped as inapplicable 1.63x 1.05
Q5_K_MIXED 10 passed, 1 FAILED (prefill tolerance), 3 skipped as inapplicable 0.32x — FAILS the 0.01 bound 1.08

SCOPE OF MEASUREMENT: partial-measurement-prefill-and-public-only. That is the status this package's own tolerance ledger (tests/tolerances/qwen3-tts.json) carries for it, quoted verbatim so the card and the ledger say the same words. It means what it says, and what it excludes matters as much as what it covers.

WHAT WAS RUN, per profile, for all four shipped profiles: the talker-prefill embedding probe against the pinned bfloat16 oracle on two description-instruct cases (one empty, one non-empty), reported above as replay prefill headroom; and the family-wide public-seam relation set, reported above as public-seam checks. Both columns are per-profile and every shipped profile has its own measured cell.

WHAT WAS NOT RUN: everything else. This variant's Golden Manifest declares thirteen Port Validation Cases, and none of them carries an oracle payload -- the ordinary replay loop skips every one of the thirteen, at every profile, for missing oracle artifacts. No comparison of generated codes has run. No comparison of output waveform against the oracle has run. There is no per-case audio evidence for this package of any kind. The eleven manifest cases beyond the two prefill cases are committed CONTRACT, not committed MEASUREMENT.

The validation_level: port_validated at the head of this section is the family's own long-standing reading of that level -- validated to the recorded depth, with the depth published beside it -- and this paragraph is that depth. Read the level and this scope together; neither is complete without the other.

THREE COLUMNS FOR A THIRD KIND OF EVIDENCE. Public-seam checks counts the same family-wide behavioural relations Base's and CustomVoice's cards count: a named seed reproduces byte for byte, a different seed and a different Voice both change the audio, the resolved language is reported, and so on. Three of the family-wide set are structurally inapplicable here and counted as skipped rather than passed: a Description Text Voice Profile has no id for the seam to echo, and two further checks need a preset "dialect" Voice this package does not catalogue.

Replay prefill headroom is the committed 0.01 max_relative bound divided by the worse of two measured p95-relative-error cases (an empty and a non-empty description instruct), comparing this port's assembled talker input embeddings against the pinned bfloat16 oracle's own. Above 1.0x clears the gate; below 1.0x fails it. This is a PREFILL comparison only -- no per-case codes or waveform oracle exists for this variant yet -- and it is not evidence about synthesized audio quality by itself.

CPU real-time factor is synthesis time over the audio produced, each row measured on its own output length, on a Release-typed build (build/rel-dgx-spark). Below 1.0 is faster than real time. Rows are never compared by dividing one RTF by another's wall clock -- the three profiles stop at different frame counts, a property of their weights, the same autoregressive-stop-decision mechanism that moves this family's generated length between builds. BF16's row is a later, paired re-measurement (n=8, taken alongside the CUDA run above) rather than this task's own first pass (n=3, RTF 4.73) -- both are real, and the later one is what this card carries, per the family record's own forward pointer between them.

Quality evaluation has not been run. These results establish that the port, the unconditioned default-Voice request path, deterministic request path, and CPU/CUDA execution work. They do not claim perceptual equivalence, naturalness, intelligibility, or speaker similarity.

A listening audit found no obvious regression. One maintainer compared a small set against the reference and reported nothing audible. That is release evidence, not a measurement: no rated comparison, no panel, no score, and it does not change the validation level. It says a defect large enough to hear was not found in what was heard.

Voices and input

This package exposes no preset speaker catalog. Its package default has no fixed identity and no speaker conditioning: with no Voice Profile supplied, which speaker a request produces is emergent, and the synthesis seed alone does not pin it. Reproducing a speaker needs the same seed and the same Execution Backend, package, and decode settings; switching between the CPU and CUDA backends can produce a different speaker for an otherwise identical request. Callers who want a stable identity should instead build a Voice Profile from Description Text (voice design) and pass it to the request. It produces 24000 Hz mono F32 audio.

This package accepts raw UTF-8 text through the built-in synthesize.qwen_bpe frontend. The frontend tokenizes text directly: no grapheme-to-phoneme conversion happens or is needed, and the runtime does not silently invoke eSpeak or download a frontend.

Usage

Build synthesize.cpp and synthesize a deterministic request:

git clone https://github.com/handy-computer/synthesize.cpp.git
cd synthesize.cpp
cmake -S . -B build -DSYNTH_BUILD_CLI=ON
cmake --build build -j

hf download jiangzhuo9357/qwen3-tts-12hz-1-7b-voicedesign-gguf qwen3-tts-12hz-1-7b-voicedesign-Q8_MIXED.gguf \
  --local-dir models/qwen3-tts-12hz-1-7b-voicedesign

build/bin/synthesize-cli \
  --model models/qwen3-tts-12hz-1-7b-voicedesign/qwen3-tts-12hz-1-7b-voicedesign-Q8_MIXED.gguf \
  --output output.wav \
  --text "Qwen3-TTS is awesome!" \
  --language en \
  --seed 0

The same local GGUF can be loaded through the public C ABI and wrapped by C++, Rust, or Python. Model loading never contacts Hugging Face.

License and checkpoint provenance

Both the pinned source at 022e286b and the checkpoint at 5ecdb673 carry an explicit Apache-2.0 grant. The checkpoint's grant was confirmed 2026-08-18 directly from the Hugging Face API against the pinned revision (Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign, sha 5ecdb67327fd37bb2e042aab12ff7391903235d3, license: apache-2.0), and the card's own prose at that revision carries no additional restriction -- verified from the upstream model card rather than from any port's README.

Both the pinned source at 022e286b and the checkpoint at 5ecdb673 carry an explicit Apache-2.0 grant, so no redistribution assumption is required for this variant.

Only English is declared. The checkpoint carries the same codec language tokens the rest of the family does, but no case in this variant's own validation record exercises a language beyond en, so none beyond en is advertised here -- the same caution CustomVoice's own card already takes.

Published 2026-08-21 to jiangzhuo9357/qwen3-tts-12hz-1-7b-voicedesign-gguf (commit 0dcbe6df83b1), after jiangzhuo's explicit per-act confirmation. The four GGUFs' LFS sha256 oids were verified remotely against the digests above after the upload landed. This paragraph said "prepared and has not been uploaded" until the same day; the digests above were computed against those exact files. Nothing has been pushed to jiangzhuo9357/qwen3-tts-12hz-1-7b-voicedesign-gguf or anywhere else, and publication is a separate outward act requiring jiangzhuo's explicit, per-act confirmation naming the target repository. The 2026-08-20 ruling that Q5_K_MIXED belongs on the roster decided WHICH profiles this card describes; it is not itself an authorization to upload anything.


Original upstream project card

Reproduced from the pinned upstream repository card for offline provenance. The upstream repository remains authoritative.

Qwen3-TTS


  🤗 Hugging Face   |   🤖 ModelScope   |   📑 Blog   |   📑 Paper   |   💻 GitHub

We release Qwen3-TTS, a series of powerful speech generation models developed by Qwen, offering comprehensive support for voice cloning, voice design, ultra-high-quality human-like speech generation, and natural language-based voice control.

Overview

Qwen3-TTS covers 10 major languages (Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish, and Italian) as well as multiple dialectal voice profiles. Key features:

  • Powerful Speech Representation: Powered by the self-developed Qwen3-TTS-Tokenizer-12Hz, it achieves efficient acoustic compression and high-dimensional semantic modeling.
  • Universal End-to-End Architecture: Utilizing a discrete multi-codebook LM architecture to bypass traditional information bottlenecks.
  • Extreme Low-Latency Streaming Generation: Supports streaming generation with end-to-end synthesis latency as low as 97ms.
  • Intelligent Voice Control: Supports speech generation driven by natural language instructions for flexible control over timbre, emotion, and prosody.

Quickstart

Environment Setup

Install the qwen-tts Python package from PyPI:

pip install -U qwen-tts

Python Package Usage

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

# Load the model
model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
    device_map="cuda:0",
    dtype=torch.bfloat16,
    attn_implementation="flash_attention_2",
)

# Custom Voice Generation
wavs, sr = model.generate_custom_voice(
    text="其实我真的有发现,我是一个特别善于观察别人情绪的人。",
    language="Chinese",
    speaker="Vivian",
    instruct="用特别愤怒的语气说",
)
sf.write("output.wav", wavs[0], sr)

Evaluation

Zero-shot speech generation on the Seed-TTS test set (Word Error Rate (WER, ↓)):

Model test-zh test-en
Qwen3-TTS-12Hz-1.7B-Base 0.77 1.24

Citation

If you find our paper and code useful in your research, please consider giving a star ⭐ and citation 📝:

@article{Qwen3-TTS,
  title={Qwen3-TTS Technical Report},
  author={Hangrui Hu and Xinfa Zhu and Ting He and Dake Guo and Bin Zhang and Xiong Wang and Zhifang Guo and Ziyue Jiang and Hongkun Hao and Zishan Guo and Xinyu Zhang and Pei Zhang and Baosong Yang and Jin Xu and Jingren Zhou and Junyang Lin},
  journal={arXiv preprint arXiv:2601.15621},
  year={2026}
}
Downloads last month
280
GGUF
Model size
2B params
Architecture
qwen3-tts
Hardware compatibility
Log In to add your hardware

5-bit

16-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Paper for jiangzhuo9357/qwen3-tts-12hz-1-7b-voicedesign-gguf