Local TTS Models (Korean-focused)
Use when the user asks which open-source/local TTS to use, whether model X
supports Korean, how fast it synthesizes, or whether TTS can run on mobile —
especially for the Lumina Reader epub-reader project and any mobile ebook
reader follow-up.
Current pick for this environment: Supertonic
pip install supertonic (v1.3.x), ONNX Runtime — no CUDA/torch needed, runs
on CPU and older GPUs alike.
- Voices:
voice_style_names = F1–F5 (female), M1–M5 (male); sample_rate 44100.
- Korean is solid (31 languages); paragraph-length synthesis is near-realtime.
- Bundles cleanly into a PyInstaller
--onefile app (--collect-all supertonic).
- Detailed candidate comparisons in
references/korean-tts-evaluation.md.
Candidate matrix (verify current state before recommending)
| Model |
Korean |
License |
Local run |
Notes |
| Supertonic 3 |
good |
model OpenRAIL-M, code MIT |
✅ ONNX, CPU ok |
99M params; default here |
| Kokoro |
weak |
MIT |
✅ 82M, very light |
speed king, Korean weak |
| Piper |
ok |
MIT |
✅ tiny |
fast, naturalness lower |
| Qwen3-TTS |
excellent |
Apache 2.0 |
⚠️ needs modern GPU |
CustomVoice "Sohee"; see pitfalls |
| EchoTTS (EchoDiT) |
likely (Emilia-3m) |
CC-BY-NC-SA (weights) |
⚠️ early, no preset voices |
voice-cloning only; watch, don't adopt yet |
| F5-TTS / Fish-Speech |
good |
non-commercial |
⚠️ |
license blocks most uses |
ASR ≠ TTS: Microsoft VibeVoice-ASR-BitNet is speech-to-text (MIT) — not a
TTS replacement; users sometimes conflate them.
Mobile (Android/iOS) TTS
Supertonic ships official mobile SDKs — flutter/, ios/+swift/,
java/ (Android), web/ (WebGPU) in github.com/supertone-inc/supertonic.
99M params + even on Raspberry Pi, so a mobile ebook
reader with in-app TTS is feasible (Flutter covers both OSes from one codebase).
Caveat: Supertone announced the repo will be archived (no further dev;
Voice Builder gone after 2026-08-31). MIT code + OpenRAIL-M weights already
published remain usable forever; community forks likely. Long-term fallbacks:
Kokoro (MIT, weaker Korean), OS-native TTS engines, or server-side synthesis.
Integration pitfalls (sounddevice / pywebview apps)
sd.wait() blocks until the current paragraph finishes — stop/pause
buttons feel dead. Replace with a ~50ms polling loop checking stop/pause
events; call sd.stop() for instant silence. Track the playback sample
position to resume mid-paragraph.
- Realtime volume: don't bake gain into synthesized audio — play via an
OutputStream callback that multiplies the current volume per frame.
- Realtime speed: speed is a synthesis parameter; on change, flag an
event, stop the stream (save
_last_buf_pos BEFORE closing), re-synthesize
the paragraph at the new speed, and skip the already-spoken ratio.
- Prefetch: synthesize ~4–5 paragraphs ahead on a worker thread; invalidate
the queue on speed/voice change.
- Keep torch/qwen-tts-style test deps OUT of the app build (PyInstaller
timeouts + bloat); exclude them explicitly.
Pitfalls
- Pascal GPUs (GTX 1080 Ti) lack bfloat16 — Qwen3-TTS throws CUDA errors
there; CPU fallback measured ~RTF 7.5x (93s to synthesize 12s of audio) —
unusable, prefetch can't save it. Don't re-test; recommend Supertonic.
- "Fastest TTS" launch posts often benchmark on 8×B200 with vLLM/SGLang —
server numbers don't transfer to a consumer PC; judge on the user's hardware.
- License check is mandatory: several top-Korean-quality models are
non-commercial only.
1---2name: local-tts-models3description: Select local Korean TTS: Supertonic, Kokoro, Qwen3, mobile.4---56# Local TTS Models (Korean-focused)78Use when the user asks which open-source/local TTS to use, whether model X9supports Korean, how fast it synthesizes, or whether TTS can run on mobile —10especially for the Lumina Reader epub-reader project and any mobile ebook11reader follow-up.1213## Current pick for this environment: Supertonic1415- `pip install supertonic` (v1.3.x), ONNX Runtime — no CUDA/torch needed, runs16 on CPU and older GPUs alike.17- Voices: `voice_style_names` = F1–F5 (female), M1–M5 (male); sample_rate 44100.18- Korean is solid (31 languages); paragraph-length synthesis is near-realtime.19- Bundles cleanly into a PyInstaller `--onefile` app (`--collect-all supertonic`).20- Detailed candidate comparisons in `references/korean-tts-evaluation.md`.2122## Candidate matrix (verify current state before recommending)2324| Model | Korean | License | Local run | Notes |25|---|---|---|---|---|26| **Supertonic 3** | good | model OpenRAIL-M, code MIT | ✅ ONNX, CPU ok | 99M params; default here |27| Kokoro | weak | MIT | ✅ 82M, very light | speed king, Korean weak |28| Piper | ok | MIT | ✅ tiny | fast, naturalness lower |29| Qwen3-TTS | excellent | Apache 2.0 | ⚠️ needs modern GPU | CustomVoice "Sohee"; see pitfalls |30| EchoTTS (EchoDiT) | likely (Emilia-3m) | CC-BY-NC-SA (weights) | ⚠️ early, no preset voices | voice-cloning only; watch, don't adopt yet |31| F5-TTS / Fish-Speech | good | non-commercial | ⚠️ | license blocks most uses |3233ASR ≠ TTS: Microsoft `VibeVoice-ASR-BitNet` is speech-to-text (MIT) — not a34TTS replacement; users sometimes conflate them.3536## Mobile (Android/iOS) TTS3738Supertonic ships **official mobile SDKs** — `flutter/`, `ios/`+`swift/`,39`java/` (Android), `web/` (WebGPU) in github.com/supertone-inc/supertonic.4099M params + ONNX = CPU-realtime even on Raspberry Pi, so a mobile ebook41reader with in-app TTS is feasible (Flutter covers both OSes from one codebase).42Caveat: Supertone announced the repo will be **archived** (no further dev;43Voice Builder gone after 2026-08-31). MIT code + OpenRAIL-M weights already44published remain usable forever; community forks likely. Long-term fallbacks:45Kokoro (MIT, weaker Korean), OS-native TTS engines, or server-side synthesis.4647## Integration pitfalls (sounddevice / pywebview apps)4849- **`sd.wait()` blocks until the current paragraph finishes** — stop/pause50 buttons feel dead. Replace with a ~50ms polling loop checking stop/pause51 events; call `sd.stop()` for instant silence. Track the playback sample52 position to resume mid-paragraph.53- **Realtime volume**: don't bake gain into synthesized audio — play via an54 `OutputStream` callback that multiplies the current volume per frame.55- **Realtime speed**: speed is a synthesis parameter; on change, flag an56 event, stop the stream (save `_last_buf_pos` BEFORE closing), re-synthesize57 the paragraph at the new speed, and skip the already-spoken ratio.58- **Prefetch**: synthesize ~4–5 paragraphs ahead on a worker thread; invalidate59 the queue on speed/voice change.60- Keep torch/qwen-tts-style test deps OUT of the app build (PyInstaller61 timeouts + bloat); exclude them explicitly.6263## Pitfalls6465- **Pascal GPUs (GTX 1080 Ti) lack bfloat16** — Qwen3-TTS throws CUDA errors66 there; CPU fallback measured ~RTF 7.5x (93s to synthesize 12s of audio) —67 unusable, prefetch can't save it. Don't re-test; recommend Supertonic.68- "Fastest TTS" launch posts often benchmark on 8×B200 with vLLM/SGLang —69 server numbers don't transfer to a consumer PC; judge on the user's hardware.70- License check is mandatory: several top-Korean-quality models are71 non-commercial only.