Downloads · 30 days
963
36% of all-time downloads
notmax123/QwenTTS-he-1.7B
QwenTTS-he-1.7B is a text-to-speech model from notmax123. Use it when you need text read aloud. It is set up for peft. The card lists the license as apache-2.0.
A Hebrew LoRA adapter for Qwen3-TTS-12Hz-1.7B-Base, trained on ~131k Hebrew utterances with stressed-IPA text conditioning.
Downloads · 30 days
963
36% of all-time downloads
All-time downloads
2.7K
Public
Repo size
247 MB
Likes
1
Public
Click a slice to open those files.
.safetensors246 MB · 99%
From the Hugging Face model README
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.
Trained by Max Melichov.
| Base model | Qwen/Qwen3-TTS-12Hz-1.7B-Base (voice-clone variant) |
| Adapter type | LoRA, r=32, α=64, dropout=0.05 |
| Adapter size | 246 MB (bf16) |
| Language added | Hebrew |
| Text input | Stressed IPA (not Hebrew orthography — see below) |
| Voice control | Reference-audio speaker cloning, same as the base model |
| Best eval loss | 2.1339 @ step 6000 |
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_headtext_projectionlm_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.
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).
Hebrew: עוֹד רֶגַע אֲנִי אֶתְיַיחֵס לִיהוּדָה וְשׁוֹמְרוֹן.
IPA: ʔˈod ʁˈeɡa ʔanˈi ʔetjaχˈes lihudˈa veʃomʁˈon.
The ˈ (U+02C8) primary-stress marker precedes the stressed vowel and matters —
the model learned prosody from it.
Requires the Qwen3-TTS inference code plus
peft. The adapter wraps the model's talker submodule, not the whole model.
import torch, soundfile as sf
from peft import PeftModel
from qwen_tts import Qwen3TTSModel
tts = Qwen3TTSModel.from_pretrained(
"Qwen/Qwen3-TTS-12Hz-1.7B-Base",
device_map="cuda:0",
dtype=torch.bfloat16,
attn_implementation="sdpa",
)
# Attach the Hebrew adapter to the talker.
tts.model.talker = PeftModel.from_pretrained(
tts.model.talker, "notmax123/QwenTTS-he-1.7B"
)
tts.model.eval()
wavs, sr = tts.generate_voice_clone(
text="ʃalˈom, mˈa ʃlomχˈa hajˈom?", # stressed IPA
language="Auto",
ref_audio="my_reference_voice.wav",
x_vector_only_mode=True,
non_streaming_mode=True,
do_sample=False,
subtalker_dosample=False,
repetition_penalty=1.0,
max_new_tokens=2048,
)
sf.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.
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:
with tts.model.talker.disable_adapter():
wavs, sr = tts.generate_voice_clone(
text="Hello, how are you today?",
language="English",
ref_audio=ref,
ref_text=ref_text,
)
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).
merge_and_unload() bakes the Hebrew deltas into the base weights permanently
and destroys the guarantee above. Keep the adapter separate and toggle it.
| 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.
<details> <summary>Eval loss by step</summary>| 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 |
| 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) |
Apache-2.0, matching the base model. See the Qwen3-TTS model card for base-model terms.
@misc{melichov2026qwentts-he,
author = {Max Melichov},
title = {QwenTTS-he-1.7B: A Hebrew LoRA adapter for Qwen3-TTS-12Hz-1.7B-Base},
year = {2026},
url = {https://huggingface.co/notmax123/QwenTTS-he-1.7B}
}