English · Türkçe
Open Turkish speech tools: Ahenk (large model, GPU), Ahenk Cep (8.6M-parameter small model, CPU), trnorm (Turkish text normalisation) and the TR-Zor / TR-Soru test sets.
Synthetic voice. Ahenk and Ahenk Cep speak in one designed voice (f022); it is not a real person's voice or recording. Say that it is AI-generated when you share what you make (EU AI Act Art. 50).
Try it in your browser · Ahenk Okur: listen to documents · Ahenk model card · Ahenk Cep model card
GitHub does not play audio in the page: the links open the WAV files on Hugging Face. The model cards have the same samples with players. You can try Ahenk Cep in your browser, no install: ozguradmin.github.io/ahenk-turkish-tts.
| What it shows | Text (as written) | Model | Audio |
|---|---|---|---|
| Laughing | Hahaha, bu fıkrayı daha önce hiç duymamıştım! | Ahenk | WAV |
| Cheerful | Harika haber! Sınavı geçtim, akşam hep birlikte kutlayalım! | Ahenk | WAV |
| Calm | Derin bir nefes alın, her şeyi adım adım birlikte halledeceğiz. | Ahenk | WAV |
| Plain reading | Eskişehir'den İzmir'e otobüsle gittik. | Ahenk | WAV |
| Money (trnorm: "doksan dokuz lira doksan dokuz kuruşa") | İndirimle 99,99 TL'ye düştü. | Ahenk | WAV |
| Question pair, the statement first | Cihazın garanti süresi 2 yıl. | Ahenk | WAV |
| Question pair, the same sentence with "mı?" | Cihazın garanti süresi 2 yıl mı? | Ahenk | WAV |
| Long sentence, not in training (12 s) | Karşılaştırma isteyenlere eski ve yeni paketi yan yana anlatırız; farkı müşteri kendisi görür. Akşam olduğunda … | Ahenk | WAV |
| Angry | Yeter artık! Üç gündür aynı sorun için arıyorum ve hâlâ kimse ilgilenmedi! | Ahenk | WAV |
| The same long sentence | Karşılaştırma isteyenlere eski ve yeni paketi yan yana anlatırız; … | Ahenk Cep | WAV |
How they were picked: the plain, money, laughing and emotion clips were chosen by the listener in blind listening. The question pair and the long sentence were chosen by automatic scores (word-perfect, highest UTMOS). All are existing evaluation clips, not rendered again.
| Component | What it does | Size, hardware | Licence |
|---|---|---|---|
| Ahenk | Turkish LoRA for VoxCPM2: question intonation, 6 emotions and laughter, Turkish or English instructions. Recipe: tts/voxcpm |
2B + 36M LoRA, GPU | weights CC BY 4.0 |
| Ahenk Cep | Small student model that learned from Ahenk's voice (EMA Lightning architecture). Code: tts/small |
8.6M, 34 MB, RTF ~0.2 on CPU | weights CC BY 4.0 |
| Ahenk Okur | Reads PDF, Word, EPUB, plain text and photos (with OCR) aloud in the browser with Ahenk Cep. Book-length documents are made piece by piece and can be heard while they are being made; the work resumes after the tab is closed; the result downloads as MP3 or WAV. Code: ahenk-cep-pdfreader | browser, on the device | Apache-2.0 |
trnorm |
Turns written Turkish into its spoken form: numbers, dates, times, money, percentages, abbreviations, phone numbers; suffixes follow the spoken form. No dependencies. | pure Python | Apache-2.0 |
trnorm-js |
trnorm for the browser and Node; the same output as Python (npm install @ozgurguler/trnorm) |
pure JavaScript | Apache-2.0 |
trtts |
EMA Lightning + trnorm: a ready Turkish TTS that runs on CPU | 8.6M, CPU | Apache-2.0 |
benchmarks/tts |
TR-Zor (155 hard sentences, 13 categories), TR-Soru (35 rows of question intonation) and a harness that reads the audio back with ASR | Apache-2.0 | |
benchmarks/asr |
Turkish ASR comparison on FLEURS-TR and MediaSpeech-TR (table) | CPU | Apache-2.0 |
The browser demo and Ahenk Okur process text with trnorm-js. It gave the same result as the Python version on 742,716 checks, so the browser no longer has to download Python: the first visit fell from 27 MB to 21.4 MB and the page is ready about twice as fast. The Python version stays as a fallback.
Ahenk Cep, on a CPU:
pip install torch ema-lightning==1.1.2 "git+https://github.com/ozguradmin/ahenk-turkish-tts"import sys
import soundfile as sf
from huggingface_hub import snapshot_download
d = snapshot_download("ozgurguler/ahenk-cep-tr", allow_patterns=["*.pt", "ahenk_cep.py"])
sys.path.insert(0, d)
from ahenk_cep import AhenkCep
tts = AhenkCep(f"{d}/student.pt", f"{d}/decoder.pt")
audio, sr = tts.say("Randevunuz 14.10.2026 saat 09:30'da; ücret 1.250 TL.")
sf.write("randevu.wav", audio, sr)Setup and emotions for Ahenk (GPU, VoxCPM2) are in its model card. Text normalisation only:
trnorm "Saat 09:30'da 3. kata gelin, ücret 1.250,50 TL."
# Saat dokuz otuzda üçüncü kata gelin, ücret bin iki yüz elli lira elli kuruş.trnorm's rules and examples: docs/TRNORM.md.
TR-Zor: 155 hard sentences. Held-out: 20 long sentences (12-19 s) of the Antalia dataset, not in the training data of
any of our models. Judge: faster-whisper large-v3-turbo; reference and output normalised with
trnorm.normalize_for_eval. WER %, lower is better; in brackets, the number of sentences without a single word
error. UTMOS22 predicts naturalness (1-5, higher is better).
| Model | Size | TR-Zor WER | Held-out WER | UTMOS TR-Zor / held-out |
|---|---|---|---|---|
| Ahenk | 2B + LoRA | 2.54 (141/155) | 0.82 (16/20) | 3.70 / 3.14 |
| Trendyol-TTS | 2B + LoRA | 3.98 (134/155) | 0.68 (16/20) | 3.82 / 3.73 |
| Ahenk Cep | 8.6M | 2.32 (144/155) | 0.95 (17/20) | 3.44 / 3.18 |
| EMA Lightning + trnorm | 8.6M | 2.43 (145/155) | 1.49 (16/20) | 3.36 / 2.95 |
| Antalia-2 Mini | 7.6M | 3.30 (140/155) | 1.22 (16/20) | 3.23 / 2.94 |
- Ahenk and Trendyol-TTS were measured on an A100, the small models on a laptop GPU, with the same judge. Scored again on the second setup, Ahenk's clips came out the same within 0.01.
- Where we lose: Trendyol-TTS is ahead on predicted naturalness, most on long sentences (3.73 vs 3.14); it has a lower WER on the held-out sentences (0.68 vs 0.82) and is faster (RTF 1.37 vs 2.28 on an A100). Trendyol speaks in its own voice; part of the difference may come from the voice. On CPU, Ahenk Cep is slower than EMA and Antalia (RTF 0.20 vs 0.13 and 0.08 on 2 threads).
- trnorm's effect: EMA Lightning's TR-Zor error is 14.0 % with its own front-end and 1.9 % with trnorm (this row was measured on CPU with an int8 judge, do not compare it directly with the table above; details).
- These are automatic metrics. No MOS study was done.
Blind listening. All done with one native listener (the project owner), choosing the best clip for each sentence; it is a signal, not a statistical result.
- 10 sentences, four systems in random order, equal loudness: Ahenk 8, Ahenk Cep 2 (both questions), EMA Lightning 0, Antalia-2 Mini 0.
- Language of the emotion instruction, 20 decisions: for pure emotion the English instruction 6/6; for sentences with
a word starting with "c" in their first two words, the Turkish instruction 10/10.
instruction_pickin Ahenk works from this result.
- Questions that should rise at the end do not: questions without "mı", such as "Yarın geliyorsun?", end like a statement, in both models. Questions built with "mı" are right.
- "c" after an English instruction: in Ahenk a leading "c" may be read like /k/, /s/ or /z/ ("Cam" → "Kam").
instruction_pickswitches to a Turkish instruction; if needed, useprefer="tr". - "Phone-like" timbre: in some of Ahenk's emotional clips the voice is bright and crackly (7 of 20 clips in a probe with English instructions). Try another seed.
- Breath in pauses: stays in Ahenk;
pause_cleanin the package turns it down. - Ahenk Cep's styles are weak: "sad" is only 1.9 semitones lower and 8 % slower; no laughter. Not yet distilled for phone speed.
- Ahenk needs a GPU: RTF 2.28 at 16 steps on an A100, slower than real time.
- One voice, Turkish only. trnorm leaves foreign names that are not in its lexicon as written.
- Do not present generated speech as a real human recording; say that it is synthetic and, if you can, add a machine-readable mark (EU AI Act Art. 50). The models have no watermark; AudioSeal can be added.
- Do not impersonate anyone. VoxCPM2 can clone voices; do not clone anyone's voice without their consent.
- Do not present generated anger, sadness or warmth as a real person's reaction to put pressure on a listener.
- Do not use it for fraud, social engineering or robocalls.
- Code, docs, the TR-Zor and TR-Soru sets: Apache-2.0. Third-party reference texts in the repo come with their own licences: NOTICE.
- Ahenk and Ahenk Cep weights are CC BY 4.0. Credit is required when you use or redistribute them. Write: "Ahenk (https://github.com/ozguradmin/ahenk-turkish-tts), CC BY 4.0". Also keep the data attributions from the model cards: Alania Turkish Synthetic Speech by PatientDesk AI and Alania Turkish Domain Text by PatientDesk AI (CC BY 4.0).
- Base models: VoxCPM2 (OpenBMB) and EMA Lightning, both Apache-2.0.
- Academic citation: CITATION.cff.
- Not required, but if you use this in a project, we would be glad of a link back or a quick note (destek@ozgurguler.tech).
- Make Ahenk Cep run in real time on phones (few-step distillation)
- More teacher data for the small model, stronger emotions and question intonation
- A demo page that runs in the browser
- A small, commercially usable Turkish speech-recognition (STT) model
| Folder | Contents |
|---|---|
src/trnorm, src/trtts |
text normalisation, EMA Lightning + trnorm |
tts/voxcpm |
Ahenk training and evaluation recipe, instruction_pick, pause_clean, model card |
tts/small |
Ahenk Cep training, inference code (ahenk_cep.py), model card |
benchmarks |
TR-Zor, TR-Soru, the ASR comparison and results |
spaces |
Hugging Face demo apps |
docs |
working notes |
Contributing: open an issue; sentences that trnorm reads wrong help most (input, expected reading, the output you
got). python -m pytest -q must pass.
Contact: destek@ozgurguler.tech