资讯动态

中文TTS课程设计源码包:从文本前端到HiFiGAN全链路解析

发布时间:2026/10/18 11:49:46 来源:尧图企业网站定制
简介这是一套基于深度学习的完整中文语音合成项目源码面向计算机、人工智能等专业学生及语音技术开发者可直接用于课程设计、期末大作业或毕业设计也适合作为从入门到进阶的实战参考。压缩包共60个文件以51个Python脚本为核心涵盖文本前端处理如CN_TN、拼音转换、声学特征提取Mel谱、Fbank、时长预测、声码器波形生成HiFi-GAN等全流程模块另含7个Markdown说明文档、1个YAML配置文件和1个HED问答文件整体大小仅159KB体积小巧但结构清晰。项目实现了Tacotron2、FastSpeech2、LightSpeech等主流TTS模型并提供训练与解码脚本能完整演示中文文本到语音输出的流程。代码划分模块化附带项目介绍与模型说明便于深入理解原理并扩展创新。目前已有242人学习下载适合需要高质量TTS参考实现作为课程设计与毕设支撑的读者。1. 中文语音合成拿源码直接改这份课程设计包能帮你少走三个月弯路中文语音合成是深度学习课程设计和期末大作业里公认“水最深”的方向之一网上开源项目不少但多数只覆盖单条链路要么只有声学模型没有声码器要么中文前端处理缺一环跑到一半就断在数据格式上。这份源码包的价值在于它是一个成体系的课程设计项目从中文文本规范化、韵律标注、拼音转换到 Tacotron2、FastSpeech2、LightSpeech 三条声学模型路线再到 HiFiGAN 神经声码器训练脚本、推理脚本、数据集准备工具全都有适合计算机、人工智能、电子信息等专业的学生直接拿来做毕业设计或期末大作业的起点。它不只是一个能跑通的 Demo而是一套让你看清 TTS 全链路里每个环节是怎么连起来的中文语音合成项目源码这也是我拆完整个包之后最直接的感受。2. 拆解源码包五条合成管线与它们的协作关系2.1 先读懂根目录脚本与子项目的功能地图解压之后一眼扫过去根目录下既有train_acoustic.py、prepare_features.py、train_duration.py、train_mel.py这类与数据准备和声学模型训练相关的脚本又有EasyMerlin、tacotron2、fastspeech2-vc、hifigan、lightspeech等多个子目录初次接触会有点懵。我拆包的习惯是先不看代码而是把目录树按“输入处理、声学模型、声码器、工具脚本”四类画一张对应表这样后面调试时才知道该去哪个文件夹里找问题。目录 / 文件类型在管线里的作用cn_tn.py、txt2pinyin.py中文前端文本规范化、汉字转带声调拼音labcnp.py、labformat.py、mandarin_frontend.py中文前端生成 HTS 格式的上下文相关标注含韵律边界prepare_features.py、check_data.py数据准备校验音频与文本对齐、提取梅尔谱和时长特征tacotron2/声学模型自回归基线输入音素序列输出梅尔谱fastspeech2-vc/、fastspeech2_vc声学模型非自回归语音转换与合成lightspeech/声学模型轻量化非自回归合成训练收敛快hifigan/声码器把梅尔谱还原成可听的语音波形deepspeaker/、mtts/辅助模块说话人特征、前端工具集这张表对应到实际训练流程里是一条完整的数据流水线先拿mandarin_frontend把中文文本拆成带韵律标记的音素序列再用prepare_features把音频切成帧并提取梅尔谱然后声学模型学习从音素序列到梅尔谱的映射最后 HiFiGAN 把梅尔谱合成为波形。任何一个环节断裂比如前端给不出标注或者声码器训练不收敛最终合成音频都会出问题这也是它比单模型开源项目更适合做课程设计的原因——你能完整看到每一层输入输出长什么样。2.2 tacotron2 子目录从文本到梅尔谱的自回归基线tacotron2/里是完整的训练与推理脚本train_tacotron2.py负责模型训练decode_tacotron2.py负责从训练好的模型合成语音extract_duration.py用来从注意力矩阵中估计音素时长tacotron_dataset.py负责把文本前端输出的音素序列和音频特征组成 batch。这个子目录选型是典型的课程设计思路——Tacotron2 发表于 2017 年结构透明、原理讲解多、调参资料丰富作为毕业设计的“主模型”写进论文里评审老师不会觉得你在炫技但能看出你对注意力机制和自回归生成有基本理解。从代码结构上看这个实现把文本前端和声学模型解耦得非常干净tacotron_dataset.py接收的输入不是原始中文文本而是mandarin_frontend处理后的音素 ID 序列。我特别看了一下数据读取逻辑它会动态打乱 batch 并对梅尔谱做帧级别的归一化这两点在训练自回归模型时非常关键。如果跳过归一化直接训练损失曲线前几百步会震荡得厉害看起来像是梯度爆炸其实是特征尺度不一致导致的。我一般会在这个阶段先用一句话文本过一遍decode_tacotron2.py确认模型能输出一个形状正确的梅尔谱文件再开始正式训练这样在课程设计答辩时也能演示“中间表征可视化”这一环。2.3 hifigan 子目录神经声码器的训练与推理细节hifigan/不只是一个声码器脚本集合里面还有train_hifigan.py、train_hifigan2.py、train_melgan.py、train_melgan_stft.py说明作者在声码器选择上做了多版本对比——MelGAN、HiFiGAN 和带 STFT loss 的改进版本都留了训练入口。这在课程设计里是很加分的写法同一份梅尔谱用不同声码器还原听感差异非常直观论文里的主观测评表也自然有了素材。HiFiGAN 的训练逻辑值得单独说一句它的判别器在训练过程中会把生成器的重建误差和对抗损失同时计入梯度所以训练初期的音频会带明显金属音这时候不要急着关掉训练去合成测试。我拆包时发现train_hifigan.py里有一个很实用的设计——周期性地把当前生成器产出的样本写入日志目录这样你能实时听到模型从“刺啦刺啦”到“接近自然说话声”的变化过程。第一次跑这个脚本的同学常犯一个错用默认参数直接训结果显存不够、batch size 被系统自动调小最终声码器欠拟合。这个包里的audio_mel_dataset.py支持动态加载我建议显存吃紧时优先缩减音频长度而不是缩小 batch size这样音质损失更小。2.4 fastspeech2-vc 与 lightspeech非自回归和轻量化的两条路线fastspeech2-vc/和lightspeech/这两个目录放一起看很有意思。前者把 FastSpeech2 用在语音转换上属于音色迁移场景后者用更小的模型结构、更少的注意力层做中文合成训练速度快很多。如果你做的是课程设计而不是科研项目我强烈建议主用lightspeech路线因为它对数据量要求低三四小时的中文单说话人数据就能训练出一个听感不错的模型训练时间缩短到 Tacotron2 的几分之一。我对比了两个目录的模型实现lightspeech.py结构上更轻——减少了 self-attention 层数、FFN 隐藏维度也更小但保留了 FastSpeech2 的 variance adaptor 结构这意味着时长预测和能量预测这些关键能力并没有被削弱。decode_lightspeech.py提供了一个很直观的入口你给它一句中文文本它先走前端标注再经声学模型生成梅尔谱最后调用 HiFiGAN 输出 wav 文件。这特别适合期末大作业演示——答辩现场输入一句话几秒钟后播放合成语音效果比放一段预先录好的音频有说服力得多。3. 中文文本前端从汉字到音素标注的完整链路3.1 文本规范化与拼音转换cn_tn 和 txt2pinyin 的配合中文 TTS 与英文 TTS 最大的区别在于前端处理英文基本按字母拼读即可中文却要把汉字转成带声调的拼音还要处理数字、英文缩写、标点符号这些非汉字内容。cn_tn.py做的就是第一步——文本规范化它把“2024年”改成“二零二四年”、把“3.14”改成“三点一四”这类自然口语读法txt2pinyin.py则接在后面把规范化后的汉字转成带数字声调的拼音串。我读了一遍代码逻辑发现它的实现思路是逐字符扫描加最大匹配分词所以对“重庆”“银行”这类多音字词组的处理依赖内置词典。# 常见调用方式先规范化再转拼音 from cn_tn import Tn from txt2pinyin import Txt2Pinyin tn Tn() normalized tn.normalize(我在2024年买了3本书。) # 输出我在二零二四年买了三本书。 pinyin Txt2Pinyin().convert(normalized) print(pinyin) # 预期输出格式wo3 zai4 er4 ling2 si4 nian2 mai3 le5 san1 ben3 shu1 。这段代码的逻辑说明cn_tn.py处理的是“读法一致性”问题数字不急转弯改成汉字读音合成出来的听起来就像在念代码而不是说话txt2pinyin.py返回的拼音串带声调数字这样后续的mandarin_frontend才能把相同的发音归类到一起。参数层面需要注意的一点是convert方法对轻声的处理是看词典里有不有标注比如“了”在词典里标le5但实际语流里经常读轻声这里就需要自己在词典里加一条。3.2 韵律标注HTS 格式与 labcnp 的边界标记labcnp.py、labformat.py这两个文件是中文前端里最容易忽略、也是最影响听感的部分。labcnp负责给拼音序列加上韵律边界标记HTS 格式里常见的做法是用#0表示词内无停顿、#1表示词间小顿、#2表示短语边界、#3表示句边界labformat.py则把这些标记拼接成标准 HTS label供声学模型学习时长和停顿。# 查看某个音素标注的效果示意 python labformat.py --input wo3 zai4 er4 ling2 si4 nian2 --prosody #0 #1 #2这段命令行参数说明第一个参数是带声调拼音串第二个参数指定韵律标记层级labformat.py会把它们组合成类似sil #0 wo3 #1 zai4 #2 er4 ling2 si4 nian2 sil的序列。标记层级越多声学模型越容易学到自然停顿但标注工作量也越大。这个包里用的 Baker 标准数据集本身就是带韵律标注的所以如果你自建数据需要先跑一遍自动韵律切分否则#2以上的标记缺失会让模型完全学不到短语间停顿合成的句子听起来像朗读版“机关枪”。3.3 自建中文数据集时前端最容易断的一环自建数据时大家通常把精力花在录音上但真正卡住训练的是标注文本的格式。这个包里的tacotron_dataset.py读取标注文件时默认按“文件名加空格加文本”的格式解析如果你从网上爬的中文语料带 HTML 标签或者全角半角混杂cn_tn.py会输出意料之外的结果。我通常在自建数据时先跑一遍check_data.py它会把每个 wav 对应的文本转成拼音再转回来如果发现 unmatched 字符就自动报错。这一步能过滤掉绝大多数标点符号和特殊字符导致的训练中断。多音字是这个前端框架的另一个边界点“行”在“银行”和“行走”里读音不同txt2pinyin.py的词典覆盖不全时会退回到词频最高的读音合成出来就是错音。解决办法是在自己的词典文件里追加词组级别的注音比如“银行 yin2 hang2”“行走 xing2 zou3”让最大匹配分词优先命中词组而不是单字。这也是为什么这个包在课程设计里很适合做“前端改进”方向的切入点——你完全可以在论文里写“对多音字词典进行扩展提升单词准确率”工作量可控且效果能量化。4. 跑通训练全流程以 Tacotron2 加 HiFiGAN 为例4.1 数据准备目录结构、文本标注与特征提取这个包的数据组织思路和大多数 TTS 开源项目一致一个数据集目录下分wav和txt两个子目录文件名一一对应。prepare_features.py会先扫描全部 wav提取梅尔谱到feats目录同时把文本通过前端转成音素 ID 序列存成.npy文件。我先建一个最小测试集只放五条音频验证整条链路能不能走通。# 准备数据以项目内数据集为例按实际路径修改 python prepare_features.py \ --data_root data/baker \ --wav_dir wav \ --txt_dir txt \ --feat_dir feats \ --sample_rate 22050 \ --n_mels 80 \ --hop_length 256这段命令的参数含义sample_rate决定 wav 加载时是否重采样中文合成一般用 22050Hz和 HiFiGAN 预训练配置一致n_mels是梅尔滤波器组数量Tacotron2 标准配置用 80如果你的前端标注或声码器用的不是 80后面拼接时会直接报维度错误hop_length是帧移256 对应 22050Hz 下约 11.6ms 一帧。我建议第一次跑通时全部用默认参数不要做任何改动因为声学模型和声码器之间的梅尔谱维度是互相约定的改一个数就要同步改三处。4.2 训练声学模型train_tacotron2 的参数与监控指标数据准备完成后进入声学模型训练阶段。train_tacotron2.py支持的常见参数包括 batch size、学习率、最大训练步数、日志输出间隔以及是否从 checkpoint 恢复训练。第一次训练课程设计用的模型我把 batch size 设为 8学习率 1e-3用单张显卡训练预计两到三个小时能出一个能听的效果。# 训练 Tacotron2 声学模型 python train_tacotron2.py \ --data_root data/baker \ --checkpoint_dir ckpts/tacotron2 \ --batch_size 8 \ --lr 1e-3 \ --max_steps 100000 \ --log_dir logs/tacotron2这里checkpoint_dir和log_dir分开设置有一个好处课程设计后期要多次换参数实验日志越界容易混淆checkpoint 独立存放可以随时回滚到上一个能用的版本。训练过程中我主要盯两个指标一是 loss 曲线是否平滑下降而不震荡二是验证集上合成的音频里有没有出现“糊成一团”的音节。如果 loss 降到某个值就停滞但合成音频还能听说明模型容量够用继续跑只是过拟合如果 loss 还在降但音频出现重复的机械音往往是注意力对齐出了问题这时候要停一下看看注意力矩阵的可视化图。# 用训练好的模型合成一句话 python decode_tacotron2.py \ --checkpoint ckpts/tacotron2/checkpoint_100000.pth \ --text 这是一个课程设计的中文语音合成演示。 \ --output wavs/demo.wav解码参数说明checkpoint指定权重路径text是待合成的文本output是生成的 wav 路径。这个脚本会先走一遍前端标注再进模型推理输出的 wav 会是未加声码器的梅尔谱经 Griffin-Lim 粗略还原的版本音质比较“闷”。这是正常的因为声学模型的输出目标是梅尔谱而不是波形想要清晰音质需要接 HiFiGAN。4.3 训练声码器并完成联调HiFiGAN 的训练目标是把梅尔谱映射回原始波形我这里直接用包内脚本训练一个声码器# 训练 HiFiGAN 声码器 python train_hifigan.py \ --data_root data/baker \ --feat_dir feats \ --checkpoint_dir ckpts/hifigan \ --batch_size 16 \ --lr 2e-4 \ --max_steps 300000训练完声码器后把 Tacotron2 生成的梅尔谱文件交给它做波形重建才算完成一次完整的合成。我在实际联调时发现一个参数对齐问题prepare_features.py里n_mels设成 80但train_hifigan.py的配置文件里如果n_mels保持默认的 80 就能直接对上如果你之前因为显存问题改过特征参数这里就白训练一场。建议把特征提取、声学模型、声码器三个环节的n_mels、hop_length、sample_rate三个参数固定写在一个config.py里统一引用这个包里的config.py就是干这个事的。5. 避坑清单中文合成训练中最容易翻车的五个细节5.1 合成全是一连串“嗯嗯”声完全不像说话现象模型训练了很长时间loss 也降了但合成出来的音频像喉咙里发出的连续浊音没有辅音和字与字之间的间隔。原因声学模型和声码器之间出现了特征分布不匹配。常见于你用了自己的音频数据但前端标注的停顿符号和原始数据集的分布不一致模型学到的是“每个字都拖长音”的模式。另一个常见原因是 Tacotron2 的注意力矩阵发散解码时反复读取同一个编码状态。解决先回去看注意力矩阵的可视化图如果对角线规律清晰说明对齐没问题问题在特征分布上如果矩阵混乱把学习率降低到原来的十分之一重新训练几百步。我通常会把解码器的prenet丢弃率从 0.5 调低到 0.3这个改动对注意力收敛的影响比调学习率更直接。5.2 文本里有中文标点直接报错或合成静音现象输入“你好世界”时前端处理正常但输入带英文逗号“,”或全角空格时标注数量少了一截训练时直接报维度不一致错误。原因cn_tn.py对标点的处理范围是有限的中文句号、逗号、感叹号能正确转成停顿标记但英文标点、全角空格、特殊符号没有被映射到任何音素 ID 上。解决在文本进入前端之前先做一层清洗把英文标点统一替换成中文标点或者直接删除。我在自己的调用链里加了一个小函数text text.replace(,, ).replace(., 。)别小看这一步它能省掉大量无效报错排查时间。5.3 训练显存溢出但调小 batch size 后音质急剧下降现象Tacotron2 训练时 OOM于是把 batch size 从 16 调到 4之后合成音频明显变糊字与字之间的边界模糊。原因自回归模型对 batch size 很敏感batch 太小会导致梯度估计噪声大模型训练不稳定同时帧级别的归一化统计量也受 batch 影响小 batch 下均值和方差波动更剧烈。解决优先缩短音频最大长度而不是减小 batch size比如把训练数据截断到 10 秒以内其次开启混合精度训练这个包支持在训练参数里加--fp16能让显存占用减少约一半。如果机器确实跑不动可以换 LightSpeech 路线它结构轻对 batch size 的要求低很多。5.4 合成时数字读法错误“123”读成“一百二十三”而不是“一二三”现象输入“房间号是 123”合成结果读成“一百二十三”语境上应该是“一二三”。原因cn_tn.py的规范化规则是全局的它优先把数字转成数值读法而不是数字串读法。电话号、房间号、年份这些场景里数字应该逐个读出但规则引擎无法感知语境。解决在文本规范化之前对数字做正则预处理——把需要逐字读的数字替换成中文数字串比如“123”替换为“一二三”再走正常流程。这个包里的cn_tn.py逻辑是线性扫描的你在它之前插入一层自定义规则即可不用改动原有代码。5.5 训练速度很快但合成结果像是“机器人在念稿”现象LightSpeech 训练几百步后 loss 已经很低合成音频每个字都清楚但听感平淡没有自然语调起伏和停顿。原因非自回归模型依赖 variance adaptor 预测时长和能量如果训练数据里句子偏短、韵律变化少模型学的时长就是均值回归所有音节等长自然没有抑扬顿挫。解决不要只盯着 loss要去听验证集的样本同时加入更多带问句和感叹句的数据。另外一个技巧是把lightspeech.baker.v2.yaml配置文件里的duration_prediction和energy_prediction两个开关打开让模型显式学习韵律变化而不是从注意力矩阵间接推断时长。6. 把 LightSpeech 用起来快速迭代出可用中文 TTS 的验证方法目录里的lightspeech.baker.v2.yaml是 LightSpeech 的推荐配置它以 Baker 中文数据集为基准声学模型目的是把音素序列映射为梅尔谱声码器沿用 HiFiGAN。这里有个值得注意的细节LightSpeech 是非自回归模型推理时一次性并行生成完整梅尔谱不像 Tacotron2 逐帧输出所以训练稳定性更好适合在课程设计后期做快速迭代实验。配置里常见的n_mels: 80、hop_length: 256与声码器的特征约定一致改动前先确认三处同步。# 训练 LightSpeech先改配置里的数据路径 python train_lightspeech.py --config lightspeech/baker.v2.yaml # 快速合成一句测试文本 python decode_lightspeech.py \ --checkpoint ckpts/lightspeech/checkpoint_50000.pth \ --text 今天天气不错适合出去散步。 \ --vocoder ckpts/hifigan/checkpoint_300000.pthdecode_lightspeech.py里有一个参数--speed它控制合成语速倍率。课程设计答辩现场演示时我喜欢把它设成 1.0 展示自然语速再设 1.2 展示模型对时长预测的控制力——这个细节在答辩时能明显撑起“我对模型原理理解到位了”的印象分数。验证方面除了用耳朵听我每次迭代都会保留五句固定的评测文本分别覆盖陈述句、疑问句、数字读法和多音字场景跑完和上一个版本并排播放做 AB 对比比看 loss 曲线可靠得多。从那次之后我每个 TTS 项目都强制走一遍“固定评测集加权听感打勾”的流程筛掉了很多听起来不错但经不起细听的版本。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑