Breeze-TTS-2-Turkish-Base

Turkish continual pretraining of BreezeBlue/breeze-tts-2 for Turkish prosody and pronunciation with Turkish/English code-switching. English/Chinese replay data was mixed in to preserve the base model's English and Chinese (not re-benchmarked here). Zero-shot voice cloning, voice design and voice direction work as in the base model.

Architecture

Dual-AR text-to-speech, unchanged from Breeze TTS 2 (standalone checkpoint, no PEFT needed):

Component Details
Text encoder T5Gemma 2 encoder (T5Gemma2TextEncoder, 26 layers, d=1152, 1.00 B parameters); the CPT's r=8 q/v/o LoRA is merged (78 modules); special-token rows 262144..262157 trained, Gemma vocabulary 0..262143 frozen
Projector text_encoder_proj: linear 1152 → 2048
Backbone (slow AR) Qwen3 decoder (28 layers, d=2048, 1.41 B parameters) with its own 262,158 × 2048 text-token embedding (0.54 B); predicts RVQ codebook 0 + EOS every 80 ms
Depth decoder (fast AR) 12 layers (d=1024, 0.43 B parameters), predicts codebooks 1–15 of each frame
Audio tokenizer Qwen3-TTS 12 Hz tokenizer (Qwen3TTSTokenizerV2Model): 16 codebooks at 12.5 Hz, 24 kHz in/out, bundled in audio_tokenizer/

Size: about 3.5 B parameters. The safetensors shards hold 3,483,206,497 bf16 values (backbone 1.41 B, text encoder 1.00 B, backbone text-token embedding 0.54 B, depth decoder 0.43 B, a Mimi codec_model 0.10 B, heads and projector 0.01 B). The shard index's total_parameters field reports 3,466,363,713, the same value as the upstream checkpoint.

Training recipe: Phase 1 acoustic warm-up (first 15% of steps, T5Gemma 2 LoRA not yet trained) → Phase 2 joint CPT (T5Gemma 2 r=8 q/v/o LoRA at 1.5e-5, full backbone 4e-5, depth decoder 1e-4, projector 1e-4, cosine decay to 10%), tiered RVQ loss [6, 4, 2, 1] with depth loss ×2.5, WiSE-FT (α = 0.85) against the base weights, then Phase 3 DPO on synthetic failure-mode preference pairs (LoRA r=16/32, β = 0.1; see the release notes). v2.0 was trained on 4× NVIDIA H100 80GB HBM3 (RunPod): CPT data-parallel on every GPU, DPO on one.

Code-switching example. English terms stay in English spelling; numbers and times must be written out (verbalized) before synthesis:

Saat 14:30'daki Sprint Planning toplantısına 10 dakika kaldı, GitHub üzerindeki pull request'i mergeledim.

→ Saat on dört otuzdaki Sprint Planning toplantısına on dakika kaldı, GitHub üzerindeki pull request'i mergeledim.

The evaluations below verbalized text with the author's normalize_turkish_for_tts (breeze_infer/tr_normalizer.py, bundled in this repository with train_tr/); neither is part of the public breezeblue-ai/breeze-tts code, so with that code pass already-verbalized text.

Benchmarks

1. External Turkish benchmarks (Freya-TR-Eval, TurkASR-Bench-TTS protocol with KDHO, FLEURS tr_tr)

1.1. Freya-TR-Eval (freyavoice/freya-tr-eval, 495 conversational Turkish sentences)

Run on 1× NVIDIA H100 80GB HBM3 (RunPod, 2026-11-02) over all 495 sentences of freyavoice/freya-tr-eval (revision 1c30761f): 406 everyday sentences generated by gemini-3.1-pro-preview and 89 short-native texts sampled from Common Voice 17 and CoVoST2. Table 2 of the FreyaTTS paper (arXiv:2607.09530) scores every system with Whisper-large-v3 after 8 kHz band-matching, so both 8 kHz band-matched and full-band Whisper-large-v3 (faster-whisper) scores are reported, plus wav2vec2-xls-r-300m-cv7-turkish CTC CER (greedy, no LM), UTMOS22-strong and WeSpeaker ResNet34 cosine to the conditioning reference (SIM ref). The card's primary metric, semantic WER with an LLM judge, was not computed. Breeze rows: production breeze_infer.api (--fast-backbone-decode --fast-depth-decoder, server-side normalize_turkish_for_tts), cfg 1.0, seed 42; Base is conditioned on the 24 kHz studio kahya_klasik reference, Gaddar Kerim on gk_clean_025.wav, a 5.8 s film clip from its LoRA training set.

Intelligibility (495 sentences). Clean = CER ≤ 2% or WER = 0; Fail = CER > 30%.

Model n WER % (8 kHz) ↓ CER % (8 kHz) ↓ WER % (full) ↓ CER % (full) ↓ Median CER % ↓ Clean % ↑ Fail % ↓ wav2vec2 CTC CER % ↓
Breeze-TTS-2-Turkish-Base v2.0 (breeze_v2_base) 495 1.82 0.35 1.89 0.36 0.00 94.14 0.00 1.50
Breeze-TTS-2-Gaddar-Kerim v2.0 (breeze_v2_gk_w050) 495 1.65 0.41 1.56 0.39 0.00 95.35 0.20 2.23
Breeze-TTS-2-Turkish-Base v3.0 (breeze_v3_base) 495 2.20 0.41 1.86 0.39 0.00 93.74 0.00 1.56
Breeze-TTS-2-Gaddar-Kerim v3.0 (breeze_v3_gk_w050) 495 1.74 0.31 1.72 0.33 0.00 94.55 0.00 2.15
Breeze-TTS-2-Turkish-Base v2.0, re-render ¹ (breeze_v2_base) 495 1.98 0.42 2.07 0.48 0.00 92.93 0.20 1.49
Breeze-TTS-2-Gaddar-Kerim v2.0, re-render ¹ (breeze_v2_gk_w050) 495 1.77 0.34 1.87 0.35 0.00 93.74 0.00 1.99
Microsoft Edge-TTS tr-TR-AhmetNeural (edge_tts_ahmet) 495 1.93 0.41 1.79 0.38 0.00 94.14 0.00 1.63
Meta MMS-TTS facebook/mms-tts-tur (mms_tts_tur) 495 7.17 1.59 6.45 1.51 0.00 77.58 0.20 4.49
Piper (tr, dfki), 16M (published, Table 2) 495 4.4 1.1 — — — — — —
Coqui GlowTTS (tr), 28M (published, Table 2) 495 12.1 3.3 — — — — — —
MMS-TTS (tr), 36M (published, Table 2) 495 6.8 1.7 — — — — — —
SpeechT5 (tr), 144M (published, Table 2) 495 83.4 45.5 — — — — — —
FreyaTTS, 183.2M (published, Table 2) 495 8.0 3.0 — — — — — —
F5-TTS (tr), 336M (published, Table 2) 495 24.3 10.9 — — — — — —
XTTS-v2 (multi), 470M (published, Table 2) 495 11.1 3.9 — — — — — —

¹ The v3.0 rows and the rows marked ¹ come from one cloud run on 2026-11-03 (one NVIDIA H200, image runpod/pytorch:1.6.0-cu1281-torch291-ubuntu2204, torch 2.9.1+cu128) through the production API with fast_backbone_decode, fast_depth_decoder (codec eager). The re-render rows are the published v2.0 weights (digests a720ea7f and 6fd6c2f5) rendered again in that run, so compare v3.0 with them; the other rows are the 2026-11-02 measurements, copied unchanged. Paired against the v2.0 re-render on the same items (bootstrap 1,000 resamples, seed 42): Freya wer_8k Δ +0.21 pp [-0.25, +0.74] (n = 495), FLEURS wer Δ -0.50 pp [-5.35, +4.44] (n = 100).

Published rows are copied from Table 2 of arXiv:2607.09530 at its precision (the authors' pipeline and text normalization, not re-measured here); Table 2's listening-test MOS has no counterpart here. MMS-TTS appears in both: 6.8% WER / 1.7% CER published vs 7.17% / 1.59% measured here.

Naturalness, speaker similarity, stability and speed (495 sentences)

Model n UTMOS (full) ↑ UTMOS (8 kHz) ↑ Blind SNR dB SIM ref ↑ Prem. EOS % ↓ Stutter % ↓ Dead air % ↓ RTF 1-stream ↓ TTFA ms 1-stream ↓
Breeze-TTS-2-Turkish-Base v2.0 (breeze_v2_base) 495 4.07 3.75 103.1 0.8035 0.40 0.00 0.00 0.343 186.5
Breeze-TTS-2-Gaddar-Kerim v2.0 (breeze_v2_gk_w050) 495 3.50 3.33 46.9 0.7120 0.20 0.20 0.40 0.362 213.8
Breeze-TTS-2-Turkish-Base v3.0 (breeze_v3_base) 495 4.07 3.75 103.2 0.8004 0.20 0.00 0.00 0.347 129.9
Breeze-TTS-2-Gaddar-Kerim v3.0 (breeze_v3_gk_w050) 495 3.50 3.33 47.0 0.7117 0.00 0.00 0.61 0.317 123.9
Breeze-TTS-2-Turkish-Base v2.0, re-render ¹ (breeze_v2_base) 495 4.07 3.75 102.7 0.8022 0.61 0.00 0.00 0.340 125.6
Breeze-TTS-2-Gaddar-Kerim v2.0, re-render ¹ (breeze_v2_gk_w050) 495 3.51 3.33 47.2 0.7159 0.20 0.20 0.00 0.347 131.9
Microsoft Edge-TTS tr-TR-AhmetNeural (edge_tts_ahmet) 495 3.84 3.55 105.9 — 0.20 0.00 0.00 — —
Meta MMS-TTS facebook/mms-tts-tur (mms_tts_tur) 495 3.79 3.55 77.7 — 1.01 0.40 0.20 0.022 104.4

¹ The 2026-11-03 cloud run: see the note under the Freya intelligibility table.

UTMOS22-strong runs on 16 kHz input, once on the full-band audio and once after 8 kHz band-matching. Blind SNR is the p90/p10 ratio of 20 ms frame power with a 1e-12 power floor, so digitally silent pauses inflate it. Premature EOS: the sentence's last word is missing from the last 3 heard words in both ASR transcripts; stutter: an extra repeated word or syllable heard by both; dead air: an internal silence ≥ 1.5 s. 1-stream timing: 25 Freya sentences with one worker alone on the GPU; TTFA = request start to first PCM bytes over localhost HTTP. Edge-TTS was timed only in the parallel pass, where its numbers are cloud round trips (RTF 0.244, TTFA 881 ms), so its 1-stream cells are empty.

By register. On the generated everyday register (n = 406), Base scores 1.29% WER / 0.25% CER at 8 kHz (1.40% / 0.26% full band), UTMOS 4.08 and SIM ref 0.8179, with 0.00% premature EOS, stutter, dead air and failures. On the 89 short-native texts it scores 4.27% WER / 0.82% CER at 8 kHz. Common Voice 17 tr, including 757 utterances of its test split, is in the v2.0 CPT data, so some short-native texts may have been seen in training.


1.2. TurkASR-Bench-TTS protocol with KDHO (150 prompts × 10 engines, measured locally)

yagmurtuncer/turkasr-bench-tts (card revision 04e45c28) scores synthetic Turkish speech with Whisper and KDHO, the root- and affix-aware error rate of TurkASR-Bench. Its audio and sentence files are gated, so this section replicates the card's protocol on our own prompt set; it is not a run on the card's sentences:

  • 102 diagnostic sentences written for this benchmark in the card's 7 categories (long_affix 16, neg_imp 14, neg_pair 24, numbers 16, proper_foreign 12, questions 10, voice_commands 10; numbers written as words).
  • 48 mirror sentences: 16 FLEURS tr_tr + 16 Freya-TR-Eval everyday + 16 Freya-TR-Eval short-native (3–30 words, ≤ 220 characters, no digits, seed 42). The card's 774 mirror sentences are TurkASR-Bench test transcripts.

Scoring: official kdho 0.1.1 (λ = 0.5: an affix-only substitution costs half a word error, a root or negation change a full word), vendored from yagmurtuncer/turkish-asr-leaderboard-kdho at 929384a4 (kdho is not on PyPI as of 2026-11-02). Main ear: faster-whisper large-v3; the card's QC ear: large-v3-turbo. Also wav2vec2-xls-r-300m-cv7-turkish CTC CER, UTMOS22-strong (16 kHz input) and WeSpeaker ResNet34. One NVIDIA GeForce RTX 4090 (torch memory fraction capped at 0.33); Piper ran on the CPU and Edge-TTS is a cloud service. Breeze rows: production API in-process, cfg 1.0, seed 42; Base conditioned on kahya_klasik, Gaddar Kerim on gk_clean_025.wav.

Overall (150 prompts × 10 engines = 1,500 clips). KDHO, CER and WER from Whisper large-v3; Clean = CER ≤ 2%, Catastrophic = CER > 30%; voice consistency = cosine to the leave-one-out centroid of the engine's own 150 clips.

Model Type KDHO % ↓ KDHO 95% CI CER % ↓ Median CER % ↓ WER % ↓ Clean % ↑ Catastrophic % ↓ CTC CER % ↓ UTMOS ↑ SIM ref ↑ Voice consistency ↑ neg_pair acc % ↑ RTF (median) ↓
breeze_v2_gk_w050 ours, v2.0 + Gaddar Kerim LoRA (0.5×) 3.13 1.67–4.83 0.92 0.00 3.46 90.7 0.0 2.93 3.48 0.692 0.799 100.0 0.871
breeze_v2_base ours, v2.0 3.22 1.68–5.33 0.87 0.00 3.66 90.7 0.0 2.09 4.03 0.773 0.864 100.0 0.893
breeze_v3_gk_w050 ours, v3.0 + Gaddar Kerim LoRA (0.5×) 3.43 1.67–5.57 0.96 0.00 3.97 90.0 0.0 2.94 3.47 0.698 0.808 100.0 0.823
edge_tts_ahmet commercial cloud 4.03 2.05–6.64 1.15 0.00 4.43 89.3 0.0 2.72 3.85 — 0.871 100.0 0.364
breeze_v3_base ours, v3.0 4.35 2.35–7.05 0.92 0.00 4.77 88.7 0.0 2.04 4.04 0.774 0.866 100.0 0.885
piper_tr_dfki open VITS (CPU) 4.46 2.73–6.64 1.05 0.00 4.98 86.7 0.0 3.06 3.69 — 0.849 100.0 0.034
breeze_v1_base ours, v1.0 5.45 2.53–10.22 1.09 0.00 5.75 86.7 0.0 2.91 4.04 0.759 0.850 91.7 0.889
speecht5_tr open encoder-decoder 6.96 4.63–9.92 1.82 0.00 7.35 78.7 0.0 5.36 3.54 — 0.878 100.0 0.501
vits_openbible_tr open VITS 7.57 4.61–10.98 2.65 0.00 8.28 82.0 1.3 3.77 3.61 — 0.867 91.7 0.040
mms_tts_tur open VITS 9.22 6.31–12.98 2.36 0.00 10.40 70.0 0.7 5.16 3.78 — 0.676 100.0 0.034

The two v2.0 models have the lowest mean KDHO here, but their 95% bootstrap intervals overlap every other engine's except MMS-TTS, so these intervals do not separate the top five engines.

The v3.0 rows (breeze_v3_base, breeze_v3_gk_w050) were rendered and scored on 2026-11-03 with the same prompts, references and referee code on the same local GPU; the other rows are the 2026-11-02 measurements, copied unchanged.

Drift control: the v2.0 base re-rendered on 2026-11-03

Drift control KDHO % ↓ Corpus KDHO % ↓ CER % ↓ UTMOS ↑ Prem. EOS % ↓ neg_pair acc % ↑ neg_imp acc % ↑
published 2026-11-02 (breeze_v2_base) 3.22 2.68 0.87 4.032 0.67 100.0 100.0
re-rendered 2026-11-03 † (breeze_v2_base_control) 3.61 2.63 0.91 4.034 0.00 100.0 100.0
Δ re-render − published +0.39 -0.05 +0.04 +0.002 -0.67 0.0 0.0

† The same v2.0 checkpoint (a720ea7f) rendered and scored again with the v3.0 rows' code, reference, settings and referees. The Δ row is the drift of the whole render-and-score chain between the two days, so the v3.0 base row compares with the † row as well as with the published one.

By diagnostic category (KDHO % and negation polarity accuracy)

Model long_affix (16) ↓ neg_imp (14) ↓ neg_pair (24) ↓ numbers (16) ↓ proper_foreign (12) ↓ questions (10) ↓ voice_commands (10) ↓ neg_pair acc % ↑ neg_imp acc % ↑
breeze_v2_gk_w050 7.29 0.00 2.08 2.75 5.85 7.50 3.33 100.0 100.0
breeze_v2_base 7.29 0.00 2.08 4.19 5.85 4.58 3.33 100.0 100.0
breeze_v3_gk_w050 10.42 0.00 2.34 2.75 5.85 2.50 4.17 100.0 100.0
edge_tts_ahmet 13.29 1.79 0.00 5.25 7.52 1.88 6.67 100.0 85.7
breeze_v3_base 14.58 1.79 2.08 4.68 5.85 4.38 3.33 100.0 85.7
piper_tr_dfki 13.29 1.43 0.35 6.47 6.13 1.88 3.33 100.0 85.7
breeze_v1_base 23.12 4.64 1.88 4.56 4.96 2.50 3.33 91.7 85.7
speecht5_tr 11.88 1.43 4.17 6.51 11.61 6.88 6.67 100.0 85.7
vits_openbible_tr 14.29 2.86 3.47 4.69 16.49 0.00 9.22 91.7 100.0
mms_tts_tur 22.98 7.50 3.39 5.72 15.02 4.38 17.58 100.0 71.4

long_affix prompts are a few very long words each, so a single affix slip moves that category's mean a lot.

Calibration against the card's published QC table. The card reports, per engine, the mean KDHO heard by Whisper large-v3-turbo over its 876 clips (774 mirror + 102 diagnostic). For a comparable column, our turbo-ear KDHO is re-weighted to the card's mix, (102 × diagnostic + 774 × mirror) / 876. The four engines measured on both sides land between −2.1 and +4.7 points from their published values (Δ column) because the texts differ, so gaps of that size between our rows and the card's rows are not meaningful.

Engine Published QC KDHO % (card, 876 clips) Card-mix QC KDHO % (here) As-run QC KDHO % (here, 150) large-v3 KDHO % (here) Δ card-mix − published Engine and voice
edge_tts_ahmet — 2.6 4.30 4.03 — Microsoft Edge-TTS tr-TR-AhmetNeural (cloud, not in the card)
breeze_v2_base — 4.6 4.52 3.22 — ours, v2.0
piper_tr_dfki (piper) 6.3 4.9 6.05 4.46 −1.4 Piper tr_TR-dfki-medium
breeze_v2_gk_w050 — 5.5 5.76 3.13 — ours, v2.0 + Gaddar Kerim LoRA (0.5×)
breeze_v1_base — 6.3 6.75 5.45 — ours, v1.0
vits_openbible_tr (vits_ob) 6.7 11.4 8.45 7.57 +4.7 VITS Open Bible Turkish, SPEAKER_00
speecht5_tr (speecht5) 10.8 10.5 9.39 6.96 −0.3 SpeechT5 Turkish, bundled speaker embedding
mms_tts_tur (mms) 11.5 9.4 10.57 9.22 −2.1 Meta MMS-TTS (tur)
xtts 7.5 — — — — Coqui XTTS-v2, 4 built-in voices in rotation
glowtts 14.9 — — — — Coqui Glow-TTS tr/common-voice + HiFi-GAN
f5_ob 18.1 — — — — F5-TTS Open Bible Turkish (132 of 876 clips bad)
chatterbox 19.4 — — — — Chatterbox Multilingual (Resemble AI), default voice
espeak 46.7 — — — — eSpeak NG (formant synthesis, robotic baseline)

Within that calibration error, Breeze v2.0 Base (4.6) and Gaddar Kerim (5.5) fall in the same range as the card's best open engines (Piper 6.3, VITS Open Bible 6.7, XTTS-v2 7.5); this comparison does not rank them. Running the card's own sentences would need access to the gated dataset.


1.3. FLEURS tr_tr zero-shot cloning of unseen speakers (100 pairs)

100 reference → target pairs from the google/fleurs tr_tr test split (revision 70bb2e84). Speakers were approximated by clustering WeSpeaker ResNet34 embeddings (average linkage, cosine ≥ 0.5). Each target sentence is cloned from the most similar recording of another sentence of the same gender, 3–8 s long, with pair cosine ≥ 0.72 (actual minimum 0.823, median 0.876): 4 clusters × 25 pairs, 37 distinct reference clips. Breeze requests send the reference clip with its FLEURS transcription as ref_text and the instruction "Speak in a natural, clear and articulate Turkish voice matching the reference speaker's timbre and pacing." Edge-TTS and MMS-TTS cannot clone (no-cloning floor); the human row scores the target recordings themselves (same-speaker ceiling). Whisper-large-v3 full band; Clean = CER ≤ 2% or WER = 0; Fail = CER > 30%. FLEURS is not in our v1.0/v2.0 CPT, DPO or LoRA data; the upstream BreezeBlue pretraining data is not disclosed.

Model n WER % ↓ CER % ↓ wav2vec2 CTC CER % ↓ Clean % ↑ Fail % ↓ Prem. EOS % ↓ Stutter % ↓ Dead air % ↓
FLEURS tr_tr human recordings (ground_truth_human) 100 5.14 1.21 4.20 81.00 0.00 0.00 0.00 3.00
Breeze-TTS-2-Turkish-Base v2.0 (breeze_v2_base) 100 6.26 2.41 3.66 83.00 1.00 3.00 0.00 7.00
Breeze-TTS-2-Gaddar-Kerim v2.0 (breeze_v2_gk_w050) 100 9.57 5.62 7.29 83.00 5.00 5.00 1.00 5.00
Breeze-TTS-2-Turkish-Base v3.0 (breeze_v3_base) 100 8.19 4.53 6.30 83.00 5.00 5.00 0.00 8.00
Breeze-TTS-2-Gaddar-Kerim v3.0 (breeze_v3_gk_w050) 100 5.98 2.35 3.64 85.00 2.00 2.00 0.00 9.00
Breeze-TTS-2-Turkish-Base v2.0, re-render ¹ (breeze_v2_base) 100 8.69 4.40 5.90 79.00 4.00 4.00 0.00 3.00
Breeze-TTS-2-Gaddar-Kerim v2.0, re-render ¹ (breeze_v2_gk_w050) 100 11.22 7.46 9.10 78.00 7.00 7.00 1.00 9.00
BreezeBlue upstream BreezeBlue/breeze-tts-2 ¹ (upstream_breeze_tts_2) 100 86.25 60.81 64.37 1.00 90.00 77.00 10.00 30.00
Microsoft Edge-TTS tr-TR-AhmetNeural, no cloning (edge_tts_ahmet) 100 5.38 1.33 2.05 84.00 0.00 0.00 0.00 0.00
Meta MMS-TTS facebook/mms-tts-tur, no cloning (mms_tts_tur) 100 10.24 2.45 5.09 60.00 0.00 0.00 1.00 0.00

¹ The 2026-11-03 cloud run: see the note under the Freya intelligibility table.

Model SIM ref (to the reference clip) ↑ SIM gt (to the target recording) ↑ SIM GK (to gk_clean_025.wav) UTMOS ↑
FLEURS tr_tr human recordings (ground_truth_human) 0.8751 — 0.0814 2.39
Breeze-TTS-2-Turkish-Base v2.0 (breeze_v2_base) 0.6474 0.6533 0.0961 3.36
Breeze-TTS-2-Gaddar-Kerim v2.0 (breeze_v2_gk_w050) 0.2021 0.2116 0.6131 3.56
Breeze-TTS-2-Turkish-Base v3.0 (breeze_v3_base) 0.6427 0.6521 0.0976 3.34
Breeze-TTS-2-Gaddar-Kerim v3.0 (breeze_v3_gk_w050) 0.2342 0.2470 0.6117 3.60
Breeze-TTS-2-Turkish-Base v2.0, re-render ¹ (breeze_v2_base) 0.6414 0.6478 0.0974 3.33
Breeze-TTS-2-Gaddar-Kerim v2.0, re-render ¹ (breeze_v2_gk_w050) 0.1993 0.2094 0.5983 3.52
BreezeBlue upstream BreezeBlue/breeze-tts-2 ¹ (upstream_breeze_tts_2) 0.5194 0.5003 0.0801 2.52
Microsoft Edge-TTS tr-TR-AhmetNeural, no cloning (edge_tts_ahmet) 0.1135 0.1247 0.2030 3.64
Meta MMS-TTS facebook/mms-tts-tur, no cloning (mms_tts_tur) 0.0713 0.0837 0.2901 3.56

¹ The 2026-11-03 cloud run: see the note under the Freya intelligibility table.


2. Internal v1.0 vs v2.0 vs v3.0 Ablation & Character LoRA Benchmark (216 Renders)

Local head-to-head (2026-11-02, one NVIDIA GeForce RTX 4090): v1.0 (2366d6b7) vs v2.0 (87cec98d), each as the zero-shot base and with the same Gaddar Kerim character LoRA recipe (300 steps on 40 film clips) merged at 0.5× (WiSE-FT). 18 prompts × seeds 42 and 7 = 36 renders per model through the production streaming API (breeze_infer.api, --fast-backbone-decode --fast-depth-decoder, cfg 1.0). Prompts: Turkish watch assistant (5), long agglutinative words (4), TR/EN code-switching (5: loanwords sent raw and through the production normalizer), studio vs film reference (4). Reference: a 5.8 s Gaddar Kerim film clip (one of the LoRA's training clips), or the 24 kHz studio kahya_klasik reference in the studio rows.

Scoring: Whisper-large-v3 CER/WER and loanword accuracy (tr_normalizer.asr_compare_form on both sides), wav2vec2-xls-r-300m-cv7-turkish CTC CER (greedy, no LM), WeSpeaker ResNet34 cosine to the conditioning reference (SIM ref) and to the 40-clip Gaddar Kerim centroid (SIM GK), blind SNR, spectral roll-off, pace; premature EOS = the last word missing from both ASR transcripts, stutter = an extra repeated word or syllable in both, dead air = a silence of 1.5 s or more inside a render.

Overall (36 renders per model)

Model CER ↓ Median CER ↓ Failed (CER > 0.3) ↓ WER ↓ CTC CER ↓ Loanword ↑ Min word p ↑ SIM ref ↑ SIM GK ↑ SNR dB Syll/s Premature EOS ↓ Stutter ↓ Dead air ↓ RTF ↓
v1.0_base 0.023 0.005 0.00 0.110 0.065 0.89 0.77 0.476 0.375 47.3 4.98 0.00 0.00 0.00 0.81
v2.0_base 0.070 0.020 0.08 0.174 0.100 0.86 0.75 0.682 0.586 45.2 4.64 0.08 0.00 0.08 0.80
v3.0_base 0.066 0.022 0.06 0.147 0.102 0.82 0.78 0.695 0.597 47.9 4.45 0.06 0.00 0.19 0.74
v1.0_gk_w050 0.088 0.023 0.08 0.193 0.135 0.87 0.72 0.706 0.666 44.1 4.57 0.08 0.00 0.06 0.81
v2.0_gk_w050 0.029 0.024 0.00 0.128 0.070 0.79 0.75 0.775 0.728 45.5 4.65 0.00 0.00 0.00 0.80
v3.0_gk_w050 0.036 0.010 0.03 0.111 0.081 0.86 0.76 0.766 0.723 46.2 4.54 0.03 0.00 0.06 0.75

The v3.0_base and v3.0_gk_w050 rows were rendered on 2026-11-03 with the same specs, seeds, references and judges on the same GPU; the v1.0 and v2.0 rows are the 2026-11-02 measurements, copied unchanged.

Failed = Whisper CER > 0.3: in this run, a stop after the first clause followed by seconds of silence, or babble that Whisper hallucinates over. These few renders drive the mean CER; see the median.

By category

Category Metric v1.0_base v2.0_base v1.0_gk_w050 v2.0_gk_w050 v3.0_base v3.0_gk_w050
tr_watch CER ↓ 0.015 0.081 0.146 0.014 0.144 0.017
tr_watch CTC CER ↓ 0.041 0.081 0.191 0.035 0.166 0.046
tr_watch SIM ref ↑ 0.431 0.655 0.670 0.768 0.662 0.759
tr_watch SIM GK ↑ 0.404 0.635 0.695 0.797 0.647 0.789
tr_watch Premature EOS ↓ 0.00 0.10 0.20 0.00 0.20 0.00
tr_watch Stutter ↓ 0.00 0.00 0.00 0.00 0.00 0.00
tr_watch Dead air ↓ 0.00 0.10 0.10 0.00 0.40 0.00
tr_agglutinative CER ↓ 0.020 0.127 0.016 0.011 0.011 0.010
tr_agglutinative CTC CER ↓ 0.029 0.135 0.036 0.022 0.023 0.024
tr_agglutinative SIM ref ↑ 0.417 0.689 0.728 0.768 0.693 0.749
tr_agglutinative SIM GK ↑ 0.386 0.672 0.762 0.793 0.672 0.785
tr_agglutinative Premature EOS ↓ 0.00 0.25 0.00 0.00 0.00 0.00
tr_agglutinative Stutter ↓ 0.00 0.00 0.00 0.00 0.00 0.00
tr_agglutinative Dead air ↓ 0.00 0.25 0.12 0.00 0.00 0.12
tr_en_codeswitch CER ↓ 0.039 0.054 0.058 0.063 0.064 0.051
tr_en_codeswitch CTC CER ↓ 0.126 0.117 0.133 0.131 0.130 0.119
tr_en_codeswitch Loanword ↑ 0.84 0.82 0.87 0.75 0.82 0.85
tr_en_codeswitch SIM ref ↑ 0.485 0.662 0.741 0.775 0.683 0.764
tr_en_codeswitch SIM GK ↑ 0.449 0.628 0.783 0.799 0.652 0.790
tr_en_codeswitch Premature EOS ↓ 0.00 0.00 0.00 0.00 0.00 0.00
tr_en_codeswitch Stutter ↓ 0.00 0.00 0.00 0.00 0.00 0.00
tr_en_codeswitch Dead air ↓ 0.00 0.00 0.00 0.00 0.30 0.00
studio_vs_vintage_ref CER ↓ 0.016 0.019 0.123 0.023 0.025 0.067
studio_vs_vintage_ref CTC CER ↓ 0.056 0.069 0.168 0.085 0.069 0.133
studio_vs_vintage_ref Loanword ↑ 0.96 0.92 0.88 0.83 0.83 0.88
studio_vs_vintage_ref SIM ref ↑ 0.581 0.732 0.686 0.789 0.751 0.797
studio_vs_vintage_ref SIM GK ↑ 0.233 0.384 0.388 0.487 0.390 0.495
studio_vs_vintage_ref Premature EOS ↓ 0.00 0.00 0.12 0.00 0.00 0.12
studio_vs_vintage_ref Stutter ↓ 0.00 0.00 0.00 0.00 0.00 0.00
studio_vs_vintage_ref Dead air ↓ 0.00 0.00 0.00 0.00 0.00 0.12

Two-sentence requests (A1, A3) vs single-sentence requests

Requests Metric v1.0_base v2.0_base v1.0_gk_w050 v2.0_gk_w050 v3.0_base v3.0_gk_w050
multi (4 renders) CER ↓ 0.037 0.057 0.259 0.034 0.212 0.043
multi (4 renders) Premature EOS ↓ 0.00 0.00 0.25 0.00 0.25 0.00
multi (4 renders) Longest silence s ↓ 0.64 0.71 0.71 0.73 2.26 0.80
multi (4 renders) Dead air ≥ 1.5 s ↓ 0.00 0.00 0.00 0.00 0.25 0.00
single (32 renders) CER ↓ 0.021 0.072 0.066 0.028 0.048 0.035
single (32 renders) Premature EOS ↓ 0.00 0.09 0.06 0.00 0.03 0.03
single (32 renders) Longest silence s ↓ 0.35 1.03 0.77 0.63 1.07 0.80
single (32 renders) Dead air ≥ 1.5 s ↓ 0.00 0.09 0.06 0.00 0.19 0.06

Studio 24 kHz reference (kahya_klasik) vs vintage Yeşilçam film reference (Gaddar Kerim), same 2 sentences

Model Reference Roll-off 85 % Hz Roll-off 95 % Hz SNR dB CER ↓ SIM ref ↑ SIM GK ↑
v1.0_base studio 472 920 51.9 0.023 0.808 0.152
v1.0_base vintage 656 1236 51.1 0.009 0.354 0.314
v2.0_base studio 439 885 50.5 0.032 0.836 0.163
v2.0_base vintage 718 1230 45.2 0.006 0.628 0.605
v1.0_gk_w050 studio 510 940 51.4 0.012 0.823 0.194
v1.0_gk_w050 vintage 630 2323 32.1 0.235 0.550 0.583
v2.0_gk_w050 studio 425 779 46.8 0.026 0.827 0.201
v2.0_gk_w050 vintage 636 1213 42.6 0.020 0.752 0.773
v3.0_base studio 451 911 64.2 0.034 0.829 0.143
v3.0_base vintage 703 1104 47.9 0.016 0.674 0.637
v3.0_gk_w050 studio 434 768 50.7 0.129 0.822 0.199
v3.0_gk_w050 vintage 633 1362 46.7 0.006 0.773 0.792

Head-to-head, v2.0 − v1.0 (negative Δ CER / EOS / stutter / RTF and positive Δ SIM favour v2.0)

Pair Scope Δ CER Δ CTC CER Δ Loanword Δ SIM ref Δ SIM GK Δ Premature EOS Δ Stutter Δ Dead air Δ RTF
v2.0_base − v1.0_base overall +0.047 +0.035 -0.03 +0.205 +0.211 +0.08 +0.00 +0.08 -0.00
v2.0_base − v1.0_base tr_watch +0.067 +0.040 n/a +0.224 +0.231 +0.10 +0.00 +0.10 +0.00
v2.0_base − v1.0_base tr_agglutinative +0.107 +0.106 n/a +0.272 +0.286 +0.25 +0.00 +0.25 -0.00
v2.0_base − v1.0_base tr_en_codeswitch +0.015 -0.009 -0.03 +0.177 +0.179 +0.00 +0.00 +0.00 -0.00
v2.0_base − v1.0_base studio_vs_vintage_ref +0.003 +0.013 -0.04 +0.151 +0.151 +0.00 +0.00 +0.00 -0.01
v2.0_base vs v1.0_base per-prompt CER: v2 better 3, tie 7, v1 better 8
v2.0_gk_w050 − v1.0_gk_w050 overall -0.059 -0.065 -0.08 +0.068 +0.062 -0.08 +0.00 -0.06 -0.01
v2.0_gk_w050 − v1.0_gk_w050 tr_watch -0.132 -0.156 n/a +0.097 +0.102 -0.20 +0.00 -0.10 -0.01
v2.0_gk_w050 − v1.0_gk_w050 tr_agglutinative -0.005 -0.014 n/a +0.041 +0.032 +0.00 +0.00 -0.12 -0.01
v2.0_gk_w050 − v1.0_gk_w050 tr_en_codeswitch +0.005 -0.002 -0.12 +0.034 +0.016 +0.00 +0.00 +0.00 -0.02
v2.0_gk_w050 − v1.0_gk_w050 studio_vs_vintage_ref -0.101 -0.083 -0.04 +0.103 +0.099 -0.12 +0.00 +0.00 -0.01
v2.0_gk_w050 vs v1.0_gk_w050 per-prompt CER: v2 better 9, tie 3, v1 better 6

Head-to-head, v3.0 − v2.0 (negative Δ CER / EOS / stutter / RTF and positive Δ SIM favour v3.0)

Pair Scope Δ CER Δ CTC CER Δ Loanword Δ SIM ref Δ SIM GK Δ Premature EOS Δ Stutter Δ Dead air Δ RTF
v3.0_base − v2.0_base overall -0.004 +0.002 -0.04 +0.013 +0.011 -0.03 +0.00 +0.11 -0.06
v3.0_base − v2.0_base tr_watch +0.062 +0.084 n/a +0.007 +0.012 +0.10 +0.00 +0.30 -0.06
v3.0_base − v2.0_base tr_agglutinative -0.116 -0.112 n/a +0.004 -0.001 -0.25 +0.00 -0.25 -0.05
v3.0_base − v2.0_base tr_en_codeswitch +0.011 +0.013 +0.00 +0.021 +0.025 +0.00 +0.00 +0.30 -0.07
v3.0_base − v2.0_base studio_vs_vintage_ref +0.006 -0.000 -0.08 +0.019 +0.006 +0.00 +0.00 +0.00 -0.07
v3.0_base vs v2.0_base per-prompt CER: v3 better 5, tie 6, v2 better 7
v3.0_gk_w050 − v2.0_gk_w050 overall +0.007 +0.011 +0.07 -0.008 -0.005 +0.03 +0.00 +0.06 -0.05
v3.0_gk_w050 − v2.0_gk_w050 tr_watch +0.003 +0.010 n/a -0.009 -0.008 +0.00 +0.00 +0.00 -0.05
v3.0_gk_w050 − v2.0_gk_w050 tr_agglutinative -0.002 +0.003 n/a -0.020 -0.009 +0.00 +0.00 +0.12 -0.05
v3.0_gk_w050 − v2.0_gk_w050 tr_en_codeswitch -0.012 -0.012 +0.10 -0.011 -0.009 +0.00 +0.00 +0.00 -0.04
v3.0_gk_w050 − v2.0_gk_w050 studio_vs_vintage_ref +0.044 +0.048 +0.04 +0.008 +0.009 +0.12 +0.00 +0.12 -0.05
v3.0_gk_w050 vs v2.0_gk_w050 per-prompt CER: v3 better 4, tie 10, v2 better 4

v3.0 GK does not match or beat v2.0 GK under the rule fixed on 2026-11-02 (new_matches_or_beats_old: false): CER 0.0361 against 0.029, SIM GK 0.7231 against 0.7278, over 36 renders each. One v3.0 GK render stops early (premature EOS) and drives the mean; the median CER and WER favour v3.0 GK.

v3.0 Architecture & Post-Training Upgrades

v3.0 keeps the v2.0 architecture (the BreezeBlue/breeze-tts-2 Dual-AR backbone and depth decoder, the frozen codec) and changes the training data and the post-training: the CPT corpus gains a stress drop-in and style captions, the merge is selected by a grid on held-out items, and on-policy DPO is trained on rollouts of the merged checkpoint.

Recipe as run

CPT. The v2.0 schedule (1,045 optimizer steps, 156 in Phase 1, global batch 64) re-run on the v3.0 corpus (40.0 h, 33,444 utterances, 4,352 speakers, 17 shards) on 2× NVIDIA H200, with the stress drop-in (--p-stress-all 0.2, --p-stress-ambiguous 0.5) and the style captions (--p-caption 0.3) applied on the fly; the CPT export keeps α = 1.0 (the WiSE-FT blend is the merge step's).

The merge grid (grid_search_report.json) evaluated 7 configurations on a 50-item held-out set (25 hard sentences + 25 FLEURS tr_tr pairs disjoint from the benchmark pairs): the CPT checkpoint, uniform WiSE-FT 0.85, the v2.0 recipe (WiSE-FT 0.85 on backbone + depth decoder, text encoder trained) and component-wise SLERP at α_fast 0.45 / 0.55 / 0.65 / 0.75 (text 0.95, slow_mid 0.85, slow_top 0.75). No SLERP point met the CER constraint (CER ≤ CPT CER + 0.2 pp = 1.91%); the selected configuration is the v2.0 recipe anchor (v2recipe_0.85; selected_from: anchor, constraint_met: false). The component-wise SLERP merge was evaluated and rejected by its own grid; v3.0 is not a SLERP merge.

Merge configuration Interpolation CER % ↓ WER % ↓ SIM ref ↑ UTMOS ↑ Prem. EOS % ↓
trained (CPT checkpoint) lerp α 1.0 1.71 4.52 0.6376 3.82 2.0
uniform_0.85 lerp α 0.85 on every blended group 2.41 4.22 0.6827 3.84 6.0
v2recipe_0.85 (selected) lerp α 0.85 on backbone + depth decoder, 1.0 elsewhere 1.46 3.57 0.6734 3.84 4.0
alpha_fast_0.45 slerp fast 0.45, text 0.95, slow_mid 0.85, slow_top 0.75 10.33 12.27 0.6620 3.25 18.0
alpha_fast_0.55 slerp fast 0.55, text 0.95, slow_mid 0.85, slow_top 0.75 5.35 7.16 0.6794 3.40 10.0
alpha_fast_0.65 slerp fast 0.65, text 0.95, slow_mid 0.85, slow_top 0.75 4.11 6.01 0.6765 3.65 14.0
alpha_fast_0.75 slerp fast 0.75, text 0.95, slow_mid 0.85, slow_top 0.75 3.05 5.41 0.6726 3.81 10.0

The merge written (merge_report.json): lerp α 0.85 on the 421 wise_ft tensors (backbone + depth decoder, 1,843.7 M parameters), α 1.0 (the CPT weights) on the other 344 blended tensors, the frozen codec_model tensors copied unchanged.

On-policy rollouts. 360 prompts × 8 rollouts (2,880 in total) sampled from the merged checkpoint at 8 temperatures from 0.7 to 1.0; pair gates: winner CER ≤ 2%, winner SIM ref ≥ 0.6, reward margin ≥ 0.2; 170 accepted pairs (0.47 per prompt).

On-policy DPO. 170 accepted pairs, β = 0.1, NLL weight 0.1, LoRA r = 16/32, 42 optimizer steps on the merged checkpoint (LoRA ranks: backbone / depth decoder; dpo_training_summary.json); the LoRA weights are folded into a standalone export without a further WiSE-FT, and that export is v3.0.

Phase B ran on 5 RunPod pods for USD 51.98 (account balance USD 100.54 → USD 48.56); the first 4 stopped before a v3.0 checkpoint existed.

Gaddar Kerim character LoRA v3. The v2.0 character recipe (300 steps on 40 film clips) re-run on the v3.0 base and merged into it at 0.5× (WiSE-FT, 281 LoRA modules folded in): breeze_v3_gk_w050 in the benchmark tables above.

Stress set: lexical-stress accuracy, plain vs stress-marked input (296 items)

Stress set model n paired Accuracy plain ↑ Accuracy marked ↑ Δ accuracy (95% CI) z gain (95% CI) Pair contrast plain ↑ Alignment failures % ↓
v3_base 296 0.4730 0.4764 +0.0034 [-0.0439, +0.0507] +0.0194 [-0.0811, +0.1136] 0.2500 0.0
v3_gk_w050 277 0.4113 0.4722 +0.0650 [+0.0072, +0.1264] +0.2115 [+0.0984, +0.3253] 0.2353 4.7
v2_base 295 0.4358 0.4373 +0.0000 [-0.0508, +0.0542] -0.0104 [-0.1101, +0.0868] 0.2027 0.0
upstream 225 0.4064 0.4862 +0.0889 [+0.0222, +0.1556] +0.1706 [+0.0083, +0.3346] 0.1947 15.2

Each row is one model's renders of the set. Δ and z gain are stress-marked − plain input within one model (the effect of the stress marks), with bootstrap intervals.

For v3_gk_w050 the TurkASR premature-EOS rule flags 20 of its 592 stress renders (3.38 %), against 0 of 592 for v3_base and 0 of 592 for v2_base. All 20 are silent (peak below 0.01), as are 2 more that the rule misses; those 22 clips fail alignment, so the row pairs 277 of the 296 items. Rendered again on the 17 flagged items (34 clips, same reference, seed and flags), the v3.0 GK blend is silent in 18 and the v2.0 GK blend in 0. Every stress row uses the studio kahya_klasik reference; the TurkASR-Bench-TTS rows condition both GK blends on gk_clean_025.wav, and there the premature-EOS rate is 0.67 % for v3.0 GK against 1.33 % for v2.0 GK.

Usage: with the v3.0 GK blend, clone from GK's own reference (gk_clean_025.wav); the studio reference produced 3.7 % silent clips in the stress set.

Speed (production fast path)

Speed run n RTF median ↓ RTF p90 ↓ TTFA ms median ↓ TTFA ms p90 ↓ VRAM GiB ↓ CER % ↓ UTMOS median ↑
prod_default_v3 (v3.0 weights) 36 0.389 0.443 283 405 10.05 4.18 4.17
prod_default_v2_rerun (v2.0 weights) 36 0.387 0.436 299 390 10.05 5.05 4.18
prod_v3 (v3.0 weights) 36 0.780 0.884 378 494 7.75 4.20 4.17
prod_v2_rerun (v2.0 weights) 36 0.767 0.852 364 463 7.75 5.12 4.17
prod_default_final (T5, v2.0 weights, earlier session) 36 0.409 0.482 327 513 10.05 5.07 4.18

The C3 rows (prod_default_v3, prod_default_v2_rerun, prod_v3, prod_v2_rerun) ran back to back in one session on 2026-11-03 with the same code, configs/fast.json, sentences, seeds and VRAM cap (11.0 GiB) on the shared local NVIDIA GeForce RTX 4090: the live TTS server :7860 stopped, the llama-server :8080 and the kahya bridge :8765 resident. prod runs the launcher's fast path (fast_backbone_decode, fast_depth_decoder) and prod_default the v3.0 default start, which adds fast_codec. prod_default_final is T5's headline measurement of the v3.0 code (an earlier session, on the v2.0 checkpoint).

Release gates

v3.0 fails the TurkASR-Bench-TTS KDHO, neg_imp, FLEURS SIM ref (against the published v2.0 value) and Freya/FLEURS premature-EOS release gates against v2.0. It is published on main by the author's decision after review of the full results above (Freya-TR-Eval and FLEURS, TurkASR-Bench-TTS, the stress set and speed), with v2.0 preserved at the tag v2.0 (commit b57cc736) and the same release also on the branch v3.0-rc. TurkASR-Bench-TTS KDHO is 4.35 % for v3.0 against 3.22 % for v2.0 (gate: ≤ v2.0) and 3.61 % for the v2.0 checkpoint re-rendered on the same day (†); neg_imp polarity accuracy is 85.71 % against 100.0 % (gate: 100 %), from one misheard imperative verb, not a negation flip. The TurkASR UTMOS (4.040 against 4.032, gate: within 0.05) and premature-EOS (0.00 % against 0.67 %, gate: ≤ v2.0) gates pass. Against the v2.0 re-render of the same cloud run, the Freya wer_8k gate passes (paired Δ +0.21 pp [-0.25, +0.74]; gate: the interval does not lie above 0), the FLEURS SIM ref gate passes against the re-render and fails against the published v2.0 value (0.6427 against 0.6414 and 0.6474; gate: ≥ v2.0), the UTMOS gate passes (Freya 4.0730 against 4.0745, Freya utmos_8k 3.7519 against 3.7473, FLEURS 3.3402 against 3.3279; gate: within 0.05) and the premature-EOS gate fails (Freya 0.20 % against 0.61 %, FLEURS 5.00 % against 4.00 %; gate: ≤ v2.0).

Bundled code

This release bundles the code it was published from, so the downloaded folder carries its own inference code: infer.py, breeze_infer/, models/ and configs/fast.json (forked from breezeblue-ai/breeze-tts commit 6eba901 and changed since; Apache-2.0, whose licence text is kept as LICENSE-CODE; LICENSE is the model licence), requirements.txt, and the train_tr/ scripts of the v2.0 and v3.0 pipelines. Stress marks (normalize_turkish_for_tts(text, annotate_stress=True)) need two things that are not bundled: the zeyrek package and the KDHO scorer's _zeyrek wrapper, vendored from yagmurtuncer/turkish-asr-leaderboard-kdho under train_tr/literature_benchmark_local/vendor/kdho_src/kdho/; the production API never sets annotate_stress.

Quickstart

This repository bundles both the model weights (model-*.safetensors, audio_tokenizer/) and the full Python inference and training codebase (infer.py, breeze_infer/ with the Turkish normalizer tr_normalizer.py, models/, configs/fast.json and train_tr/).

hf download ersanbil/Breeze-TTS-2-Turkish-Base --local-dir Breeze-TTS-2-Turkish-Base
# previous release v2.0: hf download ersanbil/Breeze-TTS-2-Turkish-Base --revision v2.0 --local-dir Breeze-TTS-2-Turkish-Base-v2.0
cd Breeze-TTS-2-Turkish-Base
python -m pip install -r requirements.txt

# Voice clone (reference audio + its exact transcript)
python infer.py . --ref-audio reference_tr.wav --ref-text "Referans kaydın birebir metni." \
  --text "Saat on dört otuzdaki Sprint Planning toplantısına on dakika kaldı, GitHub üzerindeki pull request'i mergeledim." --output clone.wav

# Voice design (natural-language description, no reference)
python infer.py . --instruction "Sıcak, sakin ve net konuşan genç bir kadın sesi." --cfg-scale 4 \
  --text "Merhaba, bugün size yeni projemizden bahsedeceğim." --output design.wav

# Voice direction (keep the reference identity, direct tone and pace)
python infer.py . --ref-audio reference_tr.wav --ref-text "Referans kaydın birebir metni." \
  --instruction "Yavaş, ciddi ve ölçülü bir tonla konuş." --cfg-scale 4 --text "Toplantı ertelendi." --output direction.wav

Streaming server (24 kHz mono s16le PCM over HTTP):

python -m breeze_infer.api . --host 0.0.0.0 --port 7860

# Clone
curl -X POST http://127.0.0.1:7860/v1/audio/speech -F "text=Toplantıya on dakika kaldı." \
  -F "ref_audio=@reference_tr.wav" -F "ref_text=Referans kaydın birebir metni." --output clone.pcm
# Design
curl -X POST http://127.0.0.1:7860/v1/audio/speech -F "text=Hoş geldiniz." -F "cfg_scale=4" \
  -F "instruction=Tok, sakin ve güven veren bir erkek sesi." --output design.pcm
# Direction (reference identity + instruction)
curl -X POST http://127.0.0.1:7860/v1/audio/speech -F "text=Kapıyı yavaşça kapat." -F "cfg_scale=4" \
  -F "instruction=Fısıltıyla ve gergin bir tonla konuş." \
  -F "ref_audio=@reference_tr.wav" -F "ref_text=Referans kaydın birebir metni." --output direction.pcm

Community guide: training a character voice LoRA

A character adapter (backbone r=16 + depth decoder r=32 + codebooks_head r=16 LoRA, the script defaults) trains on one RTX 4090 with the bundled train_tr/ suite included in this repository (train_tr/train_yesilcam_character_lora.py, train_tr/train_breeze_tr_fsdp.py, train_tr/train_breeze_tr_dpo.py, train_tr/verify_and_wiseft_stage_bc.py). T5Gemma 2, the projector and the audio embeddings stay frozen, so pronunciation and code-switching are kept. The Gaddar Kerim adapter took 29.7 min for 300 steps on 40 clips; the script's default is 400 steps.

  1. Collect a few minutes of clean single-speaker speech (Gaddar Kerim: 40 clips, 2.8 min in total, 1.7–12.3 s each; no music, one sentence per clip, exact verbalized transcripts).
  2. Encode the clips with the bundled audio_tokenizer/ into [T, 16] codes: either a shard directory with manifest.jsonl (utt_key, speaker_id, shard_file, ...) or a .pt file holding lists of {id, text, instruction, audio_codes, speaker_id, wav_path} records.
  3. Train (writes adapter_model.safetensors + adapter_config.json to checkpoints/character_loras/<name>; --save-merged also writes a merged checkpoint):
python train_tr/train_yesilcam_character_lora.py --base-tr-model Breeze-TTS-2-Turkish-Base \
  --data my_character.pt --speaker-id my_character --character-name my_character --max-steps 300
  1. Load it into the runtime. merge=True folds the adapter into the base weights; breeze_infer needs that when the adapter has a codebooks_head LoRA (the default), because its CUDA-graph depth decoder reads codebooks_head.weight directly. merge=False attaches or hot-swaps it as separate LoRA layers.
from pathlib import Path
from breeze_infer.runtime import load_runtime
from train_tr.train_yesilcam_character_lora import load_character_lora_adapter

tokenizer, model, audio_tokenizer = load_runtime(Path("Breeze-TTS-2-Turkish-Base"), device="cuda", attn_implementation="eager")
config = load_character_lora_adapter(model, "checkpoints/character_loras/my_character", merge=True)
print(config["reference_audio"], config["reference_text"])  # default reference clip for cloning

Then synthesize exactly as infer.py does (FastBreezeStreamingRuntime(model, audio_tokenizer, ...)).

License and responsible use

Derived from BreezeBlue/breeze-tts-2 and released under the BreezeBlue Research and Non-Commercial License (see LICENSE): research and non-commercial use only, and the same terms apply to fine-tunes and character adapters. Only clone or imitate voices you have the rights and consent to use, never to deceive or impersonate real people, and disclose synthetic speech.

v3.0 Release Notes (2026-11-03)

  • Release. v3.0 is published on main and on the branch v3.0-rc by the author's decision: it fails the TurkASR-Bench-TTS KDHO, neg_imp, FLEURS SIM ref (against the published v2.0 value) and Freya/FLEURS premature-EOS release gates (see Release gates above). v2.0 stays reachable at the tag v2.0.
  • Recipe. The CPT re-run with the stress drop-in and style captions, the v2.0-recipe WiSE-FT merge selected by the merge grid (the component-wise SLERP candidates were rejected by the same grid), and on-policy DPO on rollouts of the merge; the numbers are in v3.0 Architecture & Post-Training Upgrades.
  • Compute. Phase B ran on RunPod (4x NVIDIA H100 80GB HBM3 (ALL) and 2x NVIDIA H200 (SECURE) pods; the cost is in the recipe section). Of the four earlier pods, two failed during setup on dependency checks, one was stopped when the caption calibration hung, and one failed in the merge grid after training the CPT, which the fifth pod restored instead of retraining. The Freya-TR-Eval and FLEURS benchmark (the rows marked ¹) ran on 4 more RunPod pods for USD 11.32 (verified account balance after each teardown: USD 48.56 → 47.90 → 47.41 → 46.29 → 37.24); the last one ran the full benchmark on one NVIDIA H200.

v2.0 Continual Pretraining & Phase 3 Dual-AR DPO Release Notes

Corpus. 40.00 h, 33,445 utterances, 4,352 speakers in 17 shards. The v1.0 shards (7,481 utterances, 8.11 h) are reused byte-for-byte; v2.0 adds 25,964 utterances (31.89 h, 3,599 speakers), streamed on the pod: YODAS2-Sidon tr000 (sarulab-speech/yodas2_sidon, a Sidon-restored 24 kHz copy of espnet/yodas2, CC-BY-3.0; 22,617 utterances), Common Voice 17.0 tr (Hub mirror fsicoli/common_voice_17_0, CC0-1.0; 497 train, 1,645 dev and 757 test utterances), plus 448 edge-tts studio utterances: TR-EN code-switching (8 domains) and EN/ZH replay. audit_cpt_shards.py: PASSED, 30/30 checks.

Subset Utterances Speakers Hours
en_replay 321 14 0.36
natural_tr 32,484 4,322 38.91
tr_en_codeswitch 640 16 0.72

CPT (Phase 1 + 2). 4 GPU(s), ddp, 1,045 optimizer steps (156 in Phase 1), global batch 64, 33,445 training utterances, 0.47 h. Loss 14.4084 (step 1) → 10.5154 (step 1045; c0 0.9753, weighted c1..c15 3.8160).

WiSE-FT. α = 0.85 (W = 0.85 · W_trained + 0.15 · W_base): 421 backbone / depth-decoder tensors interpolated toward BreezeBlue/breeze-tts-2; 78 LoRA modules merged first.

Phase 3 Dual-AR DPO. 480 synthetic preference pairs: chosen = the ground-truth codes of a training utterance, rejected = the same codes with one injected failure (160 premature_eos: truncated to 60–75% of the frames; 160 stutter: 2–3 spans of 3–6 frames repeated; 160 formant_drift: codebooks 1–3 shifted on 35–50% of voiced frames), 320 pairs from natural_tr and 160 from tr_en_codeswitch. β = 0.1, LoRA r = 16/32, 200 steps, 8.5 min on one GPU. Mean of the last 5 logged steps: loss 0.6485, reward margin +0.0935, preference accuracy 100.0%.

These are training-time numbers. The measured v1.0 vs v2.0 evaluation is under Benchmarks above.

Model Card Metadata & Citation (Künye ve Atıf)

Field / Alan Details / Açıklama
Model Name ersanbil/Breeze-TTS-2-Turkish-Base (v3.0, also on branch v3.0-rc; v2.0 at tag v2.0)
Author / Geliştirici Ersan Bilik (@ersanbil)
Release Date / Tarih November 2026
Base Architecture BreezeBlue/breeze-tts-2 (Dual-AR, about 3.5 B parameters: T5Gemma 2 text encoder + Qwen3 slow-AR backbone + fast-AR depth decoder with 12 layers + Qwen3-TTS audio tokenizer with 16 codebooks at 12.5 Hz, 24 kHz)
Training Method Continual Pre-Training re-run on the v3.0 corpus (40.0 h, 33,444 utterances, 4,352 speakers) with the stress drop-in and style captions + Weight-Space Ensembling (WiSE-FT, α = 0.85 on backbone + depth decoder) + on-policy Dual-AR Direct Preference Optimization (DPO, 170 on-policy pairs, β = 0.1)
Supported Capabilities Turkish prosody and agglutinative morphology, TR-EN code-switching, zero-shot voice cloning (evaluated with 3–8 s references), natural-language voice design, voice direction, character LoRA adaptation (Gaddar Kerim: 300 steps, 29.7 min on 1× RTX 4090)
License BreezeBlue Research and Non-Commercial License

BibTeX (Model Citation / Model Atıf Künyesi)

If you use Breeze-TTS-2-Turkish-Base or our two-phase continual pre-training + WiSE-FT + Dual-AR DPO methodology in your research or evaluation benchmarks, please cite:

@misc{bilik2026breezetts2trv3,
  title        = {Breeze-TTS-2-Turkish-Base v3.0: Continual Pre-Training with a Stress Drop-In and Style Captions, Weight-Space Ensembling, and On-Policy Dual-AR Direct Preference Optimization for Turkish Speech Synthesis},
  author       = {Bilik, Ersan},
  year         = {2026},
  month        = {November},
  publisher    = {Hugging Face},
  version      = {v3.0},
  howpublished = {\url{https://huggingface.co/ersanbil/Breeze-TTS-2-Turkish-Base}},
  note         = {Hub tag v3.0 marks the release commit. Derived from BreezeBlue/breeze-tts-2 (Dual-AR TTS, about 3.5B parameters)}
}

@misc{bilik2026breezetts2tr,
  title        = {Breeze-TTS-2-Turkish-Base v2.0: Continual Pre-Training, Weight-Space Ensembling, and Dual-AR Direct Preference Optimization for Morphologically Rich Turkish Speech Synthesis},
  author       = {Bilik, Ersan},
  year         = {2026},
  month        = {November},
  publisher    = {Hugging Face},
  howpublished = {\url{https://huggingface.co/ersanbil/Breeze-TTS-2-Turkish-Base}},
  note         = {Derived from BreezeBlue/breeze-tts-2 (Dual-AR TTS, about 3.5B parameters)}
}

Literature & Benchmark References (Literatür ve Benchmark Kaynakçası)

The evaluations, metrics, and comparative baselines reported in this model card build upon the following open-source benchmarks, toolkits, and foundational papers. Author lists, titles and years follow the arXiv record; the published version is given after it.

  1. Base model: Breeze TTS 2:
  2. FreyaTTS & Freya-TR-Eval:
    • Pamuk, A. E., Yentür, Ö., Bayrak, A. T., Öztürk, Y. A. S., & Yavuz, M. (2026). FreyaTTS: A Compact Tokenizer-Free Flow-Matching Transformer for Turkish-First Speech Synthesis. arXiv:2607.09530. Dataset: freyavoice/freya-tr-eval.
  3. TurkASR-Bench, TurkASR-Bench-TTS & KDHO (Turkish Root- and Affix-Aware Error Rate):
  4. Google FLEURS (tr_tr):
    • Conneau, A., Ma, M., Khanuja, S., Zhang, Y., Axelrod, V., Dalmia, S., Riesa, J., Rivera, C., & Bapna, A. (2022). FLEURS: Few-shot Learning Evaluation of Universal Representations of Speech. arXiv:2205.12446. Published in 2022 IEEE Spoken Language Technology Workshop (SLT), pp. 798–805, doi:10.1109/SLT54892.2023.10023141.
  5. Coqui XTTS-v2 (Multilingual Zero-Shot Baseline):
    • Casanova, E., Davis, K., Gölge, E., Göknar, G., Gulea, I., Hart, L., Aljafari, A., Meyer, J., Morais, R., Olayemi, S., & Weber, J. (2024). XTTS: a Massively Multilingual Zero-Shot Text-to-Speech Model. arXiv:2406.04904. Published in Interspeech 2024, pp. 4978–4982, doi:10.21437/Interspeech.2024-2016.
  6. Meta MMS-TTS (facebook/mms-tts-tur):
    • Pratap, V., Tjandra, A., Shi, B., Tomasello, P., Babu, A., Kundu, S., Elkahky, A., Ni, Z., Vyas, A., Fazel-Zarandi, M., Baevski, A., Adi, Y., Zhang, X., Hsu, W.-N., Conneau, A., & Auli, M. (2023). Scaling Speech Technology to 1,000+ Languages. arXiv:2305.13516. Published in Journal of Machine Learning Research 25(97):1–52, 2024, jmlr.org/papers/v25/23-1318.
  7. F5-TTS (Flow-Matching Baseline):
    • Chen, Y., Niu, Z., Ma, Z., Deng, K., Wang, C., Zhao, J., Yu, K., & Chen, X. (2024). F5-TTS: A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching. arXiv:2410.06885. Published in Proceedings of the 63rd Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers), 2025, pp. 6255–6271, doi:10.18653/v1/2025.acl-long.313.
  8. WiSE-FT (Weight-Space Ensembles for Fine-Tuning):
    • Wortsman, M., Ilharco, G., Kim, J. W., Li, M., Kornblith, S., Roelofs, R., Gontijo-Lopes, R., Hajishirzi, H., Farhadi, A., Namkoong, H., & Schmidt, L. (2021). Robust fine-tuning of zero-shot models. arXiv:2109.01903. Published in Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2022, pp. 7959–7971 (CVF open access).
  9. DPO (Direct Preference Optimization):
    • Rafailov, R., Sharma, A., Mitchell, E., Ermon, S., Manning, C. D., & Finn, C. (2023). Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290. Published in Advances in Neural Information Processing Systems 36 (NeurIPS 2023), pp. 53728–53741, doi:10.52202/075280-2338 (the proceedings list Manning before Ermon).
  10. UTMOS (Automatic Neural MOS Naturalness Predictor):
    • Saeki, T., Xin, D., Nakata, W., Koriyama, T., Takamichi, S., & Saruwatari, H. (2022). UTMOS: UTokyo-SaruLab System for VoiceMOS Challenge 2022. arXiv:2204.02152. Published in Interspeech 2022, pp. 4521–4525, doi:10.21437/Interspeech.2022-439.
  11. WeSpeaker (Speaker Verification & Embedding Toolkit):
    • Wang, H., Liang, C., Wang, S., Chen, Z., Zhang, B., Xiang, X., Deng, Y., & Qian, Y. (2022). Wespeaker: A Research and Production oriented Speaker Embedding Learning Toolkit. arXiv:2210.17016. Published in ICASSP 2023, pp. 1–5, doi:10.1109/ICASSP49357.2023.10096626.
  12. Mozilla Common Voice Corpus:
    • Ardila, R., Branson, M., Davis, K., Henretty, M., Kohler, M., Meyer, J., Morais, R., Saunders, L., Tyers, F. M., & Weber, G. (2019). Common Voice: A Massively-Multilingual Speech Corpus. arXiv:1912.06670. Published in Proceedings of the Twelfth Language Resources and Evaluation Conference (LREC 2020), pp. 4218–4222, ACL Anthology 2020.lrec-1.520.
@misc{turkasrbench2026,
  title  = {TurkASR-Bench and KDHO: A Balanced Turkish ASR Benchmark with a Root- and Affix-Aware Error Rate},
  author = {Tuncer, Nur Yağmur},
  year   = {2026},
  url    = {https://huggingface.co/datasets/yagmurtuncer/turkasr-bench}
}

@misc{pamuk2026freyattscompacttokenizerfreeflowmatching,
      title={FreyaTTS: A Compact Tokenizer-Free Flow-Matching Transformer for Turkish-First Speech Synthesis}, 
      author={Ahmet Erdem Pamuk and Ömer Yentür and Ahmet Tunga Bayrak and Yavuz Alp Sencer Öztürk and Mustafa Yavuz},
      year={2026},
      eprint={2607.09530},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2607.09530}, 
}

@inproceedings{conneau2022fleurs,
  title         = {FLEURS: Few-shot Learning Evaluation of Universal Representations of Speech},
  author        = {Conneau, Alexis and Ma, Min and Khanuja, Simran and Zhang, Yu and Axelrod, Vera and Dalmia, Siddharth and Riesa, Jason and Rivera, Clara and Bapna, Ankur},
  booktitle     = {2022 IEEE Spoken Language Technology Workshop (SLT)},
  pages         = {798--805},
  year          = {2022},
  doi           = {10.1109/SLT54892.2023.10023141},
  eprint        = {2205.12446},
  archivePrefix = {arXiv}
}

@inproceedings{casanova2024xtts,
  title         = {XTTS: a Massively Multilingual Zero-Shot Text-to-Speech Model},
  author        = {Casanova, Edresson and Davis, Kelly and G{\"o}lge, Eren and G{\"o}knar, G{\"o}rkem and Gulea, Iulian and Hart, Logan and Aljafari, Aya and Meyer, Joshua and Morais, Reuben and Olayemi, Samuel and Weber, Julian},
  booktitle     = {Interspeech 2024},
  pages         = {4978--4982},
  year          = {2024},
  doi           = {10.21437/Interspeech.2024-2016},
  eprint        = {2406.04904},
  archivePrefix = {arXiv}
}

@article{pratap2024scaling,
  title         = {Scaling Speech Technology to 1,000+ Languages},
  author        = {Pratap, Vineel and Tjandra, Andros and Shi, Bowen and Tomasello, Paden and Babu, Arun and Kundu, Sayani and Elkahky, Ali and Ni, Zhaoheng and Vyas, Apoorv and Fazel-Zarandi, Maryam and Baevski, Alexei and Adi, Yossi and Zhang, Xiaohui and Hsu, Wei-Ning and Conneau, Alexis and Auli, Michael},
  journal       = {Journal of Machine Learning Research},
  volume        = {25},
  number        = {97},
  pages         = {1--52},
  year          = {2024},
  url           = {https://jmlr.org/papers/v25/23-1318.html},
  eprint        = {2305.13516},
  archivePrefix = {arXiv}
}
Downloads last month
84
Safetensors
Model size
3B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Datasets used to train ersanbil/Breeze-TTS-2-Turkish-Base

Papers for ersanbil/Breeze-TTS-2-Turkish-Base

Evaluation results