TTS 架构的六代演进(二):第 1-2 代 · 拼接合成与 HMM-TTS
本篇是「TTS 架构的六代演进」系列第 2 篇。TTS 的前两代跨度大约 20 年(1990-2010),主线是生成的粒度和方式从取真人录音直接拼演进到用统计模型采样参数。这两代都还是前神经网络时代——一代把音色物化成几十 GB 的录音库,另一代把音色压成几十 MB 的概率参数模型。每一代出现都是为了解决上一代的一个具体工程痛点,读起来会有明确的因果链。这两代作为独立商业方案早就被神经 TTS 完全替代了(工业界大约 2015 年后就不再用这两代做新音色)——2025 年还专门讲一篇,四点理由:建立坐标系——神经 TTS 每一代都是对前代痛点的回应:mel 谱替代 F0MCCBAP 手工参数、duration predictor 神经化 HMM 时长、GAN / diffusion 反制 MLPG 平均化。不懂 Gen 2 过度平滑,就理解不了后面几代的设计动机概念遗产——TN / G2P / 韵律预测三段前端至今是标配、Kaldi 强制对齐仍是 FastSpeech 系提取 duration 的标准工具、HTS quinphone 影响了后续音素标注规范元视角——存原声 vs 存参数的分野贯穿六代:Gen 3-6 各种花活(mel / VAE latent / codec token)都是在参数化范式内演化,没有一代跳回 Gen 1 的存原声路线反面教材——拼接痕迹 / 过度平滑是教科书级的两种失败模式,在今天零样本克隆、扩散 TTS 低 CFG 等场景下仍以变种形式出现一句话:理解一门技术为什么演成现在这样,得从它演化史的起点看起。每一代下面都按同一个 6 段模板讲:原理 → 前端 → 声学模型 → 声码器 → 音频 听感 短板 → 数据流。跨代阅读时可以直接跳到Gen X 的声学模型和Gen Y 的声学模型对比。一、第 1 代 · 拼接合成 Unit Selection本代一句话——文本变音素,音素去录音库里找真人片段,拼起来。Gen 1 有一个跟后面所有代都不同的特点——它没有神经意义上的声学模型和声码器。整个 pipeline 只有前端 检索 拼接三个真实存在的模块合成动作退化成从真人录音库里查片段 首尾平滑粘起来。1.1 原理真人录音的可控排列组合拼接合成的核心哲学非常朴素——既然要合成人声最像人的东西就是真人的原声本身。1990 年代后期到 2000 年代,商业级高自然度 TTS 的主流路线是拼接合成 / unit selection。做法可以类比成一种声学版的活字印刷——活字印刷的拆字 → 拣字 → 排版 → 印刷四步,对应到 TTS 里就是切片 → 检索 → Viterbi 排序 → PSOLA 拼接:先把一个人的声音拆成一大堆最小可复用的碎片(拆字),需要合成任意一句话时,在碎片库里挑合适的(拣字)、按顺序摆好(排版)、首尾平滑粘起来(印刷)。这一代的音色跟后续所有代都不同——先厘清这个词指一位特定发音人的、可以合成任意句子的声音产品(比如 iOS 里的 “Samantha”、导航 App 里的林志玲版)一个音色 一位发音人的一次完整录制工程(录音棚 30-50 小时素材)。Gen 1 是唯一存原声的一代,Gen 2 及以后全部改成存参数:存参数派 (Gen 2 HMM-TTS / Gen 3 神经 TTS)音色 一组模型参数(Gen 2 存 HMM GMM 的概率分布参数, 几十 MB;Gen 3 存神经网络权重, 几十到几百 MB.pth/.onnx)——存的是抽象的配方,跟训练数据时长无关,训完原始录音就可以丢存原声派 (Gen 1 拼接合成)音色 整个原始 wav 录音库 几 MB metadata 索引表——索引可忽略,体积全在录音上。粗算 30 小时 × 24 kHz × 16 bit(2 byte/sample) 5.18 GB;48 kHz × 50 小时 17.28 GB买一个拼接合成的音色本质上是买那位发音人的整个录音库使用权——换一位发音人就得从头录 30-50 小时没有训练这个可复用步骤。1.2 前端TN → G2P → 韵律预测沿用传统 TTS 的三段规则系统占整个 Gen 1 开发工作量的 60%TN(文本规范化, Text Normalization)把数字、日期、缩写、金额、URL 展开成读音同时做分句和分词。$3.14→three point one four dollars12/25→December twenty-fifthDr.→Doctor192.168.1.1→one nine two dot one six eight ...G2P(字素转音素, Grapheme-to-Phoneme)查发音词典(英文 CMU dict、中文汉字-拼音表)词典外的词用规则回退(英文 LTS letter-to-sound rules、中文分词后拼音调号)。多音字消歧在这一步——中文的重读 zhòng 还是 chóng、英文的read读 /riːd/ 还是 /rɛd/靠 POS 词性 上下文规则判断韵律预测(Prosody Prediction)用规则或 CART 决策树预测韵律边界(短语切分)、重音位置、音高轮廓、每个音素的目标时长前端跑完hello world变成HH(词首/重音/pitch ~140/duration ~70) → AH0(…) → L(…) → OW1(…) → W(词首/次重音/…)这样一串带韵律标注的音素序列——就是目标位置的属性描述准备喂给下一段做检索。这套结构在 Gen 2 HMM-TTS 里几乎一模一样保留Gen 3 Tacotron 之后 G2P 和韵律预测才开始被 char embedding 部分吸收进网络TN 至今仍是独立模块。1.3 声学模型不存在—— 用 Unit 库检索 Viterbi 搜索代替这一代没有现代意义上的声学模型——也就是没有一个从文本预测中间声学表征(mel 谱 / 声学参数 / latent)“的独立模块。但从广义建模的视角看,拼接合成把这一职责分散到 target_cost / concat_cost、决策树、韵律模型、检索搜索里了——目标位置的属性、候选打分、韵律轨迹都是各种小模型输出的。这里没有声学模型是相对于神经 TTS 的模块划分方式说的:直接跳过了生成中间数值表征这一环——目标位置属性 → 库检索 → 真人录音片段。合成动作退化成查表”,没有任何数值型的中间表征被生成出来。实际替代声学模型角色的是四步检索 搜索机制。① 录音 切片找一位发音人录 30-50 小时语料。录完后用强制对齐(forced alignment)工具把每个音素在时间轴上的起止位置定位出来切成 5-100 ms 的小片段(unit)。切片粒度有多种选择,工业界主流是双音子级(diphone)——以音素过渡区为单位,从上一个音素的稳态中间切到下一个音素的稳态中间。选它的原因是拼接点落在稳态区、痕迹最小(音素级切在过渡区痕迹最多,音节级痕迹最少但库要几倍大)。以 diphone 为例hello会切成#-HH、HH-AH0、AH0-L、L-OW1、OW1-#五段。② 给每个 unit 打元数据 metadata每一个切好的 unit 都会附一堆元数据——这些元数据是后面搜索时用来打分的钥匙。某段HH-AH0diphone 的条目大概长这样unit_id:4237diphone:HH-AH0left_context:...# 前面接的音素/词right_context:L# 后面接的音素pos_in_word:word_initial# 词首 / 词中 / 词尾stress:1# 重音标记 (0无, 1主重音, 2次重音)pitch_mean:142# 基频均值 Hzpitch_slope:12# 基频斜率 Hz/sduration:68# 时长 msenergy_mean:-18# 能量 dBsource_wav:reader_042.wav# 原录音文件offset:3.24# 在原文件里的起始秒数length:0.068# 从 offset 处切多长数据库本身不重复存音频——每条 unit 只用source_wav / offset / length三个字段指向原 wav 里的一段位置需要时按位置从原 wav 读几十毫秒字节。原始几十小时录音整段原封不动地留在磁盘上切片只发生在 metadata 记录里音频文件本身没被动过。③ 候选查询以hello world里第一个HH-AH0位置为例目标属性(前端算出来的)词首、主重音、目标基频约 140 Hz、目标时长约 70 ms数据库里所有HH-AH0diphone 都是候选——同一发音人在不同上下文里念过很多次通常有几百到几千个先按硬约束筛(比如必须是词首)再按软约束(pitch / 时长 / 重音贴近目标)打一个 target_cost 分④ Viterbi 全局搜索每个位置独立选一个 target_cost 最低的候选就够了吗不够——相邻两个 unit 的接缝也要平否则粘上去会跳戏。所以每一步实际上要看两项代价target_cost这个候选单独跟目标位置有多贴(pitch / 时长 / 重音 / 位置)concat_cost这个候选跟下一位置候选在接缝处的落差(结尾 pitch / 能量 / 共振峰 vs. 下一段开头)举例说明二者的博弈HH-AH0位置的候选 A(142 Hz)各项都贴目标、target_cost 最低。但如果 A 结尾 pitch 148 Hz而所有能接的AH0-L候选开头 pitch 都在 130 Hz 左右——A 后面这一步 concat_cost 就飙高全局代价反而不如选 target_cost 稍高的 B(165 Hz、结尾 pitch 158 Hz)。Viterbi 用动态规划(DP)在指数级候选组合里、以O(N·K²)复杂度找出总代价最低的路径(N 是目标音素数、K 是每位置候选数)。代表系统ATT Natural Voices、Festival 的 MultiSyn 引擎、CereProc。Siri 首发时(iOS 5, 2011)使用的 Nuance 拼接合成引擎是这一代商业顶端的代表。Windows XP 的 Microsoft Sam(2001)和 Vista 的 Anna(2007)也属于前神经网络时代商业语音——严格说 Sam 更接近 diphone / formant 混合风格的早期 SAPI voice,Anna 是后期偏拼接的系统,两者跟大库 unit selection 不完全同类,但都属于同一时代的商业 TTS 代表。训练?——不需要。Unit 库不是训练出来的,而是通过强制对齐半自动构建:发音人录完 30-50 小时,用 forced alignment 工具(比如 HTK、Kaldi 的 MMI 对齐器)自动把每个音素的时间戳标出来,再按音素/双音子边界切片、批量提取 pitch/duration/energy 等属性入库。整个过程零神经网络前向,也没有 loss / 反向传播——只是数据处理 索引构建,更像做数据库 ETL,不像做机器学习。推理时遇到训练里没见过的文本怎么办?——Gen 1 的泛化机制是库覆盖率兜底:前端(TN G2P 韵律)保证任意文本都能变成音素 韵律标签序列,然后每个位置都在 unit 库里找匹配候选。只要 30-50 小时录音覆盖了目标句里所有的 diphone,合成就能进行。真正的问题是目标属性跟库里候选的差距——比如你要一个 pitch 极高的HH-AH0(惊喜语气),但库里所有HH-AH0都是新闻朗读的中性 pitch,target_cost 会飙高,合成出来听感用力不对;极端场景(生僻字、超长专名、唱腔、极端情绪)常常直接出现拼接痕迹加重、断字甚至无音——这就是拼接合成不可控这条短板的技术本质。1.4 声码器不存在—— 用 PSOLA 平滑拼接代替这一代也没有神经意义上的声码器。神经 TTS 里声码器的职责是从中间声学表征(mel / codec token / latent)还原时域波形但 Gen 1 的中间态本身就是波形碎片——不需要还原只需要粘。粘的操作叫PSOLA(Pitch-Synchronous Overlap and Add)——它的关键不是过零点淡入淡出这么简单,而是基音同步:先在每个 unit 上打基音标记(pitch mark)(每个基音周期一个),然后按基音周期切窗、按基音周期拼接、按基音周期做 overlap-add。这样的好处是拼接过程中可以顺便做:F0 调整——把两个 pitch mark 之间的窗口在时间轴上压缩 / 扩展,基音周期变短(音调升高)或变长(音调降低)时长调整——重复或跳过若干个基音周期窗口,让 unit 的实际播放时长贴近目标能量归一化——各 unit 之间的音量差异靠窗内幅值调整抹平也就是说 PSOLA不只是粘,还带轻量级的 F0 / 时长 / 能量修改能力——这是 diphone 合成(Festival Kal 这种)能只靠 ~2000 个片段合成任意韵律的关键。相比之下,大库 unit selection 主要靠 Viterbi 挑到合适的候选,PSOLA 的修改幅度可以小一些。严格说 PSOLA 不是声码器——它不做任何频→时的还原只做时域拼接。后面几代讲的声码器才是真正的从中间表征生成波形的模型。训练?——不需要。PSOLA 是解析式 DSP 算法,没有可训练参数——只需要在合成时对每对相邻 unit 做过零点检测 短窗淡入淡出。Gen 1 整条链路里唯一需要数据的地方就是那个 30-50 小时的 unit 库本身,而那也不是训练,是录音标注。1.5 音频、听感、短板、退场三个绕不过去的问题拼接痕迹即使 concat_cost 优化得再好两段不同录音在过零点、音量、基频上永远有小的不匹配听感上表现为卡顿或缝隙。降低这个缝隙的唯一办法是让 unit 库覆盖更全——也就是录更多数据数据成本换一个发音人 重录 30-50 小时 重新标注。工业界一个音色的成本在数十万人民币量级商业公司只做几个招牌音色是有原因的不可控想让同一个音色带上生气的情绪只能重录一份生气语料。想让它读一句训练集里没见过的绕口令、或者一个包含大量生僻字的地名拼接质量急剧下降用耳朵体会一下——本系列会把同一段英文评测句The quick brown fox jumps over the lazy dog.(经典 English pangram, 含 26 字母)喂给六代所有 TTS 系统wav 文件跟本文一起附出来可以直接对比。Gen 1 用的是 Festival 的Kal diphonevoice——diphone 合成是拼接合成家族的一个简化分支(靠 1500-2000 个预录制的双音子片段 规则驱动的 PSOLA 修改时长/音高来拼合成),Unit Selection 则是同一代的数据驱动进阶版本(用几十小时录音 Viterbi 从大库检索最佳候选)。两者都属于数据驱动 拼接这一代,但 Kal 是最简、最典型的开源实现,能把拼接合成的结构性痕迹演示得最清楚:# conda install -c conda-forge festival# 再从 festvox.org 下载 kal_diphone CMU/POSLEX 词典解压到 $CONDA_PREFIX/share/festival/importsubprocess STELLAThe quick brown fox jumps over the lazy dog.subprocess.run([text2wave,-o,gen1_festival_en.wav],inputSTELLA,textTrue,checkTrue)# 输出16 kHz 单声道 wav, 3.77 秒——共振峰断裂、语调平板、phone 边界有轻微 click是这一代的典型痕迹。Kal 只是 diphone 简版商业旗舰(ATT Millennium、CereProc)在广播级新闻朗读上能做到接近真人代价是窄语料域 百小时录音打底。拼接痕迹在 mel 谱上长什么样——把 Gen 1 Kal 输出和 Gen 2 Neural HMM 输出的 mel 谱叠起来对比,能看到前神经网络时代两种截然不同的失败模式:上半红色是 Gen 1 拼接合成:mel 谱可见明显的竖向条带——每一条对应一个 diphone 边界处的能量突变,就是拼接痕迹在时频域的可视化。下半紫色是 Gen 2 Neural HMM:mel 谱没有竖向条带(状态间参数插值让波形连续),但共振峰边界模糊、高频细节缺失、整体偏糊——这就是过度平滑的时频表现。拼接合成没有死——旗舰 MOS(平均意见分, Mean Opinion Score) 在广播新闻这类窄场景里依然有边际优势——但两个新的商业约束把它推出了主流移动端装不下几十 GB 的 unit 库、多音色定制爆发让重录 30 小时的成本不可接受。1.6 数据流每一步的形态Gen 1 是这个系列的起点没有前一代可对比。把从文本到波形每一步的形状 / dtype / 单位列出来作为后面各代 diff 的参照步骤数据形态说明输入文本str(UTF-8)原始字符串TN 后str, 规范化数字 / 日期 / 缩写展开成纯字母词G2P 后List[str], 音素序列ARPABET 或 IPA韵律标注后List[dict], 每音素带 5-10 维上下文属性phoneme pos_in_word stress target_pitch target_duration …Unit 查询List[List[int]], 每音素对应几百到几千候选 unit_id硬约束筛后 target_cost 排序Viterbi 选路List[int], 每音素选中一个 unit_id综合 target_cost concat_cost 的全局最优路径剪切 拼接从原 wav 按offset/length剪出片段过零点 PSOLA 平滑每段几十毫秒 int16 PCM输出波形int16 PCM, shape(N,), sr 16 kHz单声道最终合成本代特点全程零 float 前向、零神经网络——所有生成都是在 wav 数据库里查 剪 拼。中间态没有 mel / 也没有 F0 / 也没有 latent就是原始录音片段的引用序列。信息压缩率为零音色体积 ≈ 原始录音体积。承上启下——Gen 1 用真人录音拼出了可用的 TTS,但数据成本(30-50 小时/音色)、拼接痕迹、不可控这三个短板让研究者开始寻找更紧凑的方案。把整段录音替换成一组概率分布参数——这是 Gen 2 统计参数合成 (SPSS) 的核心突破。二、第 2 代 · 统计参数合成 HMM-TTS本代一句话——文本变 HMM 状态序列,状态生成 F0 / MCC / BAP 参数轨迹,参数式声码器合成波形。2.1 原理不存原声只存配方统计参数合成(Statistical Parametric Speech Synthesis, SPSS) 的核心哲学:不存原声,只存一组配方。类比成音乐领域拼接合成是磁带库(存声音本身)SPSS 是乐谱库(存演奏参数)——跟 Gen 1 里活字印刷比喻的角度不同:活字印刷讲的是拼接过程(拆片 拣片 排版),磁带库 / 乐谱库讲的是存储范式(存声音 vs 存参数)。核心做法是参数化 概率建模 参数式合成——把每段声音抽成一组低维声学参数(基频 谱包络 非周期比)用概率模型(HMMGMM)建模这些参数的分布合成时从模型采样参数再交给参数式声码器还原成波形。一个音色的模型从拼接时代的几十 GB 压缩到几十 MB存的不是波形而是概率分布参数——移动端第一次装得下完整 TTS而且可以做参数插值 / 情感变换 / 少量数据自适应这些是拼接合成完全做不到的。“换音色从重录 30-50 小时变成用 5-10 分钟录音做 MLLR 自适应”,成本降三个数量级——这是 SPSS 相对拼接合成的核心工程价值。代价是过度平滑听感偏机器味——下面几节展开。2.2 前端沿用 Gen 1 的TN → G2P → 韵律预测三段规则系统完全没变——甚至连词典、决策树、上下文标签规范都是从 Festival/HTS 时代继承的。前端到这一代还是跟合成引擎完全解耦占开发工作量的大头。输出格式每个音素带 50 维上下文标签(quinphone前 2 后 2 音素 POS 韵律位置 词内音节位置 短语长度 …)准备喂给声学模型。2.3 声学模型HMM GMM 采样核心是把每段声音参数化再建概率模型参数化每帧声音——每 5 毫秒抽三类声学参数:F0——基频(fundamental frequency), 1 维/帧。浊音时是音高 Hz(男声 ~100、女声 ~200), 清音/静音为 0MCC——mel-cepstrum(mel 倒谱系数), 30-40 维/帧。表示频谱包络(音色 / 共振峰位置和强度)BAP——band aperiodicity(带非周期比), 5-25 维/帧。表示周期 / 非周期比在不同频带的取值,判别浊音(周期性强)vs 清擦音(噪声性强)三类合起来每帧 60-80 维,够描述每 5 毫秒的一小段声音音高多少 音色什么样 是浊音还是清擦音三件事。建模参数分布每个音素状态用一个高斯混合模型(GMM)建模这些参数的分布。同一个AH音素不同人念、不同语境念会分布在参数空间的一片区域里GMM 用几个高斯拟合这片区域时序结构用HMM(隐马尔可夫模型)描述音素之间怎么转移。每个音素通常拆成 3-5 个 HMM 状态(起始、稳定、结束)——像这个音素怎么开口、怎么持续、怎么收尾三段合成时给目标文本对应的 HMM 状态序列 时长模型 静态特征 动态特征(delta / delta-delta),通过MLPG(Maximum Likelihood Parameter Generation, 最大似然参数生成)算法解出一条最大似然参数轨迹——不是逐帧独立采样,而是让整条轨迹在满足静态/动态约束下最大化似然。过度平滑就来自这一步——高斯均值本身偏平均、最大似然估计又倾向于平均化,轨迹被拉向最像训练数据均值的方向,细节丢失上面三个通道具体长啥样——不是抽象概念,可以直接从一段真人录音里提出来。用 WORLD 声码器 (pyworld) 处理一段 5 秒的真人 wav,得到:从上到下依次是原始波形、F0 基频轨迹(红色曲线, ~150 Hz 起伏是女声)、MCC 频谱包络(40 维/帧, 越亮系数越大, 反映共振峰)、BAP 非周期比(5 维/帧, 深色浊音、浅色清擦音)。Gen 2 的声学模型输出的就是每帧这三通道数字, 声码器再把这三通道还原回时域波形——中间没有 mel 谱这种神经端到端表征,全是可解释的物理量。关键突破参数空间可插值 / 可变换——除了模型小HMM 带来三个拼接合成完全做不到的能力音色插值两个发音人的模型参数按比例混合合成两者之间的音色——就是参数空间的线性插值情感 / 风格变换在 HMM 参数上做简单变换(如MLLR(最大似然线性回归)自适应)就能把中性风格转成开心 / 悲伤 / 严肃不需要重录一份情感语料少量数据自适应新发音人只需 5-10 分钟录音通过MLLR / MAP(最大后验估计)自适应从平均模型微调就能得到一个新音色——录音成本降三个数量级代表系统日本名古屋工业大学的HTS(HMM-based Speech Synthesis System)2000 年代到 2010 年代初是全球研究默认基线。中文 TTS 的很多早期学术工作(如中科院自动化所、清华的语音组)都是在 HTS 之上做的。现代复活Neural HMM——近年出现了 Neural HMM 系列工作把 HMM 的时序骨架保留、把 GMM 换成神经网络(用一个小 MLP 或 LSTM 预测每状态的参数分布),训练用 back-prop 而不是 EM。本文按时序建模范式把 Neural HMM 放在 Gen 2 旁支——因为它继承了 HMM 的状态转移 时长模型这条主线,而不是 Gen 3 attention seq2seq 那种文本-mel 端到端对齐路线。具体实现里声码器不一定还是传统参数式:有些版本直接输出 mel 接 HiFi-GAN 神经声码器(如 Coqui 的neural_hmmcheckpoint),但时序骨架的核心分类逻辑仍属于 HMM 家族。Coqui-TTS 里跑一下同一段 pangram:# pip install coqui-tts (Coqui-TTS 已停止维护, coqui-tts 是社区活跃 fork; 也可以 pip install TTS 装原版)fromTTS.apiimportTTS ttsTTS(tts_models/en/ljspeech/neural_hmm).to(cuda)# 硬件: NVIDIA RTX 4090STELLAThe quick brown fox jumps over the lazy dog.tts.tts_to_file(textSTELLA,file_pathgen2_neuralhmm_en.wav)# 模型 12 MB, 加载 0.58s, 推理 0.29s 生成 3.56s 音频 (GPU)——听感典型的 SPSS 时代特征:声音偏糊、像隔着毛毯说话、共振峰规整、缺微观抖动、pitch 轨迹过于平缓、清擦音略带 buzzy 底噪。跟 Gen 1 的 Kal 相比,已经没有拼接接缝的断裂感,整体连贯度好一大截;但整体听感依然明显机器味。训练数据 目标语料(音频, 音素标注文本) 对单发音人 5-30 小时(英语常用 LJSpeech / ARCTIC / VCTK中文常用 CSMSC / 标贝内部数据)输入侧——文本经 TN G2P 韵律预测得到quinphone(五元音素上下文)标签。一个具体例子(hello一词):音素序列(G2P 后):HH AH0 L OW1取中间音素L为例,它的上下文标签编码远超5 元音素的信息——HTS 传统里一个 full context label 大约由这几组特征堆起来:音素身份 quinphone(~5 维):当前 phone 左 2 右 2,即HH-AH0L-OW1#音节级(~10 维):当前音素在音节内的正/反向位置、当前音节含几个音素、是否重读、元音身份词级(~10 维):当前词的 POS(词性)、前/后词的 POS、词内音节位置、词的音节数、到最近内容词的距离短语 / 句级(~15 维):当前短语含几个音节 / 几个词、短语在句中的位置、前/后短语的 ToBI 边界调、句内已经/还剩多少个重音音节韵律标记(~5-10 维):重音等级、语调重音、短语边界类型合起来约 50 维全离散分类特征——之所以堆这么细,是因为 HTS 靠决策树聚类把上下文相似的状态合并 共享 GMM(否则光 quinphone 组合就是音素^5 的爆炸),特征维度越细、聚类越准。这是传统 HTS 里最工程化、最难维护的一块;现代 Neural HMM 大幅简化,通常只留 quinphone POS 少数韵律位置目标侧——从配对音频提取声学参数序列作为回归目标。同一个hello例子:音频约 0.4 秒 16 kHz,共 80 帧(每帧 5 ms)每帧提取 (F0 1 维 MCC 39 维 BAP 21 维) 61 维声学参数目标张量:float32, shape (80, 61)另用强制对齐把每帧标注到某个 HMM state 上(每音素展开为 3 state,4 音素共 12 state,80 帧被分配到 12 state 里)训练目标——传统 HMM:每个 state 收集所有对齐到它的帧样本,用EM 算法拟合出一个 GMM,这就是训练的结果(没有梯度下降,是概率图模型参数估计)。Neural HMM 版本换成用 MLP 预测每状态参数,loss 是 MSE / 负对数似然,标准 back-prop 训练产出:一个 speaker 的模型几十 MB,单卡训练几小时(HTS)或几十分钟(Neural HMM)推理时遇到训练里没见过的上下文怎么办?——Gen 2 的泛化机制是决策树聚类 backoff。理论上 quinphone 全组合有音素^5 ≈ 3 亿那么多,训练数据不可能全覆盖。HTS 训练时用决策树把上下文相似的 state 合并成簇 共享 GMM——比如决策树可能这样问:“当前 phone 是元音吗?→ 是 → 前一个 phone 是浊塞音吗?→ …” 一路问下去到叶子,叶子上挂一个 GMM。推理时遇到没见过的 quinphone,顺着决策树走到最匹配的叶子,用那个簇的 GMM 参数生成。所以 Gen 2 面对新输入不会崩,但会降级——OOD 上下文的合成参数是最像的簇的均值,效果比训练分布内更糊、韵律更平。极端 OOD 时(训练全是新闻语料、推理让它读诗歌韵脚)会出现明显的语调错位。2.4 声码器MLSA / STRAIGHT / WORLD 参数式还原声学模型输出每帧三通道参数(F0 MCC BAP)声码器负责把这些参数还原成时域波形。这一代的声码器不是神经网络是纯 DSP 参数式合成,几代演进:MLSA filter(1983, Imai)——mel log spectrum approximation filter,经典 HTS 早期主力,把 MCC 系数直接映射成时域滤波器,再驱动脉冲/噪声源STRAIGHT(1999-2008, 河原英纪)共振峰跟踪 频谱包络插值 非周期成分建模质量高但速度慢, 90s-00s 学界标准WORLD(2015, Morise)把 STRAIGHT 简化成三个独立模块——F0 分析器(DIO / StoneMask) 频谱包络(CheapTrick) 非周期比(D4C)速度快 10 倍以上,是 2010s 后现代复现实验里最常见的开源声码器——早期 HTS 大多用 MLSA/STRAIGHT,WORLD 是后来才成为主流合成流程根据 F0 决定基频驱动源(浊音用脉冲串、清音用白噪声)→ 按频谱包络(MCC)滤波 → 按 BAP 混入非周期噪声。三段乘起来得到时域样本。整个过程零神经网络前向CPU 就能实时跑——这也是 HMM-TTS 在移动端能落地的关键。训练?——不需要。WORLD/STRAIGHT 是解析式 DSP 算法(基频估计 DIO/StoneMask 谱包络分析 CheapTrick 非周期成分建模 D4C),参数是硬编码或从当前推理时的输入声学参数解析出来的,不需要预训练数据。Gen 2 整条链路里唯一需要训练的是声学模型(HMMGMM 参数估计),声码器完全无参。2.5 结构性短板Gen 2 那四个主观印象——声音糊 / 共振峰规整 / pitch 平缓 / buzzy 底噪——都有确定的数学结构性原因:最大似然生成 平均化倾向HMM 状态的高斯均值 MLPG 最大似然参数轨迹,联合优化下参数被拉向训练数据的均值方向、细节被抹平——就像把 100 张人脸取像素平均得到一张比任何一张都模糊的平均脸参数式声码器谐波过于规则WORLD / STRAIGHT 用固定的谐波结构合成缺少真实语音随时间抖动的微观活性(jitter、shimmer、微观非周期性)三段独立训练带来的次优前端(文本 → 状态序列)、声学模型(状态 → 参数)、声码器(参数 → 波形)三段分开训前端预测的韵律不一定跟声学模型的最优韵律匹配俗称过度平滑问题(over-smoothing)。当年学界尝试过GV(Global Variance)补偿、Trajectory HMM等技术缓解——GV 强行把合成参数的方差拉回接近真实语音的方差、Trajectory HMM 把相邻帧的一阶差分也建模——但都没有根本解决。听感上表现为机器味重、缺乏起伏、听得懂但不想听。2.6 数据流每一步的形态步骤数据形态说明输入文本 → 前端同 Gen 1(TN / G2P / 韵律预测)三段前端结构原样保留上下文标签List[str], 每音素 50 维标签quinphone(前 2 后 2 音素) POS 韵律位置 词内音节位置 短语长度 …HMM state 序列List[int], 状态 ID每音素展开成 3-5 state(起始 / 稳定 / 结束)决策树聚类从状态查到对应的 GMM 参数(均值 协方差)相似上下文的状态共享 GMM避免数据稀疏声学参数采样Tensor float32, shape(T, 60-80), 5 ms/帧三通道F0(1 维, log Hz 基频)MCC(30-40 维, mel-cepstrum 频谱包络)BAP(20-25 维, band aperiodicity 非周期比)参数式声码器 (WORLD/STRAIGHT)谐波源 噪声源 频谱包络 → 时域采样不用神经网络纯 DSP 参数式合成输出波形float32→int16 PCM, shape(N,), sr 16-22 kHz单声道三、两代对比前神经网络时代的两代放一起看:拼接合成 (Gen 1)HMM-TTS (Gen 2)中间表征真人录音片段(int16 PCM)F0 谱包络 非周期比(float32 帧级三通道)模型大小数十 GB(全是原始录音)数十 MB(概率分布参数)推理速度 (RTF)~0.1-1 (CPU)~0.01-0.1 (CPU)换音色成本30-50 小时新录音 重新标注5-10 分钟自适应(MLLR/MAP)韵律可控不可(只能挑候选)可(直接改 F0/时长参数)主要短板拼接痕迹 / 数据成本 / 不可控过度平滑 / “机器味重”两代的核心跨越是从检索空间进入了参数空间——拼接合成的音色 一整套录音库,HMM-TTS 的音色 一组概率参数。参数化第一次让 TTS 能做音色插值 / 情感变换 / 少量数据自适应,但代价是MLPG 最大似然生成的平均化倾向导致的过度平滑天花板。要根治这个天花板,只能换整个建模范式——把 HMMGMMMLPG 这套统计流水线换成神经网络端到端学习、把参数式声码器换成神经声码器,这就是 Gen 3 神经声学模型 神经声码器时代的起点。