VITS学习笔记


毕设选了个个性化文本转语音,目前进度和相关笔记与更改

项目链接:以后再放吧

1. 项目概述

VITS (Variational Inference with adversarial learning for end-to-end Text-to-Speech) 是一个端到端的文本到语音合成系统,它结合了变分推理和对抗学习的方法,能够生成高质量的语音。本项目是基于 VITS 模型构建的语音合成应用。

2. 系统架构

2.1 核心模块

2.1.1 文本处理模块

文本处理模块负责将原始文本转换为模型可处理的数字序列。主要功能包括:

  • 文本规范化:将数字、缩写、特殊符号等转换为标准形式
  • 音素转换:将文本转换为音素序列,便于模型学习发音规则
  • 序列生成:将音素序列转换为模型输入的数字序列

在本项目中,文本处理主要通过 text_to_sequence 函数实现,该函数位于 text/__init__.py 文件中。它使用 text_cleaners 对文本进行清洗,然后将文本转换为音素序列,最后映射为数字序列。

1
2
3
4
5
def text_to_sequence(text, cleaner_names):
# 文本清洗
# 音素转换
# 序列生成
return sequence

2.1.2 VITS 模型

VITS 模型是系统的核心,负责将文本序列转换为语音波形。它由以下几个关键组件组成:

  1. 文本编码器 (Text Encoder)

    • 基于 Transformer 结构,使用自注意力机制处理文本序列
    • 实现在 attentions.py 中的 Encoder 类
    • 包含多头注意力层 ( MultiHeadAttention ) 和前馈网络 ( FFN )
    • 输出文本的高级特征表示
  2. 持续预测器 (Duration Predictor)

    • 预测每个音素的持续时间
    • 实现在 models.py 中的 StochasticDurationPredictor 类
    • 使用随机变分推理来建模持续时间的不确定性
    • 通过单调对齐搜索 (MAS) 算法学习文本和语音的对齐关系
  3. 后验编码器 (Posterior Encoder)

    • 将目标梅尔谱图编码为潜在表示
    • 实现在 models.py 中的 PosteriorEncoder 类
    • 使用 WaveNet 风格的卷积网络提取声学特征
    • 输出潜在变量的均值和方差
  4. 流模型 (Flow)

    • 使用规范化流将潜在表示转换为声学特征
    • 实现在 models.py 中的 ResidualCouplingBlock 类
    • 通过可逆变换实现潜在空间和声学特征空间的映射
    • 包含多个耦合层,每层由 WaveNet 或 Transformer 网络参数化
  5. HiFi-GAN 声码器 (Decoder)

    • 将声学特征转换为波形
    • 实现在 models.py 中的 Generator 类
    • 使用转置卷积进行上采样
    • 包含多个残差块,提高生成音频的质量
      这些组件在 SynthesizerTrn 类中集成,形成完整的 VITS 模型。

2.1.3 Web 服务

Web 服务模块提供了 RESTful API 接口,允许用户通过 HTTP 请求生成语音。主要功能包括:

  1. API 端点

    • /synthesize :单说话人语音合成
    • /synthesize_with_speaker :多说话人语音合成
    • /get_speakers :获取可用说话人列表
    • /get_history :获取历史合成记录
  2. 请求处理

    • 解析用户请求参数
    • 调用推理函数生成语音
    • 返回生成的音频文件路径
  3. 历史记录管理

    • 记录合成历史,包括文本、时间戳和音频文件名
    • 提供历史记录查询功能
  4. 静态文件服务

    • 提供生成的音频文件下载
      Web 服务使用 Flask 框架实现,主要代码在 app.py 文件中。它通过调用 inference.py 中的函数来执行实际的语音合成过程。

2.2 文件结构

  • app.py: Web 服务主程序,使用 Flask 框架
  • inference.py: 模型推理代码,包含语音合成的核心功能
  • models.py: 模型定义
  • modules.py: 模型组件定义
  • attentions.py: 注意力机制实现
  • commons.py: 通用工具函数
  • text/: 文本处理相关代码
  • configs/: 模型配置文件
  • pretrained_models/: 预训练模型存储目录

3. 模型原理

3.1 VITS 模型架构

VITS 模型是一个端到端的 TTS 系统,通过变分推理和对抗学习相结合的方法实现高质量的语音合成。其核心架构包含以下主要组件:

3.1.1 文本编码器 (Text Encoder)

文本编码器负责将输入的文本序列转换为高维特征表示,为后续的声学建模提供基础。

  • 结构特点:基于 Transformer 架构,利用自注意力机制捕获文本中的长距离依赖关系
  • 工作原理
    • 首先将文本转换为嵌入向量
    • 通过多层自注意力网络处理序列信息
    • 每个自注意力层包含多头注意力机制,能够从不同角度学习文本特征
    • 使用位置编码保留序列中的位置信息
  • 技术优势:相比传统的 RNN/LSTM,Transformer 结构能更好地并行计算,并捕获全局上下文信息
  • 输出:生成文本的高级语义和语音学特征表示,为后续的持续时间预测和声学特征生成提供基础

3.1.2 后验编码器 (Posterior Encoder)

后验编码器在训练阶段起关键作用,它将目标梅尔谱图编码为潜在表示,为变分推理提供参考。

  • 结构特点:采用 WaveNet 风格的卷积网络,包含多层扩张卷积
  • 工作原理
    • 接收目标梅尔谱图作为输入
    • 通过多层卷积网络提取声学特征
    • 使用扩张卷积增大感受野,捕获更广范围的上下文信息
    • 最终输出潜在变量的均值和方差
  • 变分推理
    • 通过重参数化技巧从正态分布中采样潜在变量
    • 使用 KL 散度约束潜在空间,使其接近标准正态分布
    • 在推理阶段,可以直接从先验分布采样,无需后验编码器
  • 技术意义:实现了声学特征的概率建模,增强了合成语音的自然度和多样性

3.1.3 流模型 (Flow)

流模型是 VITS 的核心创新之一,它通过一系列可逆变换,实现潜在表示和声学特征之间的映射。

  • 结构特点:基于规范化流 (Normalizing Flow) 设计,由多个可逆变换组成
  • 工作原理
    • 使用耦合层 (Coupling Layer) 实现可逆变换
    • 每个耦合层将输入分为两部分,一部分保持不变,另一部分通过神经网络变换
    • 神经网络通常由 WaveNet 或 Transformer 结构参数化
    • 通过多个耦合层的组合,实现复杂的分布变换
  • 双向流动
    • 训练时:从后验分布到声学特征的映射
    • 推理时:从先验分布到声学特征的映射
  • 技术优势
    • 精确的似然计算,便于优化
    • 可逆性保证信息不丢失
    • 能够建模复杂的条件分布

3.1.4 HiFi-GAN 声码器 (Decoder)

HiFi-GAN 声码器负责将声学特征转换为实际的波形信号,是最终音频生成的关键组件。

  • 结构特点:基于生成对抗网络 (GAN),包含生成器和判别器
  • 工作原理
    • 生成器:通过转置卷积和残差块将声学特征上采样为波形
    • 判别器:区分真实音频和合成音频,提供对抗损失
    • 多尺度判别器:在不同时间分辨率上评估音频质量
  • 上采样过程
    • 使用多层转置卷积逐步增加时间分辨率
    • 每层之间添加残差连接,保留细节信息
    • 使用激活函数引入非线性,增强表达能力
  • 技术优势
    • 相比传统声码器,生成更高质量的音频
    • 更快的推理速度,适合实时应用
    • 通过对抗学习,生成更接近真实语音的波形

3.1.5 模型集成与端到端训练

VITS 模型的一个重要特点是端到端训练,各组件协同工作:

  • 联合优化:所有组件同时训练,避免误差累积
  • 多目标学习
    • 重构损失:确保生成的语音与目标接近
    • KL 散度损失:约束潜在空间
    • 对抗损失:提高音频质量和自然度
    • 持续时间损失:优化音素持续时间预测
  • 推理流程
    • 文本 → 文本编码器 → 持续预测器 → 流模型 → 声码器 → 波形
  • 多说话人扩展
    • 通过添加说话人嵌入,实现多说话人语音合成
    • 说话人嵌入可以条件化流模型和声码器,保留说话人特征

这种端到端的架构设计使 VITS 能够生成高质量、自然的语音,同时保持较快的推理速度。

3.2 关键技术点

3.2.1 变分推理 (Variational Inference)

变分推理是 VITS 模型的核心技术之一,用于建立声学特征的概率模型。

  • 基本原理

    • 使用变分自编码器 (VAE) 框架,将声学特征编码为潜在空间中的分布
    • 通过后验编码器将梅尔谱图映射为潜在变量的均值和方差
    • 使用重参数化技巧从分布中采样,保证梯度可以反向传播
  • KL 散度约束

    • 使用 KL 散度作为正则项,约束后验分布接近先验分布(通常是标准正态分布)
    • KL 散度计算公式:KL(q(z|x) || p(z)) = 0.5 * sum(μ² + σ² - log(σ²) - 1)
    • 这种约束使得模型学习到更加紧凑和有意义的潜在表示
  • 优势

    • 能够捕捉语音的不确定性和多样性
    • 在推理阶段,可以通过调整采样噪声控制合成语音的变化程度
    • 与流模型结合,实现高质量的声学特征生成

3.2.2 对抗学习 (Adversarial Learning)

对抗学习通过生成对抗网络 (GAN) 的框架提高合成音频的质量和自然度。

  • 基本原理

    • 生成器:VITS 模型的声码器部分,将声学特征转换为波形
    • 判别器:评估生成音频的真实性,区分真实音频和合成音频
    • 两者进行对抗训练,生成器尝试生成更真实的音频,判别器尝试更准确地区分
  • 多尺度判别器

    • VITS 使用多个判别器,在不同时间分辨率上评估音频
    • 包括原始波形判别器和多个周期判别器
    • 这种设计能够同时关注全局结构和局部细节
  • 对抗损失

    • 生成器损失:鼓励生成器产生能够”欺骗”判别器的音频
    • 判别器损失:提高判别器区分真假音频的能力
    • 最终达到纳什均衡,生成高质量的音频
  • 优势

    • 相比传统的 L1/L2 损失,对抗损失能够生成更加自然、细节丰富的音频
    • 减少了合成音频中的伪影和噪声
    • 提高了音频的整体感知质量

3.2.3 单调对齐搜索 (Monotonic Alignment Search, MAS)

单调对齐搜索是解决文本和语音对齐问题的关键技术,避免了传统 TTS 系统中需要外部对齐工具的限制。

  • 基本原理

    • 基于动态规划算法,在训练过程中自动学习文本和语音的对齐关系
    • 利用单调性约束(文本和语音的对应关系应该是单调递增的)
    • 通过最大化似然估计,找到最优的对齐路径
  • 算法流程

    1. 计算文本编码和梅尔谱图之间的相似度矩阵
    2. 使用动态规划算法,在满足单调约束的条件下找到最优路径
    3. 根据对齐路径,计算每个音素的持续时间
    4. 使用这些持续时间训练持续预测器
  • 优势

    • 无需外部对齐工具,实现端到端训练
    • 能够处理复杂的对齐关系,如一对多、多对一的映射
    • 提高了合成语音的韵律自然度和准确性

3.2.4 随机持续建模 (Stochastic Duration Modeling)

随机持续建模通过概率模型处理语音中的时长变化,使合成语音更加自然多样。

  • 基本原理

    • 传统 TTS 系统通常使用确定性的持续时间预测,导致合成语音缺乏变化
    • VITS 使用随机变分推理框架建模持续时间的分布
    • 通过流模型实现复杂的条件分布建模
  • 实现方式

    • 使用条件变分自编码器结构
    • 输入文本特征,预测持续时间的分布参数
    • 在训练时使用真实持续时间作为监督信号
    • 在推理时从分布中采样,引入随机性
  • 流变换

    • 使用规范化流将简单分布(如高斯分布)变换为复杂分布
    • 通过一系列可逆变换,实现精确的似然计算
    • 能够捕捉持续时间的复杂分布特性
  • 优势

    • 能够生成节奏多变、更加自然的语音
    • 通过调整采样参数,控制语速和韵律变化
    • 提高了合成语音的表现力和多样性

这四种关键技术的结合使 VITS 能够实现高质量、自然的端到端语音合成,克服了传统 TTS 系统的多个限制,代表了当前语音合成领域的最先进水平。

4. API 接口

4.1 单说话人接口

  • 端点: /synthesize
  • 方法: POST
  • 参数:
    • text: 要合成的文本
  • 返回:
    • audio_file: 生成的音频文件名
    • message: 状态信息

4.2 多说话人接口

  • 端点: /synthesize_with_speaker
  • 方法: POST
  • 参数:
    • text: 要合成的文本
    • speaker_id: 说话人 ID
  • 返回:
    • audio_file: 生成的音频文件名
    • speaker_id: 使用的说话人 ID
    • message: 状态信息

4.3 获取说话人列表

  • 端点: /get_speakers
  • 方法: GET
  • 返回:
    • speakers: 可用说话人列表

4.4 获取历史记录

  • 端点: /get_history
  • 方法: GET
  • 返回:
    • history: 历史合成记录

5. 模型训练

5.1 训练流程

VITS 模型的训练包括以下步骤:

  1. 数据预处理:准备文本和对应的音频数据
  2. 模型初始化:设置模型参数和超参数
  3. 训练循环:
    • 生成器训练:优化语音合成质量
    • 判别器训练:区分真实和合成的音频
  4. 模型评估和保存

电脑玩不起来。。。。是我冒昧了

5.2 训练脚本

  • train.py: 单说话人训练脚本
  • train_ms.py: 多说话人训练脚本

5.3 配置文件

配置文件定义了模型结构和训练参数:

  • ljs_base.json: LJSpeech 数据集的基础配置
  • vctk_base.json: VCTK 多说话人数据集的配置

6. 推理过程

1
2
3
4
5
6
7
8
9
10
11
12
13
单说话人推理
def synthesize_text(text, model_path, config_path, output_wav):
# 加载配置和模型
# 文本处理
# 生成音频
# 保存音频文件
多说话人推理
def synthesize_text_with_speaker(text, model_path, config_path, output_wav, speaker_id):
# 加载配置和模型
# 文本处理
# 指定说话人
# 生成音频
# 保存音频文件

7.参考资料


文章作者: ZTGD
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZTGD !
评论
  目录