| --- |
| license: mit |
| language: |
| - nan |
| - zh |
| - en |
| library_name: GPT-SoVITS |
| tags: |
| - text-to-speech |
| - tts |
| - voice-cloning |
| - taiwanese |
| - hokkien |
| - poj |
| - peh-oe-ji |
| - gpt-sovits |
| pipeline_tag: text-to-speech |
| base_model: |
| - lj1995/GPT-SoVITS |
| --- |
| |
| # GPT-SoVITS Taiwanese (Hokkien) — Trilingual S1 + r4 e15 S2 |
|
|
| Pre-trained weights for the Taiwanese (Hokkien / Pe̍h-ōe-jī) fork of |
| [GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS). The S1 is |
| trilingual (TW + ZH + weak EN) thanks to embedding transplant; the S2 |
| is a v2ProTw vocoder finetuned on Taiwanese audio. |
|
|
| **Inference code, sandhi preprocessor, training recipe, and Traditional |
| Chinese documentation:** |
| [github.com/KaedeTai/GPT-SoVITS](https://github.com/KaedeTai/GPT-SoVITS) · |
| [TAIWANESE.md](https://github.com/KaedeTai/GPT-SoVITS/blob/main/TAIWANESE.md) · |
| [TAIWANESE.zh-tw.md](https://github.com/KaedeTai/GPT-SoVITS/blob/main/TAIWANESE.zh-tw.md) |
|
|
| ## Files |
|
|
| | File | Size | What | |
| |------|------|------| |
| | `s1_trilingual.ckpt` | 156 MB | S1 GPT — TW (sandhi-trained, e15) + transplanted base ZH/EN embeddings | |
| | `s2_r4_e15.pth` | 952 MB | S2 SoVITS v2ProTw — full-state ckpt at epoch 15 of finetune run r4 | |
|
|
| ## Quick start |
|
|
| ```bash |
| git clone https://github.com/KaedeTai/GPT-SoVITS.git |
| cd GPT-SoVITS |
| python3.11 -m venv .venv && source .venv/bin/activate |
| pip install --upgrade pip |
| pip install -r requirements.txt |
| ./download_pretrained.sh # upstream base pretraineds (BERT, hubert, etc.) |
| |
| # Pull these weights |
| hf download KaedeTai/gpt-sovits-tw s1_trilingual.ckpt --local-dir ./models |
| hf download KaedeTai/gpt-sovits-tw s2_r4_e15.pth --local-dir ./models |
| |
| # One-line synthesis (POJ-with-diacritics in, mp3 out) |
| python -m tw_inference.tts_cli "Lí hó, sè-kài!" -o hello.mp3 |
| ``` |
|
|
| Or the local web UI: |
|
|
| ```bash |
| python -m tw_inference.webui # → http://127.0.0.1:5557/ |
| ``` |
|
|
| ## Quality |
|
|
| | Language | Fluency | Pronunciation | Notes | |
| |----------|---------|---------------|-------| |
| | Taiwanese (POJ) | ~80 / 100 | ~75 / 100 | Single trained speaker; long sentences (>60 syllables) occasionally drift. | |
| | Mandarin (中文) | usable | usable | Preserved via embedding transplant from `s1v3` base. | |
| | English | weak | weak | Base never had real English; included for completeness only. | |
|
|
| Code-switching within one utterance is **not supported** — use |
| `{tw:...}` / `{zh:...}` markup per segment. |
|
|
| ## Architecture |
|
|
| Two-stage TTS: |
|
|
| - **S1 (GPT)** — autoregressive token model mapping POJ phoneme tokens |
| → SoVITS semantic codes. Vocabulary expanded from 732 → 1033 (301 |
| Taiwanese `tw_*` tokens added on top of the upstream Mandarin |
| vocabulary). The trilingual variant preserves Mandarin by |
| transplanting rows 0..731 of the embedding table from a clean |
| `s1v3` checkpoint back into the TW-finetuned ckpt. |
| - **S2 (SoVITS v2Pro / v2ProTw)** — non-autoregressive vocoder; takes |
| semantic codes + a speaker embedding (cnhubert + sv) and produces |
| 32 kHz mono waveform. |
| - **Sandhi preprocessor** — applies standard Taiwanese tone-sandhi |
| rules to citation-tone POJ before tokenization, so the model sees |
| the tone sequence speakers actually produce. 13 flags; defaults |
| match the eval configuration that produced our best reported CER. |
|
|
| ## Training data |
|
|
| - **MoE Tâi-uân-gí 教育部臺灣閩南語常用詞辭典** example sentences |
| (majority of the corpus). |
| - **Common Voice `nan-tw`** validated split. |
| - Multi-speaker. Per-segment 3-12 s, 32 kHz mono, loudness normalised. |
| - Labels: POJ with diacritics, pre-processed with the sandhi |
| preprocessor so the written form matches the audio realisation. |
|
|
| Total: roughly 15-25 hours of paired audio + POJ. |
|
|
| ## Evaluation |
|
|
| Reported quality is from human listening; ASR-based CER was used for |
| ablations but flattens out at the top of the quality curve. |
|
|
| | Test set | Stack | Mean POJ-CER (BreezeASR-26-derived) | |
| |----------|-------|--------------------------------------| |
| | Canonical 5-sentence | S1 trilingual e15 + S2 r4 e15 + sandhi v1 | **4.44%** | |
| | 13-sentence long content | same | ~15% | |
|
|
| Per-sentence breakdown for the 5-sentence set is in |
| [`tw_samples/eval_summary.json`](https://github.com/KaedeTai/GPT-SoVITS/blob/main/tw_samples/eval_summary.json) |
| in the GitHub repo. Demo mp3s are in |
| [`tw_samples/demo_*.mp3`](https://github.com/KaedeTai/GPT-SoVITS/tree/main/tw_samples). |
|
|
| ## Known limitations |
|
|
| - **English is weak.** Don't ship this for English use cases. |
| - **Long sentences drift** past ~60 syllables. The inference pipeline |
| splits at punctuation to mitigate but doesn't eliminate this. |
| - **Code-switching not supported** within a single utterance. |
| - **Single training speaker fidelity** is capped by the multi-speaker |
| corpus heterogeneity; with a single-speaker corpus we'd expect |
| higher voice consistency but narrower coverage. |
| - **POJ input only.** No built-in Han-character → POJ pipeline. |
| - **MPS nondeterminism.** Same seed + same machine still produces |
| audibly different output across runs (5-10% spread). |
|
|
| ## How this was built (short version) |
|
|
| The long version with lessons learned and what we'd do differently is |
| in [TAIWANESE.md](https://github.com/KaedeTai/GPT-SoVITS/blob/main/TAIWANESE.md#lessons-learned). |
| Short version: |
|
|
| 1. **S2 first** (~24 h on M1 Max): full SoVITS v2ProTw finetune from |
| `s2Gv2Pro.pth`. 15 epochs. |
| 2. **S1 next** (~12-30 h): `s1_train_mps_arpa_freeze.py` from |
| `s1v3.ckpt`, ARPA-row freeze, warmup → cosine LR (peak 1e-2, end |
| 1e-4, 2000-step warmup, 40k-step decay). Critical patch: upstream |
| `lr_schedulers.py` had a hardcode locking every run to LR=0.002 |
| regardless of yaml; that's now removed. |
| 3. **Sandhi-aligned labels are non-negotiable.** Training on |
| citation-tone POJ when the recordings have natural sandhi produces |
| a systematically mispronouncing model. |
| 4. **Embedding transplant** for the trilingual variant: copy rows |
| 0..731 from a clean `s1v3` back into the TW-finetuned ckpt. |
| Restores Mandarin without touching the trained TW rows. |
|
|
| ## License & credits |
|
|
| - License: **MIT** (matches upstream GPT-SoVITS). |
| - Upstream: [RVC-Boss/GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS). |
| - TW adaptation: [KaedeTai](https://github.com/KaedeTai). |
| - Acknowledgments: MoE 教育部臺灣閩南語常用詞辭典 example sentence |
| corpus, Common Voice `nan-tw` (Mozilla), BreezeASR-26 (MediaTek) |
| for TW ASR eval, linshoufan/whisper-small-nan-tw-pinyin for POJ |
| ASR. |
|
|
| ## Citation |
|
|
| If you find this useful in academic work, please cite the upstream |
| GPT-SoVITS and this fork: |
|
|
| ```bibtex |
| @misc{gpt-sovits-tw-2026, |
| title = {GPT-SoVITS Taiwanese (Hokkien) trilingual fork}, |
| author = {KaedeTai}, |
| year = {2026}, |
| howpublished = {\url{https://huggingface.co/KaedeTai/gpt-sovits-tw}} |
| } |
| ``` |
|
|