前端处理:文本的标准化与音素化
系统接收到输入文本后的首要任务是清洗与转换。人类书写的文本充满了非标准化的符号,计算机无法直接处理这些包含歧义的信息。前端模块必须解决文本归一化的问题,将"$20"转化为"twenty dollars",或者将日期格式展开为标准读音序列。这一步骤决定了后续发音的准确性基础,任何在此阶段遗漏的信息都会导致最终合成的错误。
Hugging Face Transformers 文档: https://huggingface.co/docs/transformers/index
文本被规范化后,字素转音素(G2P)模块介入。它将正字法层面的单词转换为代表实际发音的音素序列。英语中的多音字或中文里的变调都需要通过查阅发音词典或运行预训练模型来消除歧义。只有将文本彻底拆解为音素、重音和韵律标记,声学模型才能接收到清晰的指令。
python
import torch
import torch.nn as nn
class TextEncoder(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True, bidirectional=True)
self.linear = nn.Linear(hidden_dim * 2, embed_dim)
def forward(self, x):
x = self.embedding(x)
x, _ = self.lstm(x)
return self.linear(x)
声学模型:预测声音的特征图谱
音素序列本身没有声音,它们只是代表发音位置的抽象符号。声学模型的任务是将这些符号序列转化为声学特征,通常是梅尔频谱图。这个过程涉及对时长、基频(F0)和能量的预测。
早期的 Tacotron 系列模型采用循环神经网络架构,虽然生成效果尚可,但自回归的生成方式导致推理速度缓慢,且容易出现漏词或重复读词的现象。工业界随后转向了以 FastSpeech 为代表的非自回归架构。这种架构利用 Transformer 的自注意力机制并行生成所有帧的频谱,并通过显式的时长预测器来控制每个音素的发音长度。这种转变极大地提升了合成速度,同时也增强了对韵律的控制能力。
PyTorch 官方网站: https://pytorch.org/
声学模型输出的梅尔频谱图实际上是一种频域特征,它丢失了相位信息,因此人类无法直接听到声音。它更像是一张乐谱,详细记录了在不同时间点应该出现的频率强度,等待着被还原为波形。
声码器:从特征到波形的重构
声码器负责将声学特征还原为原始波形。这是一个极具挑战性的逆问题,因为从频谱图恢复相位信息存在无数种可能性。传统的 Griffin-Lim 算法依靠数学迭代估算相位,但合成出来的声音往往带有明显的金属感和底噪,缺乏真实度。
深度学习时代的声码器彻底改变了这一局面。WaveNet 展示了逐样本点生成的惊人音质,但极低的效率限制了其应用。随后出现的 HiFi-GAN 利用生成对抗网络解决了效率与质量的矛盾。生成器试图伪造逼真的波形,判别器则在多尺度上鉴别真伪,两者的博弈使得最终生成的音频在听感上几乎难以与真人录音区分。
python
class Generator(torch.nn.Module):
def __init__(self, initial_channel, resblock_kernel_sizes, resblock_dilation_sizes, upsample_rates, upsample_initial_channel, upsample_kernel_sizes, gin_channels=0):
super(Generator, self).__init__()
self.num_kernels = len(resblock_kernel_sizes)
self.num_upsamples = len(upsample_rates)
self.conv_pre = torch.nn.Conv1d(80, initial_channel, 7, 1, padding=3)
resblock = ResBlock1 if resblock_type == '1' else ResBlock2
self.ups = torch.nn.ModuleList()
for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)):
self.ups.append(weight_norm(
torch.nn.ConvTranspose1d(initial_channel//(2**i), initial_channel//(2**(i+1)), k, u, padding=(k-u)//2)))
端到端与语言模型的融合
最新的技术趋势正在打破上述模块化的界限。VITS 等模型尝试将声学模型与声码器合并,利用变分推断直接从文本生成波形,消除了中间特征转换带来的误差累积。
与此同时,基于大语言模型(LLM)的音频生成方案正在兴起。这类系统不处理频谱图,而是将音频量化为离散的编码(Token)。模型像处理文本接龙一样预测下一个音频 Token,从而展现出强大的零样本克隆能力。只需数秒的参考音频,模型即可在不进行微调的情况下,复制说话人的音色与环境背景。这标志着语音合成正从单纯的信号处理迈向通用的生成式人工智能阶段。