声码器(vocoder)在语音合成、语音转换和歌声合成中都是一个绕不开的模块,但它的名字容易让人误以为和音频压缩编码器是一回事。实际上,在基于神经网络的语音合成链路里,声码器通常指的就是把声学特征还原成波形采样点的模型。它接收的大多是梅尔频谱(mel-spectrogram)或线性频谱,输出的是逐采样点的高采样率音频波形。理解这一点之后,再看HiFi-GAN这类神经声码器就会清晰很多:它们不是传统信号处理里的分析合成滤波器,而是学习从频谱到波形的映射网络。

很多项目在接入声码器时会把重点放在推理速度或MOS评分上,却忽略了声码器本质上在弥补频谱丢失的信息。频谱表示丢掉了相位、细粒度激励和瞬态细节,因此声码器需要在时域上重建这些内容。传统方法如Griffin-Lim只用幅度谱迭代估计相位,速度尚可但音质偏闷;WORLD虽然显式建模基频和周期分量,但需要额外提取参数,而且合成痕迹仍然明显。神经声码器的优势在于直接从数据中学习这些先验,端到端地输出自然波形,并且可以借助GPU并行完成长序列生成。
一、先厘清声码器:它解决的是从特征到波形的逆问题
语音合成系统通常分成两个阶段:声学模型负责从文本生成声学特征,声码器负责从声学特征生成波形。声学特征最常见的是梅尔频谱,它只保留了人耳感知上比较重要的频带能量信息,丢弃了原始波形中的相位和激励细节。声码器的任务就是从这样一个信息有损的二维表示中,还原出采样点级别的一维波形。这个逆问题并不好解,因为同一个幅度谱理论上可以由无数种不同相位的波形对应,而人耳对相位差异非常敏感。
传统信号处理声码器采用分析合成框架。以WORLD为例,它先通过基频提取、频谱包络估计和周期信号分解得到参数,再根据参数重建波形。这种做法的好处是计算量小、可解释性强,但合成声音往往带有机械感和嗡嗡声。另一类Griffin-Lim算法不依赖训练数据,只需要幅度谱和迭代相位估计,但恢复出的相位不真实,音质有限。神经声码器不再手工设计这些模块,而是让网络从大量真实语音中学习如何把频谱映射成自然波形。
从训练数据角度看,神经声码器的输入输出对非常明确:输入是某段语音计算出的梅尔频谱,输出是对应的原始波形。训练时用重建误差、对抗损失或似然函数约束网络。推理时只保留生成路径,因此可以并行生成。这种学习方式让神经声码器能够合成出比传统方法更自然的语音,但也带来训练不稳定、显存占用高、推理速度差异大等新的工程问题。
二、HiFi-GAN的设计动机与核心原理
HiFi-GAN将声码器建模为生成对抗网络中的生成器。生成器接收梅尔频谱,经过若干转置卷积层逐步上采样,直到恢复目标采样率的波形。单纯堆叠转置卷积容易产生棋盘伪影和细节模糊,因此HiFi-GAN在生成器中引入了多感受野融合模块。该模块由多个不同卷积核大小和膨胀率的残差块并联组成,再把结果相加,让不同尺度的时间特征能够同时影响输出,从而提高波形细节的还原能力。
判别器是HiFi-GAN最核心的设计之一。作者使用了两种判别器:多周期判别器和多尺度判别器。多周期判别器先把一维波形按照固定周期折叠成二维结构,再送入卷积网络判断真假。周期可以选择2、3、5、7、11等值,不同周期能分别捕捉基频周期、谐波结构和长时相关性。多尺度判别器则对输入波形进行不同倍率的平均池化,从原始采样率、降采样音频和进一步降采样音频三个尺度判断真实性。这种组合让判别器既能关注局部波形是否自然,也能关注整体包络是否合理。
def reshape_by_period(x, period):
batch, channels, length = x.shape
pad = (period - length % period) % period
if pad != 0:
x = torch.nn.functional.pad(x, (0, pad))
return x.view(batch, channels, -1, period)
损失函数方面,HiFi-GAN同时使用对抗损失、梅尔频谱重建损失和特征匹配损失。对抗损失推动生成器产生难以被判别器识别的波形;梅尔频谱损失直接把生成波形重新转换到频谱域,约束频域误差;特征匹配损失则比较判别器中间层特征,让生成器不仅骗过最终分类,还要让中间表示尽量接近真实语音。这种多目标设计缓解了GAN训练过程中的模式坍塌和过度平滑问题。
import json
import torch
import numpy as np
import soundfile as sf
with open("config.json", "r", encoding="utf-8") as f:
config = json.load(f)
model = HiFiGAN(config)
checkpoint = torch.load("generator_v1.pth", map_location="cpu")
model.load_state_dict(checkpoint["generator"])
model.eval()
mel_spec = torch.randn(1, 80, 100)
with torch.no_grad():
waveform = model(mel_spec)
waveform = waveform.squeeze(0).cpu().numpy()
waveform = np.clip(waveform, -1.0, 1.0)
sf.write("output.wav", waveform, 22050)
HiFi-GAN的推理过程相对简单。加载生成器权重后,输入梅尔频谱即可输出波形。在上面的示例中,梅尔频谱形状为1个样本、80个频带、100个时间帧,模型内部会根据配置完成上采样。需要注意,不同实现中频谱归一化方式可能不同,如果训练时对梅尔频谱做了均值方差归一化,推理阶段也必须使用相同的统计量进行变换,否则合成音质会明显下降。采样率的选择同样重要,常见配置为22050Hz或24000Hz,输出波形长度由输入帧数和上采样倍数决定。
三、主流神经声码器横向对比:HiFi-GAN处于什么位置
在神经声码器发展过程中,WaveNet最早证明了自回归模型可以合成极高自然度的语音,但是逐采样点生成导致速度极慢,难以满足实时场景。WaveGlow基于可逆流模型,能够并行生成波形,音质也不错,但参数量大、训练显存占用高,难以部署到低资源设备。MelGAN以轻量级卷积网络配合多尺度判别器,推理速度很快,但部分细节音质不如HiFi-GAN。Parallel WaveGAN结合了非自回归波形生成和对抗训练,在速度与音质之间取得了相对平衡。
| 模型 | 生成方式 | 音质表现 | 推理速度 | 主要限制 |
|---|---|---|---|---|
| WaveNet | 自回归 | 高 | 极慢 | 难以实时部署 |
| WaveGlow | 流模型并行 | 较高 | 中等 | 显存占用大 |
| MelGAN | GAN并行 | 中等 | 快 | 细节粗糙 |
| Parallel WaveGAN | GAN并行 | 较高 | 较快 | 训练稳定性一般 |
| HiFi-GAN | GAN并行 | 较高 | 快 | 判别器设计较复杂 |
| UnivNet | GAN并行 | 高 | 快 | 需要较多数据 |
从对比表可以看出,HiFi-GAN在音质和速度之间找到了一个很适合工程落地的位置。它的推理速度快于WaveGlow,音质表现优于MelGAN,而且官方开源实现和社区复现都很丰富,因此成为许多语音合成系统的默认声码器之一。UnivNet在HiFi-GAN的基础上改进了判别器结构,进一步缓解了对抗训练中的过度平滑问题,但训练资源和数据量要求更高。BigVGAN等后续模型继续优化生成器的周期性建模,在极高质量需求场景下表现突出,但模型复杂度也随之上升。
选择声码器时不能只看某一项指标。如果项目追求极致音质且对延迟不敏感,可以考虑WaveNet或BigVGAN;如果需要在CPU或移动端实时合成,应该优先评估HiFi-GAN和MelGAN;如果训练数据较少且希望快速搭建基线,Parallel WaveGAN的小参数量版本可能更合适。HiFi-GAN的另一个优势是社区支持完善,很多预训练权重和配置可以直接使用,降低了接入成本。
四、工程落地建议:选型、调参与常见误区
实际工程中使用HiFi-GAN时,一个常见误区是只关注最终MOS评分,而忽略输入特征的数值范围。训练时如果对梅尔频谱做了归一化,推理阶段没有做相同处理,会导致波形幅度异常、声音失真。另一个误区是直接套用预训练权重而不检查采样率和帧移参数。不同实现可能使用不同的STFT参数,输入梅尔频谱的帧移、频率范围不一样,输出波形的自然度会受到明显影响。因此,接入前应确认配置文件与训练来源一致。
调参方面,判别器损失权重、特征匹配损失权重和梅尔频谱损失权重需要根据训练过程动态调整。如果判别器过强,生成器容易出现梯度消失,合成波形变得非常平滑且缺少细节;如果生成器过强,判别器无法提供有效梯度,训练会退化为普通的频谱回归模型。可以观察特征匹配损失的下降曲线和判别器对真实波形的判定概率,当判别器对真假样本都给出接近0.5的概率时,说明训练状态相对稳定。生成器中多感受野融合模块的通道数和残差块数量也可以根据目标设备调整,小模型可以适当减少通道以降低推理延迟。
部署阶段,HiFi-GAN的生成器只包含卷积层,不包含循环结构,因此容易导出为ONNX或TensorRT进行加速。推理时建议使用固定长度的梅尔频谱输入,避免动态形状带来的计算图切换开销。对于长音频合成,可以分段处理梅尔频谱再拼接波形,但需要注意分段边界处可能产生不连续,可以通过重叠区加交叉淡化处理。对于实时场景,还可以结合流式声学模型逐帧输出频谱,声码器采用缓存卷积状态的方式持续生成波形,从而降低首包延迟。