GPT-SoVITS 闽南语 TTS 踩坑全记录
GPT-SoVITS 闽南语 TTS 踩坑全记录
deepseek生成
📋 背景
试图在 GPT-SoVITS 中加入闽南语(台语)支持,最终发现这条路比想象中复杂得多。本文记录了从零开始尝试的所有坑。
🕳️ 踩坑全记录(按时间顺序)
坑 1:盲目复制粤语方案
时间:第一天
现象:
粤语能加音素,为什么闽南语不行?照着粤语的方式改 symbols2.py,添加 min_symbols。
真相:
粤语有现成的预训练模型支持,闽南语没有。GPT-SoVITS 的预训练模型音素表是固定的(732个),添加新音素后变成 2966 个,和预训练模型不兼容。
教训:不同语言的集成方案不能直接复制,需要确认预训练模型是否支持。
坑 2:text_normalize 把声调数字转成中文
时间:数据处理阶段
现象:taibun 输出的 TLPA 是 Gua2 cit8 miau2,经过 text_normalize 后变成 Gua二 cit八 miau二。
原因:TextNormalizer() 会把数字转成中文(2→二,8→八),这对中文是好事,但对 TLPA 是灾难。
教训:闽南语的 text_normalize 只能做标点替换,不能调用通用的 TextNormalizer。
坑 3:assert len(norm_text) == len(word2ph) 断言失败
时间:训练数据准备阶段
现象:
大量数据被跳过,2-name2text.txt 里只有几十条。
原因:norm_text 是 TLPA 字符串 "Li2 ho2"(长度 6),word2ph 是 [2, 2](长度 2)。6 ≠ 2,断言失败,数据被丢弃。
教训:这个断言只对「汉字输入」有效,对「拼音输入」会误判。
坑 4:min_symbols 包含 4000+ 无用音素
时间:构建音素表阶段
现象:
从 taibun 词库直接导入了 4000+ 音素,包含大量无关内容(英文单词、汉字、缩写)。
真相:
音素表应该从训练数据中提取,而不是从词库中导入。训练数据只有 3000+ 句,实际音素只有 500-800 个。
教训:音素表要「数据驱动」,不要「词典驱动」。
坑 5:拆分声母韵母导致 UNK
时间:测试阶段
现象:python min.py 测试正常,但训练时出现大量 UNK。
真相:
测试不检查音素表,训练会检查。min.py 把 Li2 拆成 ['L', 'i2'],但音素表里只有 YLi2,没有 YL 和 Yi2。
教训:对 GPT-SoVITS,不拆分声母韵母,直接用完整音节作为音素。
坑 6:v2Pro 和 symbols2.py 不兼容
时间:训练前夜
现象:size mismatch for enc_p.text_embedding.weight: copying a param with shape torch.Size([732, 192]) from checkpoint, the shape in current model is torch.Size([2966, 192]).
真相:v2Pro 的预训练模型是用 732 个音素训练的,但 symbols2.py 加了 min_symbols 后有 2966 个。
教训:要么放弃 min_symbols(用 732 音素),要么放弃预训练模型(从头训练)。
坑 7:训练数据应该是拼音还是汉字?
时间:数据处理阶段
现象:
标注文件里写的是 Hit4 ho7 ……(拼音),但训练时 g2p 又把拼音当汉字处理。
真相:
GPT-SoVITS 的 cleaner.py 会根据语言调用对应的 g2p。如果 g2p 内部又调用 taibun 转换,就会把 TLPA 当作汉字二次转换。
教训:明确区分「训练输入是什么」和「推理输入是什么」。
坑 8:inp_wav_dir 路径设置错误
时间:数据预处理阶段
现象:
找不到音频文件,1-get-text.py 报错。
真相:list 文件里写的是 ImTong/SuiSiann_0001.wav,如果 inp_wav_dir 填了 /root/.../ImTong/,系统会找 /root/.../ImTong/ImTong/SuiSiann_0001.wav。
教训:inp_wav_dir 应该指向 list 中路径的上级目录。
坑 9:BERT 特征缺失
时间:数据处理阶段
现象:3-bert/*.pt 文件没有生成。
真相:1-get-text.py 里只对 zh 提取 BERT 特征。闽南语没有 BERT 模型,所以跳过。
教训:BERT 特征对 TTS 有帮助但不是必须的,闽南语可以跳过。
坑 10:taibun 库安装位置不对
时间:刚开始
现象:ModuleNotFoundError: No module named 'taibun'
真相:
WebUI 运行在 GPTSoVits conda 环境中,但 taibun 装在了 base 或其他环境里。
教训:确认运行环境,在正确的位置安装依赖。
📊 核心结论
| 问题 | 结论 |
|---|---|
| 闽南语能否加入 GPT-SoVITS? | ✅ 能,但有代价 |
| 要用预训练模型吗? | 用 → 只能 732 音素;不用 → 可以自定义音素,但需要大量数据 |
| 最小可行方案 | 732 音素 + 预训练模型 → 快速出声音,发音不纯 |
| 最优方案 | 收集至少 100 小时闽南语数据 → 从头训练 2966 音素模型 → 发音准确 |
| 8 小时数据够吗? | 够跑通流程,效果一般 |
🚀 给后来者的建议
- 先跑通再优化:先用 732 音素跑一个模型,听到声音再决定要不要深入
- 音素表从数据生成:不要从
taibun词库导入,从训练数据中提取 - 不要拆分声母韵母:直接用完整音节作为音素
text_normalize只做标点替换:不要调用TextNormalizer- 确认版本兼容性:
v2Pro不支持自定义音素表,用v2或v4 - 准备好数据标注:
wav_name|speaker|language|text,language必须匹配
💀 最终结论
在 GPT-SoVITS 中加入闽南语,最核心的问题是:
预训练模型的音素表是固定的(732个)。要自定义音素,必须从头训练,而从头训练需要海量数据和算力。
如果你只有几小时的数据,用 732 音素 + 预训练模型是唯一现实的选择。
记录时间:2026年7月2日
更多推荐

所有评论(0)