phoonnx-qwen3-tts
ONNX export of
Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice
for
phoonnx. The weights, the architecture and
the nine timbres are the work of the Alibaba Qwen team; this repository only holds the
graphs in ONNX form, converted with the script in
scripts/conversion/qwen3tts/.
Graphs
| File | What it does |
|---|
talker.onnx | 28-layer talker, one KV-cached step per 80 ms frame |
text_embed.onnx | text ids to projected text hidden states |
codec_embed.onnx | talker codec ids to hidden states |
code_predictor_prefill.onnx | talker hidden plus code group 0, gives group 1 |
code_predictor_step.onnx | code group n gives code group n+1 |
sub_codec_embed.onnx | code-group token to its group's embedding |
codec_decoder.onnx | 16 code groups per frame to 24 kHz audio |
tokenizer.json | the model's own Qwen2 subword BPE |
All graphs are float32, opset 17 (18 for the codec decoder).
Parity
Checked against the upstream PyTorch model on CPU with greedy decoding:
| Measurement | Result |
|---|
| Prompt embeddings, max abs diff | 2.4e-07 |
| Talker prefill logits, max abs diff | 2.3e-05 |
| Talker decode logits, max abs diff | 5.0e-05 |
| Greedy token agreement, 52 frames x 16 groups | 100 % (832/832) |
| Codec decoder waveform, max abs diff | 9.9e-07 |
Voices
Nine timbres: vivian, serena, uncle_fu, dylan (Beijing), eric (Sichuan),
ryan, aiden, ono_anna, sohee. Ten languages: Chinese, English, Japanese,
Korean, German, French, Russian, Portuguese, Spanish, Italian.
Use
1from phoonnx.model_manager import TTSModelManager
2
3manager = TTSModelManager()
4manager.merge_default_voices()
5voice = manager.voices["qwen3tts/ryan/en"].load()
6for chunk in voice.synthesize("The quick brown fox jumps over the lazy dog."):
7 ... # chunk.audio_float_array
Licence
Apache-2.0, the licence of the original model. Cite the Qwen3-TTS technical report
(arXiv 2601.15621) when you use these weights.