【VALL-E-02】核心原理

news2024/9/21 2:47:42

本文系个人知乎专栏文章迁移
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_audio

import torchaudio
import torch

model = 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 model
        model = 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1543890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MATLAB源码-第168期】基于matlab的布谷鸟优化算法(COA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 布谷鸟优化算法(Cuckoo Optimization Algorithm, COA)是一种启发式搜索算法,其设计灵感源自于布谷鸟的独特生活习性,尤其是它们的寄生繁殖行为。该算法通过模拟布谷鸟在自然界中…

总结虚函数表机制——c++多态底层原理

前言: 前几天学了多态。 然后过去几天一直在测试多态的底层与机制。今天将多态的机制以及它的本质分享给受多态性质困扰的友友们。 本节内容只涉及多态的原理, 也就是那张虚表的规则,有点偏向底层。 本节不谈语法!不谈语法&#x…

Redis中RDB的dirty机制和AOF中的后台重写机制

RDB的dirty计数器和lastsave属性 服务器除了维护saveparams数组之外,还维持着一个dirty计数器,以及一个lastsave属性: 1.dirty计数器记录距离上一次成功执行SAVE命令或者BGSAVE命令之后,服务器对数据库状态(服务器中的所有数据库)进行了多少次修改(包括…

2.4 如何运行Python程序

如何运行Python程序? Python是一种解释型的脚本编程语言,这样的编程语言一般支持两种代码运行方式: 1) 交互式编程 在命令行窗口中直接输入代码,按下回车键就可以运行代码,并立即看到输出结果;执行完一行…

YOLOv5从入门到入土!(一)训练教程

一、下载 代码地址:https://github.com/ultralytics/yolov5 前往YOLOv5官方github,按照图中步骤下载代码及预训练权重。 二、训练 将下载的预训练权重路径填入train.py的weights参数中,并补全其余必要文件。 关于data.yaml看往期教程&#x…

fifo ip核 ————读写时钟同步

1.原理 timescale 1ns/1ns module tb_fifo();reg sys_clk ; reg sys_rst_n ; reg [7:0] pi_data ; reg rd_req ; reg wr_req ; reg [2:0] cnt;wire empty ; wire full ; wire [7:0] po_data ; wire [7:0] usedw ;initial begins…

下载网页上的在线视频 网络视频 视频插件下载

只需要在浏览器上安装一个插件,就可以下载大部分的视频文件,几秒到一两个小时的视频,基本都不是问题。详细解决如下: 0、因为工作需要,需要获取某网站上的宣传视频,我像往常一样,查看视频的url…

VUE:内置组件<Teleport>妙用

一、<Teleport>简介 <Teleport>能将其插槽内容渲染到 DOM 中的另一个位置。也就是移动这个dom。 我们可以这么使用它: 将class为boxB的盒子移动到class为boxA的容器中。 <Teleport to".boxA"><div class"boxB"></div> &…

Redis入门到实战-第三弹

Redis入门到实战 Redis数据类型官网地址Redis概述Redis数据类型介绍更新计划 Redis数据类型 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#…

Linux文件系统 底层原理

linux文件、目录、Inode inode负责文件的元数据和数据存储&#xff0c;文件存储块负责实际数据的存储&#xff0c;而目录文件维护文件名和inode之间的联系。 1. 用户空间到内核空间 首先&#xff0c;当用户程序请求打开一个文件时&#xff08;例如使用open系统调用&#xff09…

Linux账号管理与ACL权限设置

文章目录 Linux的账户和用户组用户标识符&#xff1a;UID与GID用户账号用户组&#xff1a;有效与初始用户组groups&#xff0c;newgrp 账号管理新增与删除用户&#xff1a;useradd、相关配置文件、passwd、usermod、userdel用户功能&#xff1a;id、finger、chfn、chsh新增与删…

Prometheus(四):VMware Vsphere监控及数据展示

目录 1 vmware exporter安装配置1.1 vmware exporter介绍1.2 安装 - 使用kubernetes部署1、下载2、修改配置文件3、执行安装4、查看 1.3 安装-使用docker的方式1.4 Prometheus配置1.5 Grafana配置&#xff08;模板页面还需要修改&#xff09; 总结 1 vmware exporter安装配置 …

文件操作3

随机读写数据文件 一、随机读写原理 在我们写数据时&#xff0c;有一个光标不断的在随着新写入的数据往后移动&#xff1b; 而读数据时&#xff0c;也有一个看不见光标&#xff0c;随着已经读完的数据&#xff0c;往后移动 这里的文件读写位置标记——可以想象成图形界面里的…

人、机中的幻觉和直觉

对于人类而言&#xff0c;幻觉和直觉是两种不同的心理现象。幻觉是一种错误的感知或体验&#xff0c;而直觉是一种在没有明显依据的情况下产生的直观认知。这两种概念在心理学和认知科学中具有不同的意义和研究对象。 人类幻觉是指个体在感知或体验上出现的错误&#xff0c;即看…

【Selenium】隐藏元素的定位和操作|隐藏与isDisplay方法

一、selenium 中隐藏元素如何定位&#xff1f; 如果单纯的定位的话&#xff0c;隐藏元素和普通不隐藏元素定位没啥区别&#xff0c;用正常定位方法就行了 但是吧~~~能定位到并不意味着能操作元素&#xff08;如click,clear,send_keys&#xff09; 二、隐藏元素 如下图有个输入框…

C语言例4-9:格式字符s的使用例子

代码如下&#xff1a; //格式字符s的使用例子 #include<stdio.h> int main(void) {printf("%s,%5s,%-5s\n","Internet","Internet","Internet");//以三种不同格式&#xff0c;输出字符串printf("%10.5s,%-10.5s,%4.5s\n&q…

电脑卸载软件怎么清理干净?电脑清理的5种方法

随着我们在电脑上安装和卸载各种软件&#xff0c;很多时候我们会发现&#xff0c;即使软件被卸载&#xff0c;其残留的文件和注册表项仍然存在于电脑中&#xff0c;这不仅占用了宝贵的磁盘空间&#xff0c;还可能影响电脑的性能。那么&#xff0c;如何确保在卸载软件时能够彻底…

【iOS ARKit】播放3D音频

3D音频 在前面系列中&#xff0c;我们了解如何定位追踪用户&#xff08;实际是定位用户的移动设备&#xff09;的位置与方向&#xff0c;然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了&#xff0c;则通过VIO 和 IMU更新用户的位置与方向信息&…

【排序算法】插入排序与选择排序详解

文章目录 &#x1f4dd;选择排序是什么&#xff1f;&#x1f320;选择排序思路&#x1f309; 直接选择排序&#x1f320;选择排序优化&#x1f320;优化方法&#x1f309;排序优化后问题 &#x1f320;选择排序效率特性 &#x1f309;插入排序&#x1f320;插入排序实现 &#…

前端基础 Vue -组件化基础

1.全局组件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script src&…