Antalia-2 Mini

Türkçe özet. Antalia-2 Mini, tek sesli, küçük bir Türkçe metinden konuşmaya (TTS) modelidir: toplam 7,6 milyon parametre, 48 kHz çıkış, sıradan bir işlemcide gerçek zamandan çok daha hızlı. Ham metni alır; sayıları, tarihleri, saatleri, tutarları, kısaltmaları ve metindeki İngilizce ya da marka adlarını kendi normalleştiricisiyle okunuşa çevirir. Ses sentetik bir erkek sesidir (Antalia-2'nin sesi): gerçek bir kişinin sesi değildir ve eğitim verisinde gerçek konuşmacı kaydı yoktur. Çıkarım kodu ve model ağırlıkları Apache-2.0 lisanslıdır, eğitim kodu ve verisi açık değildir; bağımlılıklardan cmudict pakete dahil değildir ve kendi lisanslarına tabidir (Python paketi PyPI'da GPL-3.0-or-later, içindeki CMU sözlük verisi BSD tarzı). Kurulum: pip install antalia-mini. Tarayıcınızda deneyin: https://huggingface.co/spaces/cloud0day3/antalia-mini


Antalia-2 Mini (version 1.0.1) is a small Turkish text-to-speech model with one voice. It has 7.62M parameters in total (acoustic model 3.69M, vocoder 3.93M), produces 48 kHz audio, and runs well faster than real time on a CPU. It takes raw Turkish text: a text normaliser inside the package turns numbers, dates, times, amounts, initialisms, web addresses and English or brand words into the way a Turkish speaker says them.

Try it in your browser: huggingface.co/spaces/cloud0day3/antalia-mini runs this release entirely on your device with ONNX Runtime Web (no server; the text never leaves the page).

The voice is a synthetic male voice (Antalia-2's voice), not a real person, and the training data contains no recordings of real speakers. The inference code and the weights are licensed under Apache-2.0; the training code and data are not public. Its predecessor, Antalia-1, is at cloud0day3/antalia-1.

Quickstart

pip install antalia-mini

The same wheel is also in this repository (pip install https://huggingface.co/cloud0day3/antalia-mini/resolve/main/antalia_mini-1.0.1-py3-none-any.whl). Python 3.10 or newer; the dependencies are PyTorch, NumPy, safetensors, soundfile and cmudict.

from antalia_mini import Antalia

tts = Antalia()  # downloads the weights (~31 MB) once; uses a CUDA GPU if there is one, else the CPU
speech = tts.say("Randevunuz 14 Ekim Salı günü saat 15:30'da.", path="randevu.wav", seed=0)
print(speech.duration, speech.sample_rate, speech.seed)

# several texts at once (batched on a GPU)
speeches = tts.say(["Merhaba.", "Siparişiniz yola çıktı."], seed=0)

# streaming: the first sentence is synthesised first, then the rest, a few sentences at a time
for chunk in tts.stream(long_text):
    play(chunk)  # float32 numpy array at tts.sample_rate

# telephone or ASR pipelines: 24000, 16000 or 8000 Hz (resampled from 48 kHz)
tts8k = Antalia(sample_rate=8000)

# Apple Silicon: the CPU is the default; the GPU is an option
tts_mps = Antalia(device="mps")

Command line: antalia-mini "Merhaba, size nasıl yardımcı olabilirim?" -o merhaba.wav.

Options of say(): seed (the same text, seed and settings give the same audio; without a seed a random one is drawn and returned in speech.seed), speed (default 0.95, slightly slower than the voice's own pace; higher is faster), steps (flow-matching steps, default 8; 4 is faster and scored worse on the benchmark with 1.0.0's EQ: WER 1.17% vs 0.97%, CER 0.23% vs 0.19%, 3 seeds), cfg (classifier-free guidance, default 2.0). Antalia.normalize(text) shows the exact text the model reads. The model runs in fp32; Antalia(variant="fp16") downloads the half-size weights file (converted back to fp32 when loaded). The audio is close but not identical: rounded durations can change, and 5 of 50 test sentences came out a different length.

An output EQ is applied by default (since 1.0.1, chosen by ear over 1.0.0's darker tone): less bass (80 Hz high-pass, -4 dB low shelf at 200 Hz), less "boxiness" (-2.5 dB at 350 Hz), more presence (+3 dB at 3.2 kHz) and air (+2 dB above 8 kHz), and a de-esser that turns the band above 5.5 kHz down only while it is loud, so "s" and "ş" stay soft. It is designed for the chosen output rate and followed by a fixed +1.6 dB make-up gain (the raw output's loudness) and a soft peak limiter that keeps the output below full scale (no per-utterance loudness normalisation). Pass eq=False (to Antalia, say or stream, or --no-eq on the command line) for the raw output, or your own curve, e.g. 1.0.0's tone: Antalia(curve=None, deess=None, makeup_db=0, tone=(6, -9)). stream() carries the filter state across chunks, so the joined chunks match say()'s output sample for sample.

Two reading fixes are on by default. Long texts are read in chunks, and a chunk that starts with "ö" or "ı" is spoken after a short "ee," that is cut out of the audio again, because the voice tends to put stray sounds in front of "ö" at the very start (see Limitations), and a small test heard similar errors before "ı". Double sounds, inside a word ("dikkat") or across a word gap ("o olumsuz"), are held a little longer. Both can be turned off: Antalia(prefix="", gem_stretch=1.0).

Samples

Raw input text, seed 0, default settings (8 steps, cfg 2.0, output EQ).

Text Audio
Greeting Merhaba, size nasıl yardımcı olabilirim?
Date and time Randevunuz 14 Ekim Salı günü saat 15:30'da, Dr. Ayşe Yılmaz ile.
Amount Toplam tutar 1.250,75 TL. Ödemeyi 3 taksitle yapabilirsiniz.
Phone and e-mail Bize 0212 555 12 34 numarasından veya destek@ornek.com adresinden ulaşabilirsiniz.
Date Kargonuz yola çıktı; tahmini teslimat tarihi 9 Ekim 2026, Perşembe.
Question Siparişinizi iptal etmek mi istiyorsunuz, yoksa teslimat adresini mi değiştirmek istiyorsunuz?
Brand word Toplantı bağlantısını WhatsApp üzerinden ve e-posta ile gönderdik.
Long sentence İstanbul'un iki yakasını birbirine bağlayan köprüler, her gün yüz binlerce kişinin işe, okula ve evine ulaşmasını sağlıyor; ancak yoğun saatlerde trafik, yolculuk süresini kimi zaman iki katına çıkarabiliyor.

Evaluation

Freya-TR-Eval (freyavoice/freya-tr-eval), all 495 sentences, raw text in. Protocol, following EMA Lightning's card and Freya's reference scorer:

  • intelligibility: each clip is resampled to 8 kHz and back to 16 kHz (band matching), transcribed by faster-whisper large-v3 (fp16, beam 5, language tr, other options at their defaults); reference and transcript get Freya's Turkish normalisation; WER and CER are computed over the whole set with jiwer;
  • naturalness: UTMOS22-strong, mean over clips, on the full band (resampled to 16 kHz) and on the 8 kHz band (the same band-matched audio the WER uses);
  • 3 seeds per system unless noted; WER gives the mean, with the lowest and highest seed in brackets;
  • Antalia-2 Mini with its default settings; EMA Lightning reproduced on our harness with the same protocol.
System Parameters WER % CER % UTMOS UTMOS (8 kHz band)
Antalia-2 Mini 1.0.1 (default) 7.62M 1.02 (0.92–1.20) 0.21 3.18 3.05
Antalia-2 Mini 1.0.0 (its darker EQ; see above to restore it) 7.62M 0.97 (0.89–1.12) 0.19 3.25 3.06
EMA Lightning 1.0.1 (our run) 8.6M 1.00 (0.89–1.17) 0.20 3.30 2.88
VoxCPM2 speaking the same voice (the teacher; 1 seed) much larger 0.92 0.20 3.42 3.25

Antalia-2 Mini and EMA Lightning are level on intelligibility. On this harness 1.0.1 has WER 1.02% vs 1.00% and CER 0.21% vs 0.20%; in a second, independent run on the public benchmark page's harness (other seeds, one NVIDIA L4) it has CER 0.220% vs 0.225%, the lowest of the 11 open-weights systems measured there and second of all 15 (see below), and WER 1.09% vs 1.04%. Both models vary by about ±0.1 WER from seed to seed, so these differences are within noise. EMA Lightning is ahead on full-band UTMOS (3.30 vs 3.18); Antalia-2 Mini scores higher on UTMOS in the 8 kHz band, the band a phone call carries, and is smaller (7.62M vs 8.6M parameters). EMA Lightning's own card reports 0.92 / 0.18 / ~3.30; its repository says the accuracy numbers come from a release candidate with its own normaliser. We ran the 1.0.1 package; PyPI has since moved to 1.1.2, which we have not re-run.

1.0.1 changed only the output EQ, chosen by ear by the authors after outside feedback on 1.0.0's darker tone; the automatic scores moved slightly against it (UTMOS 3.25 → 3.18, WER 0.97 → 1.02 here). 1.0.0's numbers are kept for reference, and its tone is one argument away (see above).

The two reading fixes (see Quickstart) were found by studying where the model went wrong: the first in its training data, the second in this benchmark's errors. To check that the second one is not tuned to the benchmark, we compared both settings on 500 other sentences (160 of our own test prompts, 36 of them also in the training text, and 340 lines from the corpus's held-out split): WER 6.12% → 6.02%, CER 1.53% → 1.48%, 3 seeds each. That is consistent in direction but not separable from seed noise: nearly all of the WER gain is one seed, and we kept no per-sentence data for an interval. (WER is higher there because those lines contain digits, abbreviations and foreign names that the scoring normalisation does not match.) The teacher row is the system that generated Antalia-2 Mini's training audio, given for reference; it is not a small model. None of the evaluation sentences, or near-duplicates of them, were in the training text.

On the public benchmark page

We also keep an independent re-run of Freya-TR-Eval for every Turkish system we could run, at speech.patientdesk.ai/benchmarks (scripts and per-clip transcripts: PatientdeskAI/freya-tr-eval-rerun). It uses EMA Lightning's published eval.py for scoring, 3 seeded takes per system, and an NVIDIA L4 for speed (same GPU type on different VMs: 8 vCPUs for Antalia-2 Mini, 16 for EMA Lightning); Antalia-2 Mini 1.0.1 ran there with its default settings, separately from the run above (other seeds). Sorted by WER; best value per column in bold; API systems have no RTF.

# System Parameters WER % CER % Clean sentences UTMOS RTF (L4)
1 EMA Lightning (plain PyTorch) 8.6M 1.04 ± 0.17 0.225 93.7% 3.30 0.017 (compiled: 0.0030)
2 Antalia-2 Mini 1.0.1 7.62M 1.09 ± 0.12 0.220 92.9% 3.18 0.029
3 Trendyol-TTS (cfg 2.0, 16 steps) 2.38B 1.16 ± 0.16 0.23 93.1% 3.82 0.962
4 Gemini 3.8 Flash TTS (voice Kore) – 1.23 ± 0.10 0.29 92.9% 3.53 –
5 Gemini 3.8 Flash-Lite TTS (voice Kore) – 1.34 ± 0.19 0.27 91.9% 3.63 –
6 Anka TTS (built-in male voice) 336M 1.42 ± 0.06 0.30 91.6% 3.52 0.322
7 Alania-2 (production API, voice F1) 488M 1.44 ± 0.15 0.28 91.7% 3.67 –
8 Chatterbox Multilingual (Anka male reference) 500M 1.91 ± 0.35 0.43 88.8% 3.51 2.892
9 Piper (tr_TR dfki medium, CPU) 16M 3.41 ± 0.21 0.73 79.4% 3.71 0.038
10 XTTS-v2 (Anka male reference) 470M 3.67 ± 0.37 1.50 77.1% 2.97 0.455
11 Alania-1 (production API) 3.3B 5.99 ± 0.47 1.81 67.3% 3.19 –
12 Antalia-1 (open weights, release recipe) 305M 6.28 ± 0.27 2.49 66.7% 2.72 0.476
13 MMS-TTS (tur) 36M 6.38 ± 0.19 1.48 65.7% 3.79 0.014
14 Coqui GlowTTS (tr common-voice, lowercased input) 28M 10.93 ± 0.00 2.96 46.1% 3.08 0.015
15 FreyaTTS-small (default voice) 183M 12.02 ± 0.00 4.95 47.1% 2.81 0.286

Antalia-2 Mini's CER is the lowest of the 11 open-weights systems (0.220, against 0.225 for EMA Lightning and 0.229 for Trendyol-TTS; CER is given to three decimals for the first two, which round to the same 0.22) and second of all 15, behind our own closed Alania-2 with its voice Öncel (0.217, run on 12 October 2026; the table shows Alania-2's default voice F1, run on 7 October). These gaps are 2 to 7 character errors in 80,922, none distinguishable from zero (paired sentence bootstrap, 95%), and on the other harness (the first table above) EMA Lightning is the lower one (0.198 against 0.205). On word errors Antalia-2 Mini is second, 0.05 points behind EMA Lightning, within either model's seed-to-seed spread. (1.0.0 scored 1.05 / 0.20 / 93.1% / 3.25 there.) On the L4, at Antalia-2 Mini's default 8 steps, EMA Lightning's plain PyTorch path is about 1.7 times faster by RTF and about 1.9 times by wall time, because Antalia-2 Mini speaks about 13% longer on the same text; its compiled path is about 9.5 times faster by RTF. "Clean sentences" is the share of sentences transcribed without a single word error.

Size and speed

Antalia-2 Mini EMA Lightning 1.0.1
Parameters 7.62M (acoustic 3.69M + vocoder 3.93M) 8.6M
Weights 30.5 MB fp32, 15.3 MB fp16
Output 48 kHz (24 / 16 / 8 kHz by resampling)
RTF, NVIDIA L40S, batch 1 (Antalia-2 Mini 1.0.0) 0.026 0.0126 (plain PyTorch, same machine)
RTF, CPU, 8 vCPUs, AMD EPYC 7R13 (Antalia-2 Mini 1.0.0) 0.052 0.071 (same machine)
RTF, Apple M5 CPU, 2 threads (1.0.1) 0.024
Time to first audio, stream(), Apple M5 CPU (1.0.1) 72 ms

RTF is synthesis time divided by audio duration (lower is faster; 0.01 means one second of speech takes 10 ms), default settings (8 steps, cfg 2.0), batch 1 after a warm-up, the first 100 benchmark sentences, through each package's own API (text normalisation and output processing included). Time to first audio is the first stream() chunk (2.8 s of audio) of the 8 samples above joined.

The L40S and EPYC rows were measured with 1.0.0, which rebuilt its output filter for every sentence. 1.0.1 builds it once and has not been timed on those two machines, so these comparisons hold for 1.0.0 only: on a GPU, single requests of 1.0.0 are about 2 times slower than EMA Lightning's at the default 8 steps; on a CPU, 1.0.0 is about 1.4 times faster on the same 8 vCPUs. For 1.0.1 the GPU comparison we have is the NVIDIA L4 table above: RTF 0.029, against 0.017 for EMA Lightning's plain PyTorch path and 0.0030 for its compiled path (same GPU type, all 495 sentences, 8 vCPUs for Antalia-2 Mini and 16 for EMA Lightning) and 0.043 for 1.0.0.

On an Apple M5 laptop 1.0.1 speaks about 41 times faster than real time on 2 CPU threads. The Apple M5 numbers were measured with other applications running, so a quiet machine may be a little faster. We have no EMA Lightning number on that machine. On Apple Silicon the package uses 2 CPU threads by default, which measured faster than 4 or more; elsewhere set Antalia(threads=N) to taste.

Model

Part What Parameters
Text encoder character embeddings, 3 ConvNeXt blocks, 1 self-attention block with RoPE (d=192) 0.83M
Duration predictor 3 convolutions; trained on durations from monotonic alignment search (no external aligner) 0.17M
Mel generator 5 DiT blocks (d=192, adaLN-single) over pairs of 128-band log-mel frames at 93.75 Hz; flow matching with shortcut self-consistency, so the one model samples in 1, 2, 4 or 8 steps; classifier-free guidance 2.69M
Vocoder Vocos-style ConvNeXt stack (d=256, 8 blocks) predicting an n_fft 2048 / hop 512 STFT, one inverse STFT to 48 kHz; fine-tuned on the generator's own mels 3.93M

The model reads characters, not phonemes: Turkish spelling is close to pronunciation, and the normaliser handles the cases where it is not. The methods are reimplemented from the papers: monotonic alignment search (Glow-TTS, Matcha-TTS), flow matching (Lipman et al., 2023), shortcut models (Frans et al., 2024), adaLN-single (PixArt-α), ConvNeXt, Vocos, HiFi-GAN and UnivNet discriminators (training only).

Voice

One voice: a synthetic male voice (Antalia-2's voice), not a real person. The model has no speaker input and cannot clone voices.

Training data

About 1,790 hours of synthetic speech, all in Antalia-2's voice, generated with VoxCPM2 (OpenBMB, Apache-2.0) from a reference of that voice: 1,582 hours of sentences up to about 25 seconds and 207 hours of short utterances. The acoustic model trained first on the sentences, then was fine-tuned on both sets with the short clips weighted six times; the vocoder saw only the sentences. No recordings of real speakers were used. The text came from:

  • Turkish Wikipedia (CC BY-SA 4.0) and FineWeb-2 Turkish (ODC-By 1.0);
  • customer-service style sentences (appointments, banking, retail, deliveries) written with a language model (Qwen3);
  • templates for numbers, dates, times, amounts, phone numbers and codes;
  • for the short utterances: clauses of 2 to 6 words cut from the texts above, templates for short questions and answers, interjections, names, places and number-only replies, and Turkish proverbs (Turkish Wiktionary page titles, CC BY-SA);
  • all of it passed through the same normaliser the package uses, and sentences overlapping Freya-TR-Eval removed.

Every generated clip was checked automatically (UTMOS, speaking rate, pitch and similarity to the voice, with relaxed rules for very short clips) and dropped if it failed. A Whisper large-v3 transcript was compared with the text for all 917,297 sentence clips but for only 7,500 of the 444,437 short clips; the other 436,937 short clips were not transcribed, so their words were not checked against the text.

Text normaliser

The normaliser is PatientDesk AI's Turkish serving normaliser, released here under the same licence. It spells out cardinal and ordinal numbers, decimals, percentages, dates, times, ranges, amounts in lira and other currencies, phone numbers, e-mail and web addresses and common abbreviations, reads initialisms with Turkish letter names, and respells English and brand words the way they are said in Turkish (using the CMU Pronouncing Dictionary and a reviewed brand lexicon). Antalia.normalize(text) shows its output.

Limitations

  • One voice, one speaking style; no emotion or style control beyond speed.
  • Turkish only. English words inside Turkish sentences are respelled; whole English sentences are not supported.
  • Short interjections on their own ("Evet.", "Hı hı.", "Tamam!") are its weakest area: they can come out flat or rushed. In running text they are packed together with neighbouring sentences, which helps.
  • Readings follow the normaliser. Roman numerals ("XIX. yüzyıl"), ordinals written before names ("2. Abdülhamit"), unusual formats, rare abbreviations and some foreign names can be read wrongly; check Antalia.normalize(text) when a reading matters.
  • Long inputs are split into sentence-sized chunks (up to about 19 seconds each) and joined with short pauses; prosody does not carry across chunks.
  • At the very start of a chunk the voice tends to put stray sounds before "ö" (in transcripts most often an "l", as in "lözür" for "özür"): the model learned it from its training audio. The default "ee," trick hides it at the start of each chunk but does not remove it; a fix in the training data is planned.
  • The numbers above are automatic metrics on one benchmark, not listening tests.

Responsible use

  • Tell listeners when they are hearing a synthetic voice.
  • Do not use the model to impersonate real people or to make speech that could be mistaken for a real person's statement.
  • Do not use it for fraud, harassment, or deceptive calls.

License

The inference code, the text normaliser and the model weights are all licensed under Apache-2.0 (see LICENSE and NOTICE in this repository). The training code, data generation scripts and training data are not public. The cmudict dependency is not included here and has its own licences: PyPI lists the Python package as GPL-3.0-or-later, and the CMU Pronouncing Dictionary data inside it carries a BSD-style licence from Carnegie Mellon University.

Credits

  • VoxCPM2 by OpenBMB, which generated the training audio.
  • Freya-TR-Eval and Freya's reference scorer, for the benchmark.
  • EMA Lightning, the Turkish model we compare against.
  • The CMU Pronouncing Dictionary, through the cmudict package.
  • Turkish Wikipedia, Turkish Wiktionary and FineWeb-2 for the training text.

Citation

@misc{antalia_mini_2026,
  title        = {Antalia-2 Mini: a small Turkish text-to-speech model},
  version      = {1.0.1},
  author       = {{PatientDesk AI}},
  year         = {2026},
  howpublished = {\url{https://huggingface.co/cloud0day3/antalia-mini}}
}
Downloads last month
10,743
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for cloud0day3/antalia-mini

Quantizations
1 model

Spaces using cloud0day3/antalia-mini 2