【VALL-E-02】核心原理

2024-03-25 21:44
文章标签 02 原理 核心 vall

本文主要是介绍【VALL-E-02】核心原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文系个人知乎专栏文章迁移
VALL-E 网络是GPT-SOVITS很重要的参考

知乎专栏地址:
语音生成专栏

相关文章链接:
【VALL-E-01】环境搭建
【VALL-E-02】核心原理

【参考】

【1】Neural Codec Language Models are Zero-Shot Text to Speech Synthesizers
【2】https://www.shili8.cn/article/detail_20001089545.html
【3】https://zhuanlan.zhihu.com/p/647390304?utm_id=0
【4】https://github.com/facebookresearch/encodec
【5】https://www.bilibili.com/video/BV1zo4y1K7oK/?spm_id_from=333.337.search-card.all.click&vd_source=030dfdbeaef00211755804fc3102911e
【6】https://www.doc88.com/p-78547750936802.html

1、前置知识点:Encodec

Vall-E 是基于 Encodec 来完成语音编码的生成。

1.1、向量量化编码

在这里插入图片描述

  1. 向量量化压缩把原始信息以字典表的形式做进一步压缩
  2. 在 vall-e 的源码中采用 EuclideanCodebook,每个EuclideanCodebook 默认大小是 1024*128
  3. 每次输入待编码的帧也是128,通过计算欧式距离的最大值,并返回最大值的索引(0~1024之间)

在这里插入图片描述

1.2、总体结构

在这里插入图片描述

  • encodec 是一个encoder 和 decoder 结构,分别利用卷积和反卷积进行压缩和解压缩
  • 中间的残差量化层 Quantier 是对 encoder 压缩完的结构进行进一步压缩
  • 所谓的残差量化,是在每一层的量化后,所形成与输入的差会进行再一次量化,形成一个量化的结果组
  • 由于是残差的,也可知其第一个量化结果能表征最粗粒度的信息,因此在VALL-E中被特殊处理
  • 源码如下图所示,有 nq 的量化器,每次返回其字典中欧式距离最大的索引,最终形成一个 8 维度的向量
    在这里插入图片描述

1.3、代码举例

from encodec import EncodecModel
from encodec.utils import convert_audioimport torchaudio
import torchmodel = EncodecModel.encodec_model_24khz()# 当设置带宽为 6.0 时,采用 nq=8 的编码字典
model.set_target_bandwidth(6.0)wav, sr = torchaudio.load("shantianfang.wav")
wav = convert_audio(wav, sr, model.sample_rate, model.channels)
wav = wav.unsqueeze(0)with torch.no_grad():encoded_frames = model.encode(wav)
codes = torch.cat([encoded[0] for encoded in encoded_frames], dim=-1)
print(codes)
print(codes.shape) # ([1, 8, 725]) 1 段音频,总共 725 帧,每帧的字典索引大小为 8(对应编码字典的 nq)

在 VALL-E 的源码中其设置的带宽也是 6.0,因此与论文中 C 的维度是 8 一致,如下

class AudioTokenizer:"""EnCodec audio."""def __init__(self,device: Any = None,) -> None:# Instantiate a pretrained EnCodec modelmodel = EncodecModel.encodec_model_24khz()model.set_target_bandwidth(6.0)remove_encodec_weight_norm(model)

2、VALL-E 总体结构

Vall-E 论文中将 TTS 问题定义为一个条件编解语言模型,具体如下:

2.1、数据集

考虑一个数据集 D = { x i , y i } D= \{x_i, y_i\} D={xi,yi} ,其中 y 是音频样本 x = { x 0 , x 1 , . . . . , x L } x = \{x_0, x_1, ...., x_L\} x={x0,x1,....,xL} 是 音频 y 对应的【文本音素】序列

2.2、Encodec编解码器

利用一个预训练模型将原始音频数据进行处理,用Encodec的【编码器】:
E n c o d e c ( y ) = C T × 8 Encodec(y) = C^{T \times 8} Encodec(y)=CT×8 编解码后的结果如上式可知是一个二维矩阵,其中长度 T 是原始音频的降采样后的长度(如分为30帧),8 是每一帧的特征长度。
同样用Encodec【解码器】具备相反的能力,定义如下: D e c o d e c ( C ) ≈ y ^ Decodec(C) \approx \hat{y} Decodec(C)y^
在这里插入图片描述

2.3、零样本训练

这里训练的目的最大化 p ( C ∣ x , C ^ ) p(C|x,\hat{C}) p(Cx,C^),定义如下:
C ^ = C ^ T ‘ × 8 \hat{C} = \hat{C}^{T‘ \times 8} C^=C^T×8 是一段语音提示(prompt)对应的编码结果,如上文 b 所示。— 提示语音特征
x 是某个音频数据 y 的【文本因素】的序列,如上文 a 所示 – 目标文本特征

C 是某个音频数据 y 的编码结果,如 上文 b 所示 – 目标语音特征
于是,在训练时,我们的目标是训练一个模型,可以通过一个 【提示语音编码】+【目标文本特征】转换为【目标语音编码】。这个目标语音特征是可以利用 Decodec 转换为最终音频文件。

训练时,【提示语音编码】和【目标语音编码】应该为同一个人,而推理时,将目标说话人一个较短的音频文件生成【提示语音特征】,最终即可构建符合目标人语音效果的【新的目标语音编码】

在这里插入图片描述
理解:
1、在 encodec 的编码量化结果中本质上包含了文本要素(说什么),以及语音要素(如音色等)
2、在 vall-e 的模型中量化结果不需要完整的音频信息,而是从 prompt 的量化结果中提取语音要素 加上 文本要素 后生成一个完整的语音编码量化结果,这个结果被用来生成最终语音

3、VALL-E 核心设计

3.1、自回归模型AR

在这里插入图片描述
自回归模型使用特征中的第一个维度,即 prompt 的 C ^ : 1 \hat{C}_{:1} C^:1 和原始音频对应编码的 C : 1 C_{:1} C:1
该模型是自回归,同时给出 prompt 的全部对应编码特征,然后依次推到知道终结符EOS(类似经典transformer的解码器)

3.2、非自回归模型NAR

在这里插入图片描述
自回归模型使用特征中除第一个之外的维度

模型是非自回归的,对于整个编码序列,用之前的全部特征维度 C , 1 : j − 1 C_{,1:j-1} C,1:j1 推导 C : j C_{:j} C:j

这篇关于【VALL-E-02】核心原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846329

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1