Skip to content
Danube Labs

Local Text-to-Speech in 2026: Quality, Cost and Privacy

Cloud TTS bills per character and sends your text away. Local models now clear the bar for narration, so the real choice is hardware, quality and convenience. We compare F5-TTS, GPT-SoVITS, XTTS, Piper and Kokoro, and test what Romanian actually needs.

By Alexandru Secureanu9 min read
A local text-to-speech studio window showing a waveform, a Romanian reference clip and a queue of narration chunks

A cloud text-to-speech service charges by the character and receives your text on its servers. A local model charges you once, in hardware, and the text never leaves the machine. For years the trade was easy: local voices sounded synthetic, so anyone who cared about quality paid the cloud. For narration, that is no longer true. An open model with a good reference clip can read a paragraph well enough for a podcast, and what remains is hardware, setup and language.

We run a local TTS workstation, VoiceSynth Studio, so this interests us practically. Here is what is worth running, what it costs, and where Romanian breaks it.

What changes when the model is local

Cloud pricing is linear in characters. That is convenient at one article a month and painful when you generate forty hours of audio for a course, because the bill grows with every revision. Local pricing is a step: one GPU, or one CPU if you accept the wait, then a marginal cost near zero. You pay for the step whether you use it or not, and you own the failures.

Privacy changes shape too. With a cloud service the question is what the provider does with your text. OpenAI's API data documentation says API data is not used for training unless you opt in, and lists the speech endpoint with thirty days of abuse-monitoring retention and eligibility for zero data retention. Other providers have other terms; read them for your plan. "The cloud keeps your text" is a shortcut, not a universal fact.

With a local model the question disappears. If the weights are already on disk, the network can be off. That matters for client material under NDA and for medical or legal text.

The families you can actually run

All options below are open weights you run yourself. They differ in architecture, licence and language coverage, and the licence often rules one out before quality does.

F5-TTS

F5-TTS is a flow-matching diffusion transformer trained for zero-shot cloning from a reference clip, and it is the model we use most. The code is MIT, but the released weights are CC-BY-NC, so a commercial product needs permission or another checkpoint. The v1 base checkpoint is 1.35 GB. Generation is capped at about thirty seconds per call including the prompt, and the inference docs ask for a reference under twelve seconds with a second of silence at the end. On an L20 the repository reports an RTF of 0.1467 in PyTorch, so a minute of speech takes roughly nine seconds.

GPT-SoVITS

GPT-SoVITS is MIT licensed and built around small data: five seconds for zero-shot, about a minute for a fine-tune. Its languages are Chinese, English, Japanese, Korean and Cantonese. The README reports RTF 0.028 on a 4060 Ti and 0.526 on an M4 CPU, and ships a WebUI for slicing, denoising, ASR and transcript correction before training. If your language is in the list, it is fast and flexible. Romanian is not in the list.

XTTS v2

XTTS v2 clones from six seconds and covers seventeen languages. Romanian is not one. The weights use the Coqui Public Model License, which is not permissive, and the main file is 1.87 GB. It still works, but for a new project we would start elsewhere unless the licence and language fit exactly.

Piper

Piper is the other end of the spectrum: a small VITS model exported to ONNX, with espeak-ng doing phonemization from rules. The engine is GPL-3.0. The Romanian voice, ro_RO-mihai-medium, is a 63 MB ONNX file at 22,050 Hz trained from a medium-quality US English base voice. Piper runs comfortably on a CPU, which suits long batch jobs, embedded devices and offline hardware. The trade is expression: clear, predictable, closer to a good screen reader than to a person.

Kokoro and Chatterbox

Kokoro is 82 million parameters under Apache-2.0 with eight languages. Chatterbox from Resemble AI is 0.5B under MIT with 23 languages and emotion controls. Neither lists Romanian, and both show what a small, permissive model can do in English.

What it costs in memory and time

Treat any VRAM figure as a floor. F5-TTS loads the 1.35 GB checkpoint plus a vocoder and the text encoder, and the reference clip adds activation memory. A card with 6 to 8 GB is comfortable. An empty reference transcript makes the model run ASR on the clip, which costs extra GPU memory. Our own tool lists 1.5 GB as the minimum to load F5-TTS, not the amount to run it with.

CPU is possible and usually disappointing for diffusion models. Piper is the exception because it was built for that. GPT-SoVITS on an M4 CPU reports RTF 0.526, so ten minutes of audio takes about five, which suits an overnight batch and not interactive work. F5-TTS on a CPU is slow enough that we would not ship it that way.

Every RTF here is measured on short clips with warm models; the first request and long text both pay extra. Time your own material.

First run is not offline

A local pipeline still downloads on first use. F5-TTS pulls 1.35 GB plus a vocoder, Piper's Romanian voice is 63 MB, and the XTTS v2 repository is 2.09 GB. The download happens once, into a cache, then the model loads from disk. For an air-gapped machine, copy the cache before the event and test offline. Local describes the steady state, not the first launch.

Long text: chunk, overlap, crossfade

Diffusion models generate a bounded window. F5-TTS stops at about thirty seconds including the prompt, so a twenty-minute chapter becomes dozens of calls. The joins are where quality goes wrong.

  • Split on sentence boundaries, not a character count. A cut mid-clause produces wrong intonation that no crossfade fixes.
  • Merge very short sentences with the next. Three words give the model too little context to place stress.
  • Overlap chunks by 50 to 100 ms and apply an equal-power crossfade. A hard cut clicks even when both sides are clean.
  • Do not crossfade across a pause. If a sentence ends with a full stop, keep the silence and join inside it.
  • Apply one loudness gain to the finished file. Per-chunk normalisation pumps the level at every join.
  • Keep a fixed seed while you tune, because a new seed changes the delivery and every comparison with it.

Keep the text of each chunk next to its audio. When one join sounds wrong, regenerate that chunk alone.

Reference clips decide the voice

Zero-shot cloning is only as good as the clip. F5-TTS asks for under twelve seconds with a second of silence at the end and a transcript that matches word for word. If the transcript has a typo, the model learns the typo. GPT-SoVITS works from about five seconds, XTTS from six. Shorter is not better: a clip with one full sentence and a natural pause carries more prosody than three seconds of a greeting.

Record in the language you will synthesise. A Romanian reference read by a bilingual speaker still carries English rhythm if the text was English. One speaker, no music, no echo, no clipping. Keep the raw file and its transcript, because you will reuse them.

Consent is not optional. A cloned voice is personal data in the EU, and "it was public on YouTube" is not a licence. Get written permission naming the use, the duration and the right to withdraw.

Romanian is where you have to test

This section decides the project. Most popular models were trained on English and Chinese, and Romanian is absent or thinly represented.

  • The F5-TTS base checkpoint is an English and Chinese model, trained on data that includes Emilia. Out of the box it does not read Romanian.
  • XTTS v2 lists seventeen languages and Romanian is not one. GPT-SoVITS lists five and Romanian is not one. Kokoro and Chatterbox do not list it either.
  • Piper has Romanian. The mihai voice uses espeak-ng's Romanian rules, so diacritics are pronounced by a rule set rather than learned. That is why it is predictable and why it sounds flat.
  • Community F5-TTS fine-tunes exist. F5-TTS-Romanian was trained on about 1.3 hours of Romanian Common Voice under Apache-2.0, and its author says the quality is below the original. A small fine-tune is a starting point, not a product.

Diacritics are the first failure. Romanian uses ș and ț with a comma below, and much text in the wild uses cedilla forms or drops diacritics entirely. A model trained on stripped text reads "sa" for "să" and "cite" for "câte". Normalise your input to comma-below characters and keep them.

Stress is the second failure. Romanian does not mark it, and some words share a spelling with different stress and meaning. Copii can mean children or copies. Veselă can mean dishes or cheerful. Numbers, abbreviations and loanwords are the third: "2026", "UE", "online" and "target" each need a decision.

Build ten test sentences before you commit: every diacritic, a question, a decimal comma, an acronym, a name with a Romanian ending, a loanword. Listen to all ten, then again a day later, because the first pass primes you to hear what you expect. We would not sign off a Romanian voice on a model card.

When the cloud still wins

  • You need many voices. Thirty languages and two hundred speakers is a product problem, not a model problem.
  • You have no GPU and do not want to rent one.
  • You need strict latency, for example a live agent answering in under a second, and do not want to own the tail.
  • You need a contract. Procurement asks for an SLA, a data processing agreement and someone to call.
  • Volume is low and the text is not sensitive. Ten pages a month costs less than the electricity and your afternoon.

Cloud is also the right first test. Generate the same ten Romanian sentences in both places before you buy a GPU. A per-character price is easy to understand, which is why it survives even when the arithmetic favours local.

Where VoiceSynth Studio fits

VoiceSynth Studio is our local TTS workstation at tts.danubelabs.net. It puts a command line, a desktop interface, voice references, profiles and batch queues in front of open models, with no accounts, no API keys and no audio uploads. F5-TTS is the backend actually wired for synthesis. The other backends in its list are scaffolding: one needs an external package the app does not ship, another has no inference engine wired at all. We would rather say that plainly than imply a menu of engines that works today.

How we would decide

Run the checks in this order. Licence first, because a non-commercial checkpoint ends the discussion for client work. Language second, on your own sentences. Hardware third, because a 6 to 8 GB GPU handles one voice at a time and a CPU handles Piper. Volume last, because it only decides whether the hardware pays for itself.

For narration in one or two voices, local is now a reasonable default. If you sell voice as a feature to many customers, the cloud still has the better story. Most teams end up with both, and that is not a failure.

For the reverse problem, see our guide to local Whisper transcription. If you want help running a local voice pipeline, see AI systems or book a free intro call.

Frequently asked questions

Can I run text-to-speech locally without a GPU?
Yes, if you choose a small model. Piper is designed for CPU inference and its Romanian voice is a 63 MB ONNX file, so it runs on an ordinary laptop. Diffusion models such as F5-TTS are practical on a GPU with 6 to 8 GB of memory and slow enough on a CPU that we would not ship them that way.
Which local TTS model supports Romanian?
Piper has an official Romanian voice, ro_RO-mihai-medium, which uses espeak-ng's Romanian rules. F5-TTS does not ship Romanian in its base checkpoint, but community fine-tunes exist, including one trained on about 1.3 hours of Romanian Common Voice. XTTS v2, GPT-SoVITS, Kokoro and Chatterbox do not list Romanian among their languages.
Is local text-to-speech really free?
Not quite. You pay for the hardware and the electricity, and the licence decides what you may do with the output. F5-TTS code is MIT but its released weights are CC-BY-NC, Piper's engine is GPL-3.0, and XTTS v2 uses the Coqui Public Model License. Check the licence of the exact checkpoint before you build a commercial product on it.
Why do the joins between audio chunks sound bad?
Because the model generates a bounded window, often around thirty seconds, and a cut in the middle of a clause gives the wrong intonation. Split at sentence boundaries, overlap the chunks by 50 to 100 ms, apply an equal-power crossfade inside a natural pause, and normalise loudness once on the finished file rather than per chunk.
How long should a voice reference clip be?
F5-TTS asks for under twelve seconds with about a second of silence at the end, and a transcript that matches the audio exactly. GPT-SoVITS uses about five seconds for zero-shot, and XTTS v2 uses six. Record one speaker, no music or echo, in the same language as the text you will synthesise.
When should I still use a cloud TTS service?
When you need many voices or languages, when you have no GPU and do not want one, when latency is strict, or when procurement needs an SLA, a data processing agreement and vendor support. Low-volume, non-sensitive text is often cheaper per character than owning the hardware.
Share

Related articles