A Hebrew LoRA adapter for Qwen3-TTS-12Hz-1.7B-Base, trained on ~131k Hebrew
utterances with stressed-IPA text conditioning.
The adapter adds Hebrew to the base model without touching a single base
weight. Load it and you get Hebrew; disable it and you get the original model,
bit-for-bit, with all ten of its native languages intact.
Reference-audio speaker cloning, same as the base model
Best eval loss
2.1339 @ step 6000
Trained parameters
LoRA is applied to q_proj, k_proj, v_proj, o_proj, gate_proj,
up_proj, down_proj across both the talker backbone and the MTP
code_predictor.
These modules are additionally trained in full and shipped inside the adapter
(modules_to_save), because Hebrew phonotactics need the output distribution
itself to move, not just the attention/MLP deltas:
codec_head
text_projection
lm_head.0 … lm_head.14 (the 15 residual-codebook heads)
The text embedding table is not resized or retrained, so the tokenizer and
vocabulary are unchanged from the base model.
Important: the text field takes IPA, not Hebrew script
This adapter was trained with stressed IPA in the text field. Hebrew
orthography is famously under-specified for vowels, so feeding raw Hebrew script
will not work well. Convert first with a Hebrew G2P (the training data used
RenikudPlus for diacritization followed by IPA conversion).
The ˈ (U+02C8) primary-stress marker precedes the stressed vowel and matters —
the model learned prosody from it.
Usage
Requires the Qwen3-TTS inference code plus
peft. The adapter wraps the model's talker submodule, not the whole model.
python
1import torch, soundfile as sf
2from peft import PeftModel
3from qwen_tts import Qwen3TTSModel
45tts = Qwen3TTSModel.from_pretrained(6"Qwen/Qwen3-TTS-12Hz-1.7B-Base",7 device_map="cuda:0",8 dtype=torch.bfloat16,9 attn_implementation="sdpa",10)1112# Attach the Hebrew adapter to the talker.13tts.model.talker = PeftModel.from_pretrained(14 tts.model.talker,"notmax123/QwenTTS-he-1.7B"15)16tts.model.eval()1718wavs, sr = tts.generate_voice_clone(19 text="ʃalˈom, mˈa ʃlomχˈa hajˈom?",# stressed IPA20 language="Auto",21 ref_audio="my_reference_voice.wav",22 x_vector_only_mode=True,23 non_streaming_mode=True,24 do_sample=False,25 subtalker_dosample=False,26 repetition_penalty=1.0,27 max_new_tokens=2048,28)29sf.write("out.wav", wavs[0], sr)
language="Auto" is what the model was trained and sampled with — Hebrew is not
in the base model's language table, and the IPA text carries the phonetics.
Getting the base model's other languages back
Do not run Chinese / English / French / German / Italian / Japanese /
Korean / Portuguese / Russian / Spanish with the adapter active — it shifts the
output distribution toward Hebrew. Wrap those calls instead:
python
1with tts.model.talker.disable_adapter():2 wavs, sr = tts.generate_voice_clone(3 text="Hello, how are you today?",4 language="English",5 ref_audio=ref,6 ref_text=ref_text,7)
With the adapter disabled the forward pass is bit-identical to the
unmodified base model (verified: all 404 base tensors unchanged, and generated
audio matches the pre-adapter base at max|diff| = 0 for English and Japanese).
Do not merge
merge_and_unload() bakes the Hebrew deltas into the base weights permanently
and destroys the guarantee above. Keep the adapter separate and toggle it.
Training
Train set
131,569 Hebrew utterances
Eval set
600 held-out utterances
Steps
6,000 (≈1.46 epochs)
Batch
1 × 32 gradient accumulation = 32 effective
LR
5e-5, cosine schedule, 3% warmup
Precision
bf16 mixed
Attention
sdpa
Seed
0
Hardware
single 32 GB GPU (~16 GB peak)
Eval loss decreased monotonically at every 500-step checkpoint, from 2.2999
(step 500) to 2.1339 (step 6000) — the run had not yet plateaued, so more steps
would likely still help.
Eval loss by step
step
eval loss
500
2.2999
1000
2.2435
1500
2.2096
2000
2.1902
2500
2.1776
3000
2.1619
3500
2.1505
4000
2.1431
4500
2.1401
5000
2.1358
5500
2.1340
6000
2.1339
Files
File
What it is
adapter_model.safetensors
The LoRA weights + saved output heads
adapter_config.json
PEFT config
training_state.json
Full step/loss history from the run
samples/
Generated audio at step 6000 (2 Hebrew, 2 English reference voices)
Limitations
IPA input required. Raw Hebrew text needs a G2P pass first.
Trained on read/narrated speech; expressive or conversational Hebrew is
out of distribution.
Speaker coverage comes from the training corpus's voices; cloning to a very
different voice may carry over training-speaker prosody.
Hebrew only. Yiddish was deliberately excluded from this run.
License
Apache-2.0, matching the base model. See the
Qwen3-TTS model card for base-model terms.
Citation
bibtex
1@misc{melichov2026qwentts-he,
2 author = {Max Melichov},
3 title = {QwenTTS-he-1.7B: A Hebrew LoRA adapter for Qwen3-TTS-12Hz-1.7B-Base},
4 year = {2026},
5 url = {https://huggingface.co/notmax123/QwenTTS-he-1.7B}
6}