yazgı-tts-1
A Turkish text-to-speech model with 8 built-in voices that speaks clean, accurate and natural Turkish. It reads numbers, prices, dates, codes and addresses correctly, and runs about 6x faster than real time on a laptop CPU. On Freya-TR-Eval it is one of the most accurate and natural open Turkish models.
Samples
| Voice | Text | Audio |
|---|---|---|
male-01 |
Siparişiniz 14 Ekim'de saat 15:30'da kargoya verildi. Tahmini teslimat tarihi 16 Ekim Perşembe. | |
female-01 |
Sepetinizdeki ürünlerin toplamı 1.299,90 TL. Üç taksit seçerseniz aylık ödemeniz 433,30 TL olacak. | |
male-02 |
Siparişinizdeki 3 ürünün hepsi stokta. Yarın sabah kargoya verilecek ve size kısa bir mesaj göndereceğiz. | |
female-04 |
Teslimat adresiniz Atatürk Caddesi No: 12, Daire 5, Kadıköy, İstanbul olarak kaydedildi. | |
male-03 |
Bugün İstanbul'da hava parçalı bulutlu, sıcaklık 18 derece civarında. Akşam saatlerinde kuzeyden esen rüzgârın hızlanması ve gece boyunca hafif yağmur bekleniyor. Yarın ise güneşli bir gün bizi bekliyor. | |
female-02 |
Kapadokya'ya ilk kez gidenler genellikle sabahın erken saatlerinde balonları izlemek için uyanır. Gün ağarırken yüzlerce renkli balon vadinin üzerinde yavaşça yükselir. Öğleden sonra yeraltı şehirlerini gezmek, akşam da yöresel bir lokantada testi kebabı yemek bu yolculuğun vazgeçilmezlerindendir. |
Benchmarks
Freya-TR-Eval (495 sentences), scored with the Freya-TR-Eval re-run by PatientDesk AI: 3 seeded takes per system, faster-whisper large-v3 on audio band-limited to 8 kHz, corpus WER per take. Naturalness is UTMOS22, out of 5.
| System | Params | WER % ↓ | CER % ↓ | Clean sentences ↑ | UTMOS ↑ |
|---|---|---|---|---|---|
| yazgı-tts-1, male-01 (best voice) | 81M | 0.90 ± 0.12 | 0.17 | 95.1% | 4.01 |
| EMA Lightning¹ | 8.6M | 0.92 ± 0.13 | 0.18 | - | 3.30 |
| Antalia-2 Mini 1.0.1² | 7.6M | 1.02 | 0.21 | - | 3.18 |
| yazgı-tts-1, female-01 | 81M | 1.06 ± 0.25 | 0.20 | 93.9% | 3.98 |
| Alania-2 (API, best voice) | 488M | 1.15 ± 0.22 | 0.22 | 93.0% | 3.52 |
| Trendyol-TTS | 2.38B | 1.16 ± 0.16 | 0.23 | 93.1% | 3.82 |
| Gemini 3.8 Flash TTS | - | 1.23 ± 0.10 | 0.29 | 92.9% | 3.53 |
| Gemini 3.8 Flash-Lite TTS | - | 1.34 ± 0.19 | 0.27 | 91.9% | 3.63 |
| Anka TTS | 336M | 1.42 ± 0.06 | 0.30 | 91.6% | 3.52 |
¹ From the EMA Lightning model card.
² From the Antalia-2 Mini model card.
Other rows are from the Freya-TR-Eval re-run.
Speed: real-time factor 0.17 on a laptop CPU (Apple M5, 4 threads), about 6x faster than real time. With streaming, the first audio is ready after 0.27 s on the same CPU.
Quick start
pip install "yazgi-tts[hub] @ https://huggingface.co/erkamk/yazgi-tts-1/resolve/main/dist/yazgi_tts-0.1.0-py3-none-any.whl"
python -m yazgi_tts "Siparişiniz 14 Ekim'de saat 15:30'da kargoya verildi." -o out.wav --voice male-01
from yazgi_tts import YazgiTTS, RATE
import soundfile as sf
tts = YazgiTTS()
audio = tts.say("Toplam tutar 1.299,90 TL.", voice="female-01")
sf.write("out.wav", audio, RATE)
# optional: your own readings for names the front end reads wrongly
tts = YazgiTTS(pronunciations={"Xiaomi": "şaomi"})
# streaming: play audio while the rest is still being made
for chunk in tts.stream("Merhaba! Siparişiniz hazırlanıyor.", voice="male-01"):
... # each chunk is 24 kHz float32 audio
HTTP API: python -m yazgi_tts.serve --port 8000, then POST /tts {"text": "...", "voice": "male-01"} for a WAV file,
or POST /tts/stream with the same body for raw 16-bit PCM at 24 kHz, sent while it is made.
| Voice | Description |
|---|---|
male-01 (default) |
thirties, deep, warm, narrator |
male-02 |
young adult, medium pitch, gentle, slow |
male-03 |
fifties, medium pitch, soft, news presenter |
male-04 |
thirties, low, soft |
female-01 |
young adult, high, bright, receptionist |
female-02 |
sixties, low, strong, calm |
female-03 |
sixties, medium pitch, bright, confident |
female-04 |
young adult, high, clear, relaxed |
Model details
- Codec: 24 kHz audio as 12.5 frames per second, each frame 16 codes from 2,048 (2.2 kbps). Decoder 25M; the 72M encoder is only needed to clone a new voice.
- TTS model (56M): an autoregressive talker writes the first code of each frame; a small code predictor fills the other 15. The voice comes from a short reference and a speaker embedding.
- Text front end: normalizer-tr 0.7.0 plus our rules for initialisms, codes and units. Long text is split into whole sentences (up to 300 characters) and decoded in one pass.
- 81M parameters for speech in total.
Training
- Codec: 559k steps on Alania and about 600 h of real Turkish speech.
- Supervised training: about 120k steps on 2,485 h of Alania (1.65M clips, 2,706 voices).
- Speaker-embedding fine-tune: 15k steps.
- Reinforcement learning (GRPO): 125 steps, rewarding reading accuracy, voice similarity and naturalness.
Data and licenses
| Source | Kind | License | Hours | Used for |
|---|---|---|---|---|
| Alania synthetic speech, CC BY subset | synthetic, ~2,700 voices | CC BY 4.0 | 2,485 (TTS), 1,150-1,860 (codec) | TTS, codec |
YODAS2 Turkish (tr000) |
real, YouTube | CC BY 3.0 (per video) | 500+ | codec |
| Common Voice 21.0 Turkish | real, crowd-recorded | CC0 1.0 | ~75 | codec |
| MediaSpeech Turkish | real, broadcast | CC BY 4.0 | 10 | codec |
| FLEURS Turkish (train) | real, read speech | CC BY 4.0 | 8.3 | codec |
Held out of all training: FLEURS dev and test, 1 in 40 Common Voice speakers, and Freya-TR-Eval.
Limitations
- Little emotion. It reads clearly and calmly but does not show emotion such as excitement or sympathy.
- Voice cloning is weak.
tts.clone()builds a voice from 3-6 s of speech, but it only sounds close for voices like the built-in ones (similarity about 0.27 on real speakers). Use the built-in voices. - Turkish only. Foreign names, brand names and words are read with Turkish letter sounds; pass
pronunciationsto fix the ones you need.
Attribution
| Resource | By | License | Used for |
|---|---|---|---|
| Alania Synthetic Speech TR | cloud0day3 | CC BY 4.0 | TTS and codec training |
| YODAS2 | ESPnet (Li et al., 2023); each video by its uploader | CC BY 3.0 | Codec training |
| Common Voice 21.0 | Mozilla Foundation (Ardila et al., 2020) | CC0 1.0 | Codec training |
| MediaSpeech | Kolobov et al., 2021 | CC BY 4.0 | Codec training |
| FLEURS | Google (Conneau et al., 2022) | CC BY 4.0 | Codec training |
| normalizer-tr | its authors | Apache-2.0 | Text front end |
| spkrec-resnet-voxceleb | SpeechBrain | Apache-2.0 | Speaker embeddings |
| Freya-TR-Eval | Freya | CC BY 4.0 | Evaluation |
| Freya-TR-Eval re-run | PatientDesk AI | Apache-2.0 | Evaluation harness |
YODAS2 videos are licensed by their uploaders; the video ids are listed in ATTRIBUTION.md. Alania's speech was generated with VoxCPM2, and part of its text comes from FineWeb-2 (ODC-By 1.0).
License
Apache-2.0 for the code and the weights; see LICENSE. Credits for the training data are in NOTICE and ATTRIBUTION.md.
- Downloads last month
- 57
