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.pyLi2 拆成 ['L', 'i2'],但音素表里只有 YLi2,没有 YLYi2

教训:对 GPT-SoVITS,不拆分声母韵母,直接用完整音节作为音素。


坑 6:v2Prosymbols2.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 小时数据够吗? 够跑通流程,效果一般

🚀 给后来者的建议

  1. 先跑通再优化:先用 732 音素跑一个模型,听到声音再决定要不要深入
  2. 音素表从数据生成:不要从 taibun 词库导入,从训练数据中提取
  3. 不要拆分声母韵母:直接用完整音节作为音素
  4. text_normalize 只做标点替换:不要调用 TextNormalizer
  5. 确认版本兼容性v2Pro 不支持自定义音素表,用 v2v4
  6. 准备好数据标注wav_name|speaker|language|textlanguage 必须匹配

💀 最终结论

在 GPT-SoVITS 中加入闽南语,最核心的问题是:

预训练模型的音素表是固定的(732个)。要自定义音素,必须从头训练,而从头训练需要海量数据和算力。

如果你只有几小时的数据,用 732 音素 + 预训练模型是唯一现实的选择。


记录时间:2026年7月2日

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐