当前位置: 首页 > news >正文

李宏毅NLP-13-Vocoder

大纲

在这里插入图片描述

简介

在这里插入图片描述

  • TTS:文本→TTS 模型→目标频谱(直接从文本生成语音特征);
  • VC:参考语音→VC 模型→转换后频谱(改变参考语音的音色,保留内容);
  • 频谱图:是语音的 “中间表示”,包含 梅尔频谱(Mel-Spectrogram)等形式,能编码 “基频、谐波、共振峰” 等声学特征;

无论频谱来自 TTS 还是 VC,都通过Vocoder将 “频域特征” 逆转为 “时域声波”,得到可听的语音。

在这里插入图片描述
短时傅里叶变换(STFT)将时域语音信号 xxx 转换为时频域表示 X(t,f)X(t, f)X(t,f),其复数形式可分解为:

X(t,f)=At,feiθt,fX(t, f) = A_{t,f} e^{i\theta_{t,f}}X(t,f)=At,feiθt,f

  • At,fA_{t,f}At,f幅度谱(Amplitude Spectrogram),表示频率 fff 在时刻 ttt 的能量强度;

  • θt,f\theta_{t,f}θt,f相位谱(Phase Spectrogram),表示频率 fff 在时刻 ttt 的相位偏移;

  • eiθt,fe^{i\theta_{t,f}}eiθt,f:欧拉公式,将相位信息编码为复数的 “角度” 部分。

幅度谱(左图)

  • 视觉特征:色彩明亮的热力图,高频(纵轴 Hz)和时间(横轴 Time)的能量分布清晰可见(如共振峰、谐波结构);
  • 物理意义:直接对应人耳感知的 “响度” 和 “音色轮廓”,是传统语音处理(如 ASR、TTS)的核心特征。

相位谱(右图)

  • 视觉特征:色彩斑驳的 “噪声状” ,相位值(色标从 - 3 到 + 3)无明显规律;
  • 物理意义:描述信号的 “时间对齐” 和 “波形精细结构”,传统上因 “难以建模” 被忽视,但对波形自然度至关重要。
    在这里插入图片描述
    前端模型:TTS 或 Voice Conversion 生成声学特征(如频谱、梅尔谱);声码器(Vocoder)根据声学特征,生成最终的时域波形(即能听到的声音)。
    传统方法:
  • Griffin-Lim 等早期声码器通过 “幅度主导 + 相位迭代” 生成波形,但相位恢复精度不足,导致失真;

现代方法:

  • 用深度学习模型(如 GAN、Flow、Autoregressive 模型)学习 “声学特征→波形” 的映射;自然度高,可实时生成;

在这里插入图片描述

声码器(Vocoder)在语音技术中的核心价值,通过将 “波形生成” 任务独立化,实现跨场景复用和语音细节的精准优化:

  • 经过良好训练的声码器可作为通用波形生成模块,适配多种语音任务,避免了为每个任务单独开发波形生成模块,降低了研发成本并提升了系统一致性:

    • TTS(文本转语音):将文本生成的声学特征(如梅尔谱)转换为语音波形;

    • VC(语音转换):将源说话人语音的声学特征转换为目标说话人音色的波形;

    • SE(语音增强):将去噪后的声学特征重构为清晰语音波形。

这种复用性避免了为每个任务单独开发波形生成模块,降低了研发成本并提升了系统一致性。

  • 专注语音细节处理,把生成声音波形当成独立的任务,专注在处理声音特征较容易

    • 独立任务拆分:将复杂的语音生成流程分解为 “声学特征生成” 和 “波形合成” 两个子任务,声码器专注后者;

    • 细节优化优势:语音波形包含微小的声学细节,独立优化声码器可更高效地提升:

      • 自然度:减少金属声、毛刺等失真;
      • 保真度:保留语音的细微质感;
      • 效率:通过专用模型实现实时波形生成。

Neural Vocoder

WaveNet

在这里插入图片描述
WaveNet,它是基于自回归思想的神经声学模型,核心是通过因果卷积(Causal Convolutions)逐点生成高保真语音波形:

WaveNet 受神经自回归模型启发,遵循 “过去预测未来” 的逻辑:

  • 输入:时间序列的历史数据 {x1,x2,...,xt−1x_1,x_2,...,x_{t−1}x1,x2,...,xt1}(已生成的波形点);
  • 输出:下一个时刻的波形点 xtx_txt
  • 迭代生成:通过逐点生成,最终拼接出完整语音波形。
  • 生成的 xtx_txt 会被 “反馈” 到输入层,作为历史数据继续生成 xt+1x_{t+1}xt+1,直到完整波形生成。

在这里插入图片描述
WaveNet 模型的核心架构,它是语音合成领域的经典自回归模型,通过 “因果卷积 + 膨胀卷积 + 残差连接 + 跳跃连接” 的组合,实现高保真语音波形的逐点生成:

  • 输入层(Input)与因果卷积(Causal Conv)

    • 输入:历史语音波形的时序数据;

    • 因果卷积:确保 “当前时刻的计算只依赖过去的历史信息,不泄露未来信息” 。

  • 膨胀卷积(Dilated Conv)与门控机制(tanh + σ)

    • 膨胀卷积:通过 “间隔采样” 扩大卷积的感受野(即模型能 “看到” 的历史序列长度),无需增加参数量即可捕捉长时依赖(如语音的韵律、语调);

    • 门控机制:用 tanh(捕捉特征)和 σ(sigmoid,控制特征流量)的乘积,模拟语音信号的时变特性(如音量起伏、发音快慢)。

  • 残差连接(Residual)

    • 每个膨胀卷积模块的输出与输入相加(Residual +),缓解深层网络的梯度消失问题,让信息能高效传递到高层。
  • 跳跃连接(Skip-connections)

    • 多个膨胀卷积模块的输出被 “跳跃式” 汇总,确保所有层级的特征都能参与最终预测,提升模型对细粒度语音特征的捕捉能力。
  • 输出层(Output)

    • 经过多层 1×1 卷积、ReLU 激活和 Softmax,输出 “下一个波形点” 的概率分布,实现逐点生成。

在这里插入图片描述

Softmax 分布在语音生成(如 WaveNet)中的应用,如何通过 “独热向量序列建模 +μ-law 压缩” 解决 “音频数据维度爆炸” 的问题:

输入输出形式

  • 输入和输出是独热向量(one-hot vectors)序列,而非标量(scalers)。

    • 例:语音波形的每个采样点被编码为独热向量,模型逐点生成序列。
  • 概率建模:整个序列的概率 $ p(\mathbf{x}) $ 是 “每个时刻 $ t $ 条件概率 $ p(x_t | x_1, …, x_{t-1}) $” 的乘积:

$ p(\mathbf{x}) = \prod_{t=1}^T p(x_t | x_1, …, x_{t-1}) $

音频数据的高维度

  • 音频采样:原始音频是16 位整数序列,范围为 [−32768,32767][-32768, 32767][32768,32767](共 $ 32767 - (-32768) + 1 = 65536 $ 个可能值)。
  • Softmax 层维度:若直接对每个采样点做 Softmax,输出层维度需为 65536(对应所有可能的采样值)。
    • 问题:维度太大→参数量爆炸、训练 / 推理效率极低。

解决方案:μ-law 算法压缩

  • 核心作用:将 16 位整数(65536 个值) 压缩为 8 位整数(256 个值),即 [−32768,32767]→[0,255][-32768, 32767] \rightarrow [0, 255][32768,32767][0,255]
  • 压缩逻辑
    • 对大动态范围的音频信号(如 loud 与 quiet 部分),通过非线性映射 “压缩大值、保留小值细节”;
    • 使 Softmax 层维度从 65536 骤减到 256,大幅降低模型复杂度。

在这里插入图片描述
因果卷积(Causal Convolution)是一种特殊的卷积操作,确保模型在处理时序数据时 “只依赖过去信息,不泄露未来信息”。
输入层(Input,蓝色圆点)

  • 代表时序输入序列(如语音波形的采样点、文本的字符),每个圆点对应一个时刻的输入值;
  • 箭头方向:所有信息流严格从 “左→右”(过去→未来),无反向箭头。

隐藏层(Hidden Layer,白色圆点)

  • 多层卷积层堆叠,每层通过卷积核提取时序特征;
  • 卷积核作用范围:仅覆盖 “当前位置左侧” 的输入(含当前位置),例如:
    • 底层隐藏层的某个白色圆点,仅接收其左侧若干蓝色输入点的信息;
    • 上层隐藏层的圆点,仅接收其下方隐藏层 “左侧圆点” 的信息。

输出层(Output,橙色圆点)

  • 最终生成的时序输出序列,每个橙色圆点对应 “基于历史输入预测的当前时刻值”;
  • 生成逻辑:从左到右逐点生成,每个输出点仅依赖其左侧的输入和隐藏层状态。

在这里插入图片描述
膨胀卷积(Dilated Convolution) 它是一种特殊的卷积操作,通过 “间隔采样” 扩大卷积的感受野(即模型能 “看到” 的输入范围),同时不增加参数量。膨胀卷积通过设置膨胀率(Dilation Rate) 控制 卷积核覆盖输入时的间隔,从而在不增加卷积核大小的前提下,让模型能看到更远的输入。

左图:普通卷积

  • 卷积核覆盖:3×3 卷积核直接覆盖相邻的 9 个输入单元(灰色区域);
  • 感受野:较小(仅局部区域),适合捕捉短距离依赖。

右图:膨胀卷积(Dilation Rate > 1)

  • 间隔采样:卷积核以间隔 1 的方式覆盖输入(蓝色区域),相当于用更大的 虚拟卷积核 捕捉信息;
  • 感受野扩大:相同大小的卷积核,能覆盖更广阔的输入区域(如膨胀率为 2 时,3×3 卷积的感受野等效于 5×5 普通卷积);
  • 无参数量增加:仅改变采样间隔,不增加卷积核参数,高效且节省算力。

在这里插入图片描述
在这里插入图片描述

膨胀因果卷积(Dilated Casual Convolution) 是 “膨胀卷积” 与 “因果卷积” 的结合,同时具备两种特性:

  • 因果性:当前输出仅依赖过去的输入(无未来信息泄露,符合 “过去预测未来” 的自回归逻辑);
  • 长距离感受野:通过膨胀采样,让模型能看到更远的历史输入(捕捉长时语音韵律、语调等特征)。

隐藏层多层膨胀卷积层堆叠,每层通过间隔采样(膨胀率 > 1)扩大感受野;

膨胀卷积(Dilation) 的三大优势:

  • 小层数实现大感受野

    • 膨胀卷积能让网络仅用少量层,就获得极大的感受野(即模型能 “看到” 的输入范围)。

    • 对比:普通卷积需堆叠多层才能覆盖长距离,而膨胀卷积通过 “间隔采样”,单层即可覆盖更远输入。

  • 保持输入分辨率

    • 膨胀卷积不改变输入的 “空间 / 时序分辨率”(如语音波形的采样率、图像的像素数)。

    • 对比:池化(Pooling)会降低分辨率,膨胀卷积则能在 “不压缩输入” 的前提下扩大感受野。

  • 感受野指数级增长

    • 膨胀因子(Dilation Factor)指数级增加(如 1→2→4→8),感受野会随网络深度指数级扩大

    • 例:图中隐藏层膨胀因子从 1→2→4→8,输出层感受野覆盖极长的输入序列。

在这里插入图片描述

带条件的 WaveNet(Conditional WaveNet) 在原始 WaveNet(自回归生成语音波形)的基础上,加入额外的条件信号,让生成的语音 “受条件控制”(例如:用文本作为条件生成指定内容的语音,或用说话人特征控制音色)。

  • 全局条件:让整个波形生成过程受 “全局特征” 控制(如统一的说话人音色、文本的整体风格)。
  • 局部条件:让波形的 “逐点生成” 受 “局部细粒度特征” 控制(如每帧的韵律、文本的逐字发音)。

在这里插入图片描述
核心技术特点

  • 直接在波形级别操作

    • 区别于传统 “先提取特征再合成波形” 的两阶段方法,WaveNet直接对原始语音波形(时域信号)进行建模与生成;

    • 优势:保留语音最精细的细节,合成语音自然度更高。

  • 因果滤波器与膨胀卷积结合

    • 因果滤波器(Causal filters):确保 当前时刻的生成仅依赖过去的历史信息(无未来信息泄露,符合自回归逻辑);

    • 膨胀卷积(Dilated convolutions):通过 间隔采样”让模型的感受野(Receptive fields)随深度指数级增长

    • 关键价值:能高效建模音频信号的长时依赖关系

  • 可结合其他输入(全局 / 局部条件

    • 支持引入额外条件信号(如说话人特征、文本内容),实现 “可控语音生成”;

    • 例:Conditional WaveNet 通过全局条件控制说话人音色,通过局部条件控制逐帧发音内容。

实际应用优势

  • 在真实场景任务中表现优异,如:
    • 语音合成(TTS):生成接近真人的自然语音;
    • 语音转换(VC):实现高保真的音色转换;
    • 语音增强:有效修复噪声污染的语音。

局限性

  • 推理速度慢;
  • 原因:自回归生成的天然缺陷 —— 必须按时间顺序逐点计算,无法并行,导致实时性差。

FFTNet

在这里插入图片描述
FFTNet(快速傅里叶变换网络),它是针对文本转语音(TTS)任务的一种新型模型,主要围绕 “提速” 和 “提升音质” 展开:FFTNet 则通过算法优化,大幅提升了语音生成的实时性。展示了一些训练和合成技术,这些技术能同时提升 WaveNet 和 FFTNet 生成音频的质量
在这里插入图片描述
模型通过 线性组合多源特征 + 注入辅助条件,让生成过程既利用多维度输入信息,又能被外部条件(如文本、风格)精准控制,是 “可控生成” 类任务的典型技术思路。

在这里插入图片描述
FFTNet(快速傅里叶变换网络)用于提升模型训练效果或最终音频质量的技巧:

1. Zero padding(零填充)

  • 说明:训练时,在音频的开头填充零
  • 目的:调整音频长度(使输入满足模型固定长度要求),或为模型提供 “起始阶段” 的稳定输入(避免开头部分因缺乏历史信息导致生成不稳定)。

2. Conditional sampling(条件采样)

  • 核心:采样过程受额外条件控制(如说话人特征、文本内容等)。
  • 作用:让生成的音频 “符合指定条件”(如用特定说话人音色生成语音、按文本内容生成对应语音)。

3. Injected noise(注入噪声)

  • 说明:训练时,向输入 x 中注入高斯噪声,但目标真实标签保持 “干净”。
  • 目的:增强模型的鲁棒性(让模型在有噪声的输入下也能学习到核心特征),同时提升生成音频的 “自然随机性”(避免生成结果过于僵硬)。

4. Post-synthesis denoising(合成后去噪)

  • 说明:对生成的有声音频(voiced audio,如包含元音的语音),应用频谱减法(spectral subtraction) 进行降噪。
  • 作用:去除生成音频中可能存在的 “合成噪声”,提升最终音频的清晰度和自然度。

在这里插入图片描述
FFTNet 的核心价值是 速度突(比 WaveNet 快,甚至 CPU 实时),但 音质与 WaveNet 相当的结论缺乏复现性;不过,其衍生的训练技巧和 “改进版 FFT + 的高 MOS”,仍为自回归语音生成的优化提供了思路。


WaveRNN

在这里插入图片描述
WaveRNN 将 16 位音频拆分为 高位(Coarse) 和 低位(Fine)”两部分,各用 8 位表示(范围 0∼255):

  • 高位(Coarse, ctc_tct:对应更重要的位(More significant),决定音频的 大体幅值范围;
  • 低位(Fine, ftf_tft:对应次要的位(Less significant),补充 精细的幅值细节。

在这里插入图片描述
Coarse 分支 是 WaveRNN 双 Softmax 分层建模的核心:

  • 先通过 GRU 捕捉音频的宏观幅值特征(粗粒度);
  • 再结合 Fine 分支补充 “微观细节”,最终实现 “高效且高保真” 的音频生成。
    在这里插入图片描述

细粒度分支的输入包含 “当前时刻粗粒度输出ctc_tct,说明细粒度细节需基于粗粒度的宏观幅值生成(如先确定声音大概有多响,再细化响度的微小波动);

分层建模:Coarse 分支捕捉音频的骨架幅值范围,Fine 分支补充骨架上的纹理细节波动,两者结合实现 “高效 + 高保真” 的 16 位音频生成(对比直接建模 65536 维更轻量)。

在这里插入图片描述
WaveRNN 模型的加速方法,通过稀疏化和子尺度优化等技术,实现移动端 CPU 的实时语音生成:

  • Sparse WaveRNN(稀疏化 WaveRNN)

    • Weight Sparsification Method(权重稀疏化方法):对模型的权重进行稀疏化处理(即让大量权重为 0),减少计算时的乘法操作,提升推理速度;
    • Structured Sparsity(结构化稀疏):不仅让权重稀疏,还保证稀疏的结构性(如按行、列或块稀疏),使硬件(如 CPU)能利用稀疏性进行高效并行计算。
  • Subscale WaveRNN(子尺度 WaveRNN)

    • Subscale dependency scheme(子尺度依赖策略):将音频生成的长时序依赖拆解为子尺度的短依赖,降低模型的记忆负担,加速推理;

    • Batched sampling(批量采样):同时对多个子尺度的语音片段进行采样,利用批量计算提升效率(类似并行处理多个小任务)。

通过上述稀疏化和子尺度优化,WaveRNN 能在移动设备的 CPU上实现 实时语音生成


WaveGlow

在这里插入图片描述

生成对抗网络(GAN)

  • 生成器(Generator, G):输入随机噪声 ,生成伪造样本 ;

  • 判别器(Discriminator, D):输入真实样本 或伪造样本,输出 “属于真实样本的概率”(0/1 二分类)。

  • 极小极大博弈(minimax the classification error loss)

    • 生成器目标:生成尽可能逼真的样本,最小化判别器的分类准确率(让判别器无法区分真假);
    • 判别器 目标:最大化对真假样本的分类准确率(正确区分真实与伪造样本);
    • 数学上通过极小极大损失函数实现。

基于流的生成模型(Flow-Based Model)

  • 流变换(Flow):输入真实样本,通过可逆变换(双射函数)将其映射到隐空间的简单分布(如高斯分布);

  • 逆变换(Inverse):输入隐空间噪声,通过流变换的逆操作生成样本。

  • 最小化负对数似然(minimize the negative log-likelihood)

    • 核心思想:通过可逆变换,让真实样本 在隐空间 的分布尽可能接近简单分布(如高斯分布);
    • 数学上通过最大化 “数据的对数似然” 实现。

在这里插入图片描述

  • 训练:通过优化算法最大化 logq(x)logq(x)logq(x),使模型学习到能将真实数据 x 映射到正态分布 z 的可逆流 fff
  • 生成:从标准正态分布采样 z,通过逆变换 f−1(z)f^{−1}(z)f1(z) 生成逼真样本 x′。

在这里插入图片描述
基于流的生成模型通过 “分而治之” 的策略设计 f

  1. 将复杂的可逆变换拆解为多个简单可逆子变换的堆叠;
  2. 每个子变换(如耦合层)保证可逆性和低计算成本;
  3. 整体通过深度堆叠实现对高维复杂数据分布的建模。

在这里插入图片描述
WaveGlow 模型的核心架构:

核心流程(左侧主模块,重复 12 次)

  1. 输入 xxx:原始语音波形(时域信号);
  2. squeeze to vectors:将波形数据 “压缩” 为向量形式,调整维度以适配后续流变换;
  3. invertible 1×1 convolution:可逆的 1×1 卷积,用于混合特征通道(类似 “洗牌” 操作,增强特征交互);
  4. affine coupling layer:仿射耦合层(流模型的核心模块),通过 “固定部分引导变换部分” 实现可逆的特征映射,最终将输入映射到隐空间噪声 zzz(服从标准正态分布)。

条件注入(右侧细节模块)

WaveGlow 是条件生成模型,需引入 “梅尔频谱(mel-spectrogram)” 作为条件控制生成的语音内容:

  1. upsampled mel-spectrogram:上采样后的梅尔频谱(与波形时序对齐);
  2. WN(WaveNet 模块):基于 WaveNet 的结构,处理梅尔频谱并生成 “条件特征”;
  3. affine xform:仿射变换,将 WN 的输出与流模块的特征融合,使生成的语音 “内容与梅尔频谱一致”;
  4. xax_axa,xbx_bxb:特征的两个分支,通过仿射耦合层实现 “条件引导的可逆变换”。

在这里插入图片描述

  • WaveGlow 采用基于流(Flow-Based)的架构,使得音频合成速度超过实时(即生成一段音频的时间,比音频本身的时长更短)。
  • WaveGlow 训练难度极高,原始论文中需要8 块 Nvidia GV100 高端 GPU 才能完成训练。

总结

一、音质(Quality)

  • 结论:WaveNet>others
  • 解释:WaveNet 生成的语音自然度最高(接近真人),其他模型(如 WaveRNN、FFTNet、WaveGlow)在音质上略逊于 WaveNet。

二、训练速度(Training Speed)

  • 结论:WaveRNN>=WaveNet>=FFTNet>>WaveGlow

三、推理速度(Inference Speed)

(1)实时性标准:在16kHz 采样率(即音频每秒有 16000 个采样点)下,生成速度与播放速度同步。

(2)模型对比

  • WaveGlow (520kHz)>>Real-time:WaveGlow 推理速度极快(生成速度达 520kHz),远超过实时;
  • Real-time>WaveRNN>=FFTNet:WaveRNN、FFTNet 能满足实时,但速度慢于 WaveGlow;
  • WaveNet (0.11kHz):WaveNet 推理极慢(仅 0.11kHz),远低于实时。

(3)传统算法对比:高度优化的 Griffin-Lim 算法推理速度达 507kHz,与 WaveGlow 相当。

四、领域挑战与未来方向

(1)当前困境:神经声码器存在 “两难”:要么推理慢(如 WaveNet),要么训练难(如 WaveGlow)。

(2)优化需求:现有模型需在 “架构、训练策略、硬件加速” 等方面深度优化,才能平衡性能与效率。

(3)未来工作:研究的重要方向是开发 “快、音质高、易训练” 三者兼备的声码器

http://www.xdnf.cn/news/1409293.html

相关文章:

  • html添加水印
  • 2025年- H103-Lc211--3090. 每个字符最多出现两次的最长子字符串(双指针)--Java版
  • leetcode 268 丢失的数字
  • AG32 Nano开发板的烧录与调试工具(二)
  • 【开题答辩全过程】以 基于vue+springboot的校园疫情管理系统的设计与实现为例,包含答辩的问题和答案
  • 异步编程与面向对象知识总结
  • 家庭全光组网高温故障深度分析与散热重构全记录
  • 【图论】Graph.jl 核心函数
  • 一种使用 Java / Kotlin 编写检测BT种子的磁力链接是否有可用 peers 的程序
  • 扩展:如何设计与实现一个微服务架构下的跨服务异常处理适配器?
  • linux修改权限命令chmod
  • sunset: twilight靶场
  • 利用ms-swift微调和百炼平台微调大模型
  • FTP - 学习/实践
  • 【学习笔记】LLM Interview(Agent相关)
  • (附源码)基于Vue的教师档案管理系统的设计与实现
  • 安装Android Studio
  • centos 7 安装docker、docker-compose教程
  • SketchUp Pro 2024 Mac 3D建模 草图设计大师
  • Redis八股小记
  • 【了解下TJ、TC、TB、TT、TA、qJA、qJC、qJB、YJB、YJT】
  • Asible——将文件部署到受管主机和管理复杂的Play和Playbook
  • [linux仓库]解剖Linux内核:文件描述符(fd)的‘前世今生’与内核数据结构探秘
  • 编写一个用scala写的spark程序从本地读取数据,写到本地
  • 【ArcGIS微课1000例】0150:如何根据地名获取经纬度坐标
  • openssl使用SM2进行数据加密和数据解密
  • 科普:requirements.txt 和 environment.yml
  • Labview使用modbus或S7与PLC通信
  • Machine Learning HW3 report:图像分类(Hongyi Lee)
  • 《深入剖析Kafka分布式消息队列架构奥秘》之Springboot集成Kafka