Uzbek TTS · Chatterbox fine-tune
Uzbek text,
natural voice.
A text-to-speech model fine-tuned on ~10 hours of a single audiobook narrator. It splits long text into sentences on its own and keeps natural pauses and intonation. It can also borrow another voice from a ~10-second recording.
The audio in the main sample is raw model output, with no editing.
The highlighted word follows playback (approximate). Click any word to jump there.
- of data
- ~10h
- voices
- 1
- sample rate
- 24kHz
- samples
- 6
All samples
From a greeting to a dialogue — texts in different tones. Click a row to open it in the player above.
Keyboard
- Space K
- play / pause
- J L
- back / forward 5 seconds
- N P
- next / previous sample
- V
- switch voice
- ← →
- 1 second, when the waveform is focused
- ↑ ↓
- move through the list
Results
Every number can be checked: the texts and audio are on this page, and the evaluation script is in the repo. The evaluation is still small — 6 sentences, 105 words — so treat these numbers as a direction, not a final benchmark.
Intelligibility — round-trip WER / CER
Each sample was transcribed back with an Uzbek ASR model (rustam1221/uzbek-asr-gigaam, 220M + KenLM) and compared with the original text. Both sides are lowercased, apostrophes are canonicalized and punctuation is stripped.
| Voice | Words | WER | CER | Only error |
|---|---|---|---|---|
| Narrator | 105 | 1.0% | 0.1% | «esar» → «esa» |
| Female voice | 105 | 1.0% | 0.7% | sentence-final «edim» swallowed |
Timbre similarity
Cosine similarity from Chatterbox's own voice encoder (1.00 = the same voice). The female voice is cloned without retraining, from a ~12-second recording.
| Synthesis | vs narrator reference | vs female reference |
|---|---|---|
| Narrator | 0.95 | 0.60 |
| Female voice | 0.62 | 0.94 |
| The two references | 0.63 | |
The narrator's timbre does not leak into the female voice: its similarity to the narrator (0.62) is at the level of two different people (0.63).
Speaking rate and pitch
| Audio | Rate, chars/s | F0 median | Pitch range |
|---|---|---|---|
| Narrator reference | — | 102 Hz | — |
| Narrator synthesis | 14.0 | 101 Hz | 7.2 st |
| Female reference | 14.7 | 251 Hz | — |
| Female synthesis | 16.8 | 236 Hz | 7.6 st |
st — semitones, 10th–90th percentile range. The female voice speaks 14% faster than the original recording: the model learned the narrator's rhythm, and the cloned timbre speeds it up. This is the biggest open issue — slowing it down with cfg_weight 0.3 is being tested.
How it works
Five steps from text to sound. Only the text model (T3) was retrained for Uzbek; everything else is stock Chatterbox.
- 1
Normalization
Text is cleaned, numbers and abbreviations are spelled out, punctuation is normalized.
- 2
Chunking
Long text is split into short chunks at sentence boundaries.
- 3
T3 · text → tokens
A Llama-based model turns each chunk into speech tokens. The narrator's voice is learned here, with LoRA.
- 4
S3Gen · tokens → audio
A 24 kHz waveform is generated from the tokens; the timbre comes from a reference recording.
- 5
Post-processing
Extra silence and breath tails are trimmed, and chunks are joined with natural pauses.
Data
A ~12-hour audiobook read by one narrator was turned into a training set automatically — not a single transcript was written by hand.
- clips
- 5,005
- hours
- 10.07
- words
- 65,731
- unique words
- 16,954
Preparation
- Segmentation. Silero VAD cuts the audio at sentence boundaries into 1.5–12 s clips, 24 kHz.
- Transcription. Each clip is transcribed, with punctuation, by an Uzbek ASR model (GigaAM 220M + KenLM).
- Filtering. Ads, clipped audio and clips with an implausible speaking rate are dropped.
- Split. 4,955 clips for training; 50 held out for evaluation and never seen in training.
Rejected
| Reason | Clips |
|---|---|
| Ads or misrecognized | 42 |
| Clipping | 8 |
| Implausible rate | 5 |
| Total (of 5,060) | 55 · 1.1% |
Clip length
- 0–2 s28
- 2–4 s441
- 4–6 s928
- 6–8 s1,429
- 8–10 s2,014
- 10–12 s165
Median 7.6 s, mean 7.2 s, about 13 words per clip.
Because the transcripts also come from ASR, they contain errors — for example, the book's «teleekran» was often heard as «Telegram». The model may learn those errors too; hand-checked transcripts are a next step.
Training
Only T3, the part that turns text into speech tokens, was retrained; the waveform generator (S3Gen) and the voice encoder are frozen upstream Chatterbox weights.
Settings
- Base model
- ResembleAI Chatterbox (T3 + S3Gen + VE)
- Trained modules
- T3 only; S3Gen and VE frozen
- Method
- LoRA r=128, α=256 on attention and MLP layers; text embedding and output head fully trained
- Tokenizer
- Uzbek, 2,454 tokens
- Optimization
- lr 1e-4, effective batch 32, fp16
- Hardware
- Google Colab T4 (16 GB)
- Steps
- 587 / 770 (5 epochs planned)
- Checkpoint
- step 400 (~2.6 epochs), LoRA merged into the weights
Loss
| Step | Epoch | Loss | LR |
|---|---|---|---|
| 154 | 1.0 | 6.15 | 8.0e-5 |
| 308 | 2.0 | 5.23 | 6.0e-5 |
| 400 · shipped | 2.6 | — | 4.8e-5 |
| 587 · session ended | 3.8 | — | — |
LR decays linearly from 1e-4 to step 770. Loss was logged at the end of each epoch; no separate validation set was used during training.
What we learned
- 10 hours is enough for one voice. After 400 LoRA steps, the ASR model understands the output with a 1% word error rate.
- Free GPUs are a constraint. The Colab session ended at step 587/770, and with Drive full the latest saved copy was step 400. These results come from a model that has not converged.
- The data was transcribed by ASR. The automatic route is cheap — only 55 of 5,060 clips were dropped — but ASR errors end up in the text too.
- Timbre transfers, rhythm doesn't. A 12-second recording gives the voice colour with 0.94 similarity, but pace and stress stay the narrator's.
Synthesis speed
RTF is synthesis time divided by audio duration; above 1 means slower than real time. Measured while generating the 12 samples on this page.
| Device | Audio | Synthesis | Mean RTF | Best |
|---|---|---|---|---|
| Apple M4, 16 GB (MPS) | 95.9 s | 736 s | 7.7× | 2.7× |
| CUDA GPU | not measured yet | |||
On a Mac the result depends heavily on memory pressure: the model takes ~5 GB, and next to another heavy app RTF drops to 20×. The service is meant to run on a CUDA server in production.
Using the API
Synthesis runs through a queue: a request returns a job_id immediately, and every finished segment is downloaded as its own WAV. Write to us for an API key.
Files and versions
Layout
models/
├── t3_finetuned_merged.safetensors 2.0 GB Uzbek T3, LoRA merged
├── s3gen.safetensors 1.0 GB upstream Chatterbox
├── ve.safetensors 5.4 MB voice encoder
├── tokenizer.json 72 KB Uzbek, 2,454 tokens
├── conds.pt 108 KB default conditioning
└── voices/ reference recordings
Weights are never downloaded at runtime — the service reads them from a local folder.
Versions
| Version | Weights | Status |
|---|---|---|
| v0.1 | step 400, 2.6 epochs | current · 2026-10-17 |
| v0.2 | full 770 steps | planned |
Limitations
- The model was trained on the narrator only; the female voice is cloned without retraining and speaks 14% faster.
- A short sentence-final word is sometimes swallowed (1 of 12 samples).
- Numbers followed by a suffix (e.g. a time plus «da») are not yet read correctly.
- Training did not finish (587 / 770 steps; step 400 is shipped).
- Evaluation covers only 6 sentences so far; there is no large benchmark yet.
Next steps
- Round-trip WER on the 50 held-out sentences.
- Train to step 770 and compare.
- Slow down the female voice (cfg_weight 0.3).
- Fix normalization of numbers with suffixes.
- Measure speed on a CUDA server.
Citation
@misc{uzbek_tts_narrator,
title = {Uzbek TTS: Chatterbox T3 LoRA fine-tune on a single narrator},
author = {abbos2332},
year = {2026},
url = {https://huggingface.co/spaces/abbos2332/uzbek-tts-demo}
}
Contact
Want to work with the model?
Write about an API key, voicing your own text, or a partnership.