Views
No views yet
022e286b98fbec7e1e916cb940cdf532cd9f488e and
validated on 2026-08-17 against the pinned upstream PyTorch implementation at bfloat16 on CUDA.| Profile | Download | Size | Tensor storage | SHA-256 | What to know before choosing it |
|---|---|---|---|---|---|
| BF16 | qwen3-tts-12hz-0-6b-base-BF16.gguf | 2399.9 MB (2,516,522,464 bytes) | 478 BF16 + 416 F32 | 993f4cd164df2b2f83e72ec51d79586f5721732d52ee24c5b5462858c610999f | — |
| F16 | qwen3-tts-12hz-0-6b-base-F16.gguf | 2400.1 MB (2,516,706,912 bytes) | 304 F16 + 590 F32 | e74841947b62f9ac63f09bd7443959cee325e66ae46cedfb346a48553ff0a046 | LARGER than the BF16 source by 184,448 bytes, and that is not a defect. Both are two-byte types, so the matrix weights do not shrink while the sensitive tensors widen BF16 to F32. F16 is a speed profile for this family, not a size one. It clears every gate and does not pay; it is carried for completeness rather than recommended. |
| Q8_MIXED | qwen3-tts-12hz-0-6b-base-Q8_MIXED.gguf | 1590.4 MB (1,667,606,112 bytes) | 266 Q8_0 + 38 F16 + 590 F32 | 808667ae6b14e77a4379f2be3b43af3a961fb7864dd1b44eb94c061e62a789a9 | THE DEFAULT RECOMMENDATION, and the only profile that pays. 33.7% smaller than the source, RTF 0.863 against BF16's 3.15 -- faster than real time -- and 1.06 GiB less peak RSS, with no measured cost on any gated quantity and no audible degradation in the 2026-08-17 audit. |
| The 38 F16 tensors are the speaker encoder's convolution weights. They are never block-quantized: a block runs along the kernel extent, which is 1, 3 or 5 here, against Q8_0's block of 32. The codec half stays F32 under every profile, so the reference codes this package produces are byte-identical across all three. |
validation_level: port_validated| Profile | Public-seam checks | Speaker x-vector cosine | CPU real-time factor |
|---|---|---|---|
| BF16 | 7 passed, 3 skipped as inapplicable | 0.99999467 | 3.15 |
| F16 | 7 passed, 3 skipped as inapplicable | 0.99999501 | not_measured |
| Q8_MIXED | 7 passed, 3 skipped as inapplicable | 0.99999501 | 0.863 |
Public-seam checks counts the behavioural relations the C interface
promises: a named seed reproduces byte for byte, a different seed does not,
a random seed comes back concrete and replays, a different Voice changes the
audio, and the resolved language is reported. Three further checks in the
family-wide set are structurally inapplicable here and are counted as
skipped rather than passed -- a Voice Profile has no id for the seam to
echo, and two of them need a preset "dialect" Voice this package does not
catalogue.Speaker x-vector cosine is the worst case of four, comparing the port's
ECAPA-TDNN embedding against the pinned PyTorch oracle's. Note where the
residual lives: at the x-vector's largest element the deviation is 0.68 of
one bfloat16 ulp, and recomputing the ORACLE's own final layer in float64
disagrees with the oracle by more than this port does. The comparison is
bounded by the reference, not by the port, which is why the halved profiles
score very slightly better than the source profile rather than worse.CPU real-time factor is synthesis time over the audio produced, each row
measured on its OWN output length, on a Release-typed build. Below 1.0 is
faster than real time. Rows are never compared by dividing one RTF by
another's wall clock -- the profiles stop at different frame counts, which
is a property of their weights.synthesize.qwen_bpe frontend, and also accepts exact token
IDs already produced by the same vocabulary. 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.1git clone https://github.com/handy-computer/synthesize.cpp.git
2cd synthesize.cpp
3cmake -S . -B build -DSYNTH_BUILD_CLI=ON
4cmake --build build -j
5
6hf download jiangzhuo9357/qwen3-tts-12hz-0-6b-base-gguf qwen3-tts-12hz-0-6b-base-Q8_MIXED.gguf \
7 --local-dir models/qwen3-tts-12hz-0-6b-base
8
9build/bin/synthesize-cli \
10 --model models/qwen3-tts-12hz-0-6b-base/qwen3-tts-12hz-0-6b-base-Q8_MIXED.gguf \
11 --output output.wav \
12 --text "Qwen3-TTS is awesome!" \
13 --language en \
14 --seed 0022e286b and the checkpoint at 5d839924 carry an
explicit Apache-2.0 grant, verified from the upstream model card rather than
from any port's README.synthesize.voice.profile_sources). Until that key existed the runtime
inferred the answer from the Voice Mode, which worked only while
profile-sources meant exactly one model variant. It now means two, whose
source sets are disjoint, so the inference had to go and the loader requires
the declaration instead. No compatibility shim was written: the project is
pre-release and these packages have no dependent users, so a shim would buy
compatibility nobody needs at the cost of putting the inference back into a
loader that had just been made declarative.scripts/convert-qwen3-tts.py. Everything else on this card -- the tolerances,
the validation counts, the x-vector cosines, the RTF figures -- was measured on
these exact files and still describes what the package computes. Only loading
changed.022e286b and the checkpoint
at 5d839924 carry an explicit Apache-2.0 grant, so no redistribution
assumption is required for this variant.Reproduced from the pinned upstream repository card for offline provenance. The upstream repository remains authoritative.
1pip install -U qwen-tts
2# Optional: for optimized performance
3pip install -U flash-attn --no-build-isolation1import torch
2import soundfile as sf
3from qwen_tts import Qwen3TTSModel
4
5# Load the model
6model = Qwen3TTSModel.from_pretrained(
7 "Qwen/Qwen3-TTS-12Hz-0.6B-Base",
8 device_map="cuda:0",
9 dtype=torch.bfloat16,
10 attn_implementation="flash_attention_2",
11)
12
13# Reference audio for cloning
14ref_audio = "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-TTS-Repo/clone.wav"
15ref_text = "Okay. Yeah. I resent you. I love you. I respect you. But you know what? You blew it! And thanks to you."
16
17# Generate speech
18wavs, sr = model.generate_voice_clone(
19 text="I am solving the equation: x = [-b ± √(b²-4ac)] / 2a? Nobody can — it's a disaster (◍•͈⌔•͈◍), very sad!",
20 language="English",
21 ref_audio=ref_audio,
22 ref_text=ref_text,
23)
24
25# Save the resulting audio
26sf.write("output_voice_clone.wav", wavs[0], sr)

1@article{Qwen3-TTS,
2 title={Qwen3-TTS Technical Report},
3 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},
4 journal={arXiv preprint arXiv:2601.15621},
5 year={2026}
6}