生成听起来像机器人般单调的语音相对简单。文本到语音(TTS)合成的真正难题在于生成能够捕捉人类语音的自然节奏、语调和重音的音频。这些声学特征的集合被称为韵律。没有有效的韵律建模,合成语音即使完全可懂,也仍然显得不自然。用于建模和控制这些韵律要素的方法被阐述,以显著提升TTS系统的自然度和表现力。韵律包含几个随时间变化的重要的声学特征:音高(基频,F0): 语音感知的音高或音低。音高轮廓传达有关句子结构(例如,许多语言中问句的升调)、情感状态和重音的信息。时长: 分配给语音单位(音素、音节、词语)和停顿的时间长度。时长的变化产生节奏,并能标示重要性或词语边界。能量(响度/强度): 语音信号的声学能量或振幅。能量的变化有助于感知音节或词语的重音,并能反映情感强度。早期的TTS系统通常依赖基于规则的方法或简单的统计模型来处理韵律,导致自然度有限。现代神经TTS架构,特别是之前讨论的序列到序列模型(如Tacotron 2或Transformer TTS),可以从大型数据集中隐式学习韵律模式。例如,注意力机制有助于将文本输入与声学特征帧对齐,间接学习典型的时长。同样,序列生成过程捕捉训练数据中常见的音高和能量轮廓。然而,这种隐式建模常常导致“平均”韵律,缺乏人类语音的生动性和变化性。此外,它对文本如何呈现的直接控制很小。如果你想合成带有特定情感语调的语音,强调某个词,或者模仿参考话语的韵律,隐式建模就显得不足。这使得显式韵律建模和控制方法变得必要。显式韵律建模显式建模将韵律预测作为TTS流程中的一个独立任务。其目标是直接从输入文本或中间表示中预测帧级别或音素级别的韵律特征(音高、时长、能量)。独立韵律预测器一个直接的方法是训练专门的模型来预测韵律特征。这些预测器通常以从输入文本中提取的语言特征(音素、词性标签、句法信息)以及可能的说话人或风格嵌入作为输入。输出是时长值(通常在音素级别)和帧级别的音高及能量值序列。时长预测: 通常建模为预测每个输入音素对应的声学帧数。这对于确定整体时序和节奏很重要。循环神经网络(RNNs)或Transformer可用于此序列到序列任务。损失通常是预测时长与真实时长(通过强制对齐获得)之间的均方误差(MSE)。音高(F0)预测: 预测每个有声帧的基频。这通常被视为回归问题。处理无声区域(F0未定义)需要特别注意,有时通过预测连续的F0轮廓和单独的清音标志,或通过插值来处理。能量预测: 预测每帧的能量或幅度,通常是对数尺度的。这通常也作为使用MSE损失的回归问题。这些预测的韵律特征随后用于条件化主声学模型(序列到序列架构中的解码器),或者与拼接或统计参数系统中的音素嵌入结合使用。变长适配器非自回归TTS模型(如FastSpeech 2)引入了变长适配器的思想。它们是插入在文本编码器和声学特征解码器之间的模块。它们的作用是在并行解码之前,用显式韵律信息丰富编码的文本表示。典型的变长适配器包含几个子模块:时长预测器: 预测每个输入标记(例如音素)的时长。此预测用于扩展编码表示的序列,使其与目标声学特征序列的长度匹配。例如,如果音素/k/的预测时长为5帧,则/k/的编码向量会重复5次。音高预测器: 预测每个扩展标记的平均音高(或量化表示)。能量预测器: 预测每个扩展标记的平均能量。这些预测器通常是作用于编码器输出的简单前馈网络。在训练期间,真实时长、音高和能量值从目标音频中提取(使用对齐工具和信号处理),并用作监督学习的目标(通常使用MSE损失)。预测的音高和能量值通常被转换为嵌入,并添加到经过时长扩展的表示序列中,然后传递给解码器。digraph G { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef", fontname="sans-serif"]; edge [fontname="sans-serif"]; subgraph cluster_tts { label = "非自回归TTS流程"; bgcolor="#f8f9fa"; style=filled; node [fillcolor="#a5d8ff"]; Text [label="输入文本"]; Encoder [label="文本编码器\n(例如, Transformer)"]; VA [label="变长适配器", fillcolor="#96f2d7"]; Decoder [label="Mel-谱图\n解码器\n(例如, Transformer)"]; Vocoder [label="神经声码器\n(例如, HiFi-GAN)"]; Audio [label="输出\n波形"]; subgraph cluster_va { label = "变长适配器细节"; bgcolor="#f1f3f5"; node [fillcolor="#b2f2bb"]; DurPred [label="时长\n预测器"]; LengthReg [label="长度调节器\n(序列扩展)"]; PitchPred [label="音高\n预测器"]; EnergyPred [label="能量\n预测器"]; PitchEmbed [label="音高\n嵌入"]; EnergyEmbed [label="能量\n嵌入"]; Add [label="添加嵌入", shape=circle, fillcolor="#ffec99"]; VAOut [label="韵律增强\n表示", shape=none, margin=0, fillcolor=none]; EncoderOut -> DurPred; DurPred -> LengthReg; EncoderOut -> LengthReg [style=dashed, arrowhead=none, label="隐藏状态"]; LengthReg -> PitchPred; LengthReg -> EnergyPred; PitchPred -> PitchEmbed; EnergyEmbed -> EnergyEmbed; LengthReg -> Add [style=dashed, arrowhead=none, label="扩展的隐藏状态"]; PitchEmbed -> Add; EnergyEmbed -> Add; Add -> VAOut [dir=none]; } Text -> Encoder; Encoder -> VA [lhead=cluster_va]; VA -> Decoder [ltail=cluster_va]; Decoder -> Vocoder; Vocoder -> Audio; // 连接内部变长适配器组件的逻辑 // EncoderOut 表示主编码器输入到变长适配器集群的输出 Encoder -> EncoderOut [style=invis]; EncoderOut -> DurPred; EncoderOut -> LengthReg [style=invis]; // 隐藏状态的逻辑连接 VAOut -> Decoder [style=invis]; // 变长适配器输出的逻辑连接 // 如果需要,显式定义用于逻辑连接的节点 node [label="", name=EncoderOut, style=invis, width=0, height=0]; node [label="", name=VAOut, style=invis, width=0, height=0]; } }包含变长适配器的非自回归TTS模型的简化结构。该适配器显式预测时长、音高和能量,以在解码为声学特征之前丰富文本嵌入。变长适配器通过修改预测值或提供目标值,为推理期间控制韵律提供了一种直接机制。学习潜在韵律表示另一个研究方向是学习潜在表示,它们可以在训练期间无需音高、时长或能量的显式标签即可捕获韵律变化。变分自编码器(VAEs)或全局风格标记(GSTs)等技术属于这一类别。用于韵律的VAEs: 变分自编码器可以训练学习话语中韵律信息的压缩潜在表示(一个向量$z$)。编码器部分将话语的声学特征(或从中提取的韵律特征)映射到潜在空间,解码器从$z$重建韵律。在合成期间,这个从先验分布采样或从参考话语推断出的潜在向量$z$,可以条件化TTS模型以生成不同的韵律。全局风格标记(GSTs): 全局风格标记使用注意力机制直接从语音数据中学习一组固定的“风格嵌入”。对于每个话语,模型计算这些学习到的嵌入上的注意力权重,生成一个加权和,代表话语的风格,包括其韵律。由此产生的风格向量条件化合成过程。虽然主要目的是捕捉更广泛的说话风格,但全局风格标记通常隐式捕捉主要的韵律模式。合成时控制韵律显式韵律建模为控制合成输出提供了可能性:基于参考的控制: 如果模型包含韵律编码器(如某些基于VAEs的方法或专门的韵律迁移模型),你可以提供一个参考音频话语。系统从参考中提取韵律(例如,F0轮廓、时长模式),并将其应用于合成目标文本。这使得模仿说话者的语调和节奏成为可能。符号控制: 模型可以训练解释输入文本中的特殊标记或注释。例如:This is <emphasis>very</emphasis> important. 可以表示词语“very”增加时长、音高范围和能量。Are you coming<question>? 可以触发上升的最终音高轮廓。 这需要带有此类韵律事件注释的训练数据,或使用从语言特征到韵律目标的基于规则的映射。直接参数调整: 对于使用变长适配器或独立预测器的模型,你可以在推理时直接进行干预。时长: 在长度调节步骤之前修改预测的音素时长。例如,统一增加时长可以模拟较慢的语速。音高: 改变预测的F0轮廓。你可以手动提高平均音高,使单调语音的轮廓平坦,或施加特定模式(例如,问句的最终升调)。能量: 调整预测的能量水平,使语音更响、更轻,或强调特定部分。 直接调整这些参数时必须小心,因为任意改变很容易导致不自然的语音结果。缩放或移动预测值通常比完全替换它们更安全。潜在空间调整: 对于使用VAEs或类似潜在变量方法的模型,在解码前调整潜在韵律向量$z$可以生成多样的韵律变化。在对应不同风格(例如,陈述句与疑问句)的向量之间进行插值可以产生中间韵律。{"data": [{"x": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0], "y": [120, 122, 125, 123, 120, 118, 115, 116, 117, 115, 114], "type": "scatter", "mode": "lines", "name": "陈述句 F0 (Hz)", "line": {"color": "#339af0"}}, {"x": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0], "y": [120, 125, 130, 135, 140, 145, 155, 170, 185, 195, 200], "type": "scatter", "mode": "lines", "name": "疑问句 F0 (Hz)", "line": {"color": "#f76707"}}], "layout": {"title": "示例音高轮廓 (F0)", "xaxis": {"title": "归一化时间"}, "yaxis": {"title": "基频 (Hz)", "range": [50, 250]}, "font": {"family": "sans-serif"}}}一个话语合成的陈述句(降调)与疑问句(升调)的F0轮廓示例。显式韵律控制可以生成如此不同的语调模式。挑战与评估有效建模和控制韵律仍具挑战。数据: 训练韵律模型通常需要大量高质量、富有表现力的语音数据。为符号控制而用特定韵律事件标注数据可能很耗时。主观性: 虽然可以测量F0均方根误差(RMSE)或时长预测误差等客观指标,但韵律的最终评判是人类感知。询问自然度、语调的适当性和表现力等的主观听力测试(例如,平均意见得分 - MOS)不可或缺。解耦: 韵律与说话人身份、情感甚至语义内容本身交织在一起。完全解耦这些因素以进行独立控制很困难。修改音高可能会无意中改变感知到的情感或说话人特征。过度平滑: 像深度学习中的许多回归任务一样,韵律预测器有时会生成过于平滑、平均的轮廓,缺少自然语音中存在的尖锐、局部变化。尽管存在这些挑战,显式韵律建模和控制机制的进步,特别是通过变长适配器和可控潜在表示,对提升TTS的自然度和表现力起到了重要作用。掌握这些技术对于构建能够生成不仅可懂,而且引人入胜、细节丰富的语音的先进合成系统非常重要。