毕设选了个个性化文本转语音,目前进度和相关笔记与更改
项目链接:以后再放吧
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 | def text_to_sequence(text, cleaner_names): |
2.1.2 VITS 模型
VITS 模型是系统的核心,负责将文本序列转换为语音波形。它由以下几个关键组件组成:
文本编码器 (Text Encoder)
- 基于 Transformer 结构,使用自注意力机制处理文本序列
- 实现在 attentions.py 中的 Encoder 类
- 包含多头注意力层 ( MultiHeadAttention ) 和前馈网络 ( FFN )
- 输出文本的高级特征表示
持续预测器 (Duration Predictor)
- 预测每个音素的持续时间
- 实现在 models.py 中的 StochasticDurationPredictor 类
- 使用随机变分推理来建模持续时间的不确定性
- 通过单调对齐搜索 (MAS) 算法学习文本和语音的对齐关系
后验编码器 (Posterior Encoder)
- 将目标梅尔谱图编码为潜在表示
- 实现在 models.py 中的 PosteriorEncoder 类
- 使用 WaveNet 风格的卷积网络提取声学特征
- 输出潜在变量的均值和方差
流模型 (Flow)
- 使用规范化流将潜在表示转换为声学特征
- 实现在 models.py 中的 ResidualCouplingBlock 类
- 通过可逆变换实现潜在空间和声学特征空间的映射
- 包含多个耦合层,每层由 WaveNet 或 Transformer 网络参数化
HiFi-GAN 声码器 (Decoder)
- 将声学特征转换为波形
- 实现在 models.py 中的 Generator 类
- 使用转置卷积进行上采样
- 包含多个残差块,提高生成音频的质量
这些组件在 SynthesizerTrn 类中集成,形成完整的 VITS 模型。
2.1.3 Web 服务
Web 服务模块提供了 RESTful API 接口,允许用户通过 HTTP 请求生成语音。主要功能包括:
API 端点
- /synthesize :单说话人语音合成
- /synthesize_with_speaker :多说话人语音合成
- /get_speakers :获取可用说话人列表
- /get_history :获取历史合成记录
请求处理
- 解析用户请求参数
- 调用推理函数生成语音
- 返回生成的音频文件路径
历史记录管理
- 记录合成历史,包括文本、时间戳和音频文件名
- 提供历史记录查询功能
静态文件服务
- 提供生成的音频文件下载
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 系统中需要外部对齐工具的限制。
基本原理:
- 基于动态规划算法,在训练过程中自动学习文本和语音的对齐关系
- 利用单调性约束(文本和语音的对应关系应该是单调递增的)
- 通过最大化似然估计,找到最优的对齐路径
算法流程:
- 计算文本编码和梅尔谱图之间的相似度矩阵
- 使用动态规划算法,在满足单调约束的条件下找到最优路径
- 根据对齐路径,计算每个音素的持续时间
- 使用这些持续时间训练持续预测器
优势:
- 无需外部对齐工具,实现端到端训练
- 能够处理复杂的对齐关系,如一对多、多对一的映射
- 提高了合成语音的韵律自然度和准确性
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
: 使用的说话人 IDmessage
: 状态信息
4.3 获取说话人列表
- 端点:
/get_speakers
- 方法: GET
- 返回:
speakers
: 可用说话人列表
4.4 获取历史记录
- 端点:
/get_history
- 方法: GET
- 返回:
history
: 历史合成记录
5. 模型训练
5.1 训练流程
VITS 模型的训练包括以下步骤:
- 数据预处理:准备文本和对应的音频数据
- 模型初始化:设置模型参数和超参数
- 训练循环:
- 生成器训练:优化语音合成质量
- 判别器训练:区分真实和合成的音频
- 模型评估和保存
电脑玩不起来。。。。是我冒昧了
5.2 训练脚本
train.py
: 单说话人训练脚本train_ms.py
: 多说话人训练脚本
5.3 配置文件
配置文件定义了模型结构和训练参数:
ljs_base.json
: LJSpeech 数据集的基础配置vctk_base.json
: VCTK 多说话人数据集的配置
6. 推理过程
1 | 单说话人推理 |
7.参考资料
- [2106.06103] Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech
- jaywalnut310/vits: VITS: Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech
- [2010.05646] HiFi-GAN: Generative Adversarial Networks for Efficient and High Fidelity Speech Synthesis
- [2005.11129] Glow-TTS: A Generative Flow for Text-to-Speech via Monotonic Alignment Search
- 用于端到端文本到语音转换的带有对抗学习的条件变分自编码器 - 知乎