TTS相关

文章目录

  • VALL-E-X
    • 简介
    • code
  • vist
    • 论文
    • 解读
    • 代码解读
    • 模块
    • loss
    • 代码
  • valle
  • 名词解释

VALL-E-X

简介

微软VALL-E-X:夸克在用
可以预训练模型
端到端

code

code:https://github.com/Plachtaa/VALL-E-X/tree/master
报错1:

File "/mnt/TTS/VALL-E-X/test.py", line 6, in <module>preload_models()File "/mnt/TTS/VALL-E-X/utils/generation.py", line 89, in preload_modelsvocos = Vocos.from_pretrained('charactr/vocos-encodec-24khz').to(device)File "/mnt/envs/tts_env/lib/python3.10/site-packages/vocos/pretrained.py", line 67, in from_pretrainedconfig_path = hf_hub_download(repo_id=repo_id, filename="config.yaml", revision=revision)File "/mnt/envs/tts_env/lib/python3.10/site-packages/huggingface_hub/utils/_validators.py", line 118, in _inner_fn

报错原因:没有网,无法load远程资料。需要手动下载,放在指定的位置。
下载链接:https://huggingface.co/charactr/vocos-encodec-24khz 页面files and versions
下载的文件:config.yaml / pytorch_model.bin
linux系统放在:ls models–charactr–vocos-encodec-24khz/
注释掉下载的代码:/mnt/envs/tts_env/lib/python3.10/site-packages/vocos/pretrained.py

# config_path = hf_hub_download(repo_id=repo_id, filename="config.yaml", revision=revision)
# model_path = hf_hub_download(repo_id=repo_id, filename="pytorch_model.bin", revision=revision)
config_path = '/root/.cache/huggingface/hub/models--charactr--vocos-encodec-24khz/config.yaml'
model_path = '/root/.cache/huggingface/hub/models--charactr--vocos-encodec-24khz/pytorch_model.bin'

参考解决方案:https://github.com/Plachtaa/VALL-E-X/issues/89

vist

论文

Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech

解读

代码解读

模型结构:gan+flow+vae模型
大框架是vae,训练时用gan,建模的时候用到了flow。

后验分布就是高斯分布;先验分布是高斯分布*flow

模块

Text Encoder:先验的文本的编码器模块,将独立的字表征成上下文相关的特征,得到一个以文字和说话者为条件的先验的分布:text->phonemet->先验分布。
Linear Spectorgram:输入wav,无参数训练的一种傅立叶变换,得到频谱。
posterior encoder:输入频谱,经过编码,得到后验分布。

loss

1、重构loss,输入的wav的梅尔频谱和生成的wav的梅尔频谱计算loss。
2、KL loss:text的先验分布和audio的后验分布要对齐。audio的后验分布是频谱的长度,text的先验分布显然比audio的后验要短,需要将先验扩充一下。
怎么对齐:通过动态规划的方式,找到每个因素持续的时长。先验分布根据时长进行扩展,和后验就在同一个维度了。
3、时长预测器:是一个flow模型,为什么需要时长预测器?infer的时候没有频谱可以来对齐text,需要预测。预测每个因素时长的分布,而不是预测因素时长的期望。有一个kl loss。
4、 gan的loss。
模型不是一个确定性的模型,即,每次预测的结果可能都不一样。采样的时候,是one to many的。

代码

train.py

class TextAudioSpeakerLoader(torch.utils.data.Dataset):def _filter(self)#如果文本太短做过滤。	#dataset被调用的时候,会走getitem函数。text = self.get_text(text) #对phoneme进行离散化,将字符变成索引。
DistributedBucketSampler:#text的长度变化很大,不做桶排序的话,反向梯度的效率会很低。提升训练效率。为什么效率不高,因为text短的话,需要pad较多的无效数据。def __init__(self, dataset, batch_size, boundaries, num_replicas=None, rank=None, shuffle=True):boundaries:#分桶的边界。边界是帧。num_replicas:#gpu卡数。def _create_buckets(self):返回桶,及每个桶的样本量。indices.append(torch.randperm(len(bucket), generator=g).tolist()):shuffle
TextAudioSpeakerCollate_, ids_sorted_decreasing = torch.sort( #根据梅尔频谱的长度进行排序torch.LongTensor([x[1].size(1) for x in batch]),dim=0, descending=True)
net_g = SynthesizerTrn( # 是生成器,从text到wavlen(symbols),hps.data.filter_length // 2 + 1,hps.train.segment_size // hps.data.hop_length,n_speakers=hps.data.n_speakers,**hps.model).cuda(rank)
net_d = MultiPeriodDiscriminator(hps.model.use_spectral_norm).cuda(rank) # 多周期的判别器
optim_g = torch.optim.AdamW( # 生成器的优化函数net_g.parameters(), hps.train.learning_rate, betas=hps.train.betas, eps=hps.train.eps)optim_d = torch.optim.AdamW(# 判别器的优化函数net_d.parameters(),hps.train.learning_rate, betas=hps.train.betas, eps=hps.train.eps)
net_g = DDP(net_g, device_ids=[rank]) # 分布式训练
scheduler_g = torch.optim.lr_scheduler.ExponentialLR(optim_g, gamma=hps.train.lr_decay, last_epoch=epoch_str-2) # 学习率的衰减方案from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler(enabled=hps.train.fp16_run) # 混合训练 fp16进行训练,在效率和性能上进行平衡
x, x_lengths = x.cuda(rank, non_blocking=True), x_lengths.cuda(rank, non_blocking=True) # 把数据copy到gpu上面
y_hat, l_length, attn, ids_slice, x_mask, z_mask,\(z, z_p, m_p, logs_p, m_q, logs_q) = net_g(x, x_lengths, spec, spec_lengths, speakers)
# y_hat 预估波形;l_length 预估波形的长度;并不是所有的波形都参与训练,而是对波形进行了采样,减少内存的消耗。ids_slice:采样后的频谱的id。
spec:线性普
spec_to_mel_torch()线性普转梅尔普
mel_spectrogram_torch() 波形到梅尔普
y_mel = commons.slice_segments(mel, ids_slice, hps.train.segment_size // hps.data.hop_length) # 对梅尔普也进行采样。
y = commons.slice_segments(y, ids_slice * hps.data.hop_length, hps.train.segment_size) # 一个梅尔普对应256个波形点y_d_hat_r, y_d_hat_g, _, _ = net_d(y, y_hat.detach()) # y_d_hat_r真实的判别器的输出,生成的判别器判别器的输出,判别器
with autocast(enabled=False): # 不走fp16loss_disc, losses_disc_r, losses_disc_g = discriminator_loss(y_d_hat_r, y_d_hat_g)loss_disc_all = loss_disc
optim_d.zero_grad()  #判别器梯度置0

model.py

self.dec = Generator(inter_channels, resblock, resblock_kernel_sizes, resblock_dilation_sizes, upsample_rates, upsample_initial_channel, upsample_kernel_sizes, gin_channels=gin_channels) # 波形生成器self.enc_q = PosteriorEncoder(spec_channels, inter_channels, hidden_channels, 5, 1, 16, gin_channels=gin_channels) # 后验编码器
PosteriorEncoder:def forward(self, x, x_lengths, g=None):#g是一个条件,以说话人为条件x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to(x.dtype)x = self.pre(x) * x_maskx = self.enc(x, x_mask, g=g)stats = self.proj(x) * x_maskm, logs = torch.split(stats, self.out_channels, dim=1) # m分布的方差 # logs分布的标准差取logz = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask return z, m, logs, x_maskself.flow = ResidualCouplingBlock(inter_channels, hidden_channels, 5, 1, 4, gin_channels=gin_channels)# 提高先验分布的表达能力的,加flow效果会更好,是先验的flowif use_sdp: #随机时长预测器,(说话的韵律节奏)self.dp = StochasticDurationPredictor(hidden_channels, 192, 3, 0.5, 4, gin_channels=gin_channels)x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths) # x 文本的encode,m_p分布的方差,logs_p分布的标准差,是fseitaz分布的u sigma
z_p = self.flow(z, y_mask, g=g) # 后验经常一个逆flow;或者先验经过一个flow# 动态规划 单调对齐搜索
with torch.no_grad():# negative cross-entropys_p_sq_r = torch.exp(-2 * logs_p) # [b, d, t]neg_cent1 = torch.sum(-0.5 * math.log(2 * math.pi) - logs_p, [1], keepdim=True) # [b, 1, t_s]neg_cent2 = torch.matmul(-0.5 * (z_p ** 2).transpose(1, 2), s_p_sq_r) # [b, t_t, d] x [b, d, t_s] = [b, t_t, t_s]neg_cent3 = torch.matmul(z_p.transpose(1, 2), (m_p * s_p_sq_r)) # [b, t_t, d] x [b, d, t_s] = [b, t_t, t_s]neg_cent4 = torch.sum(-0.5 * (m_p ** 2) * s_p_sq_r, [1], keepdim=True) # [b, 1, t_s]neg_cent = neg_cent1 + neg_cent2 + neg_cent3 + neg_cent4l_length = l_length / torch.sum(x_mask) # l_length是似然attn_mask = torch.unsqueeze(x_mask, 2) * torch.unsqueeze(y_mask, -1)attn = monotonic_align.maximum_path(neg_cent, attn_mask.squeeze(1)).unsqueeze(1).detach() # attn是01矩阵,因为是硬对齐,attn shape[b,1,T_s,T_t] 文本长度,频谱长度
w = attn.sum(2) #w的shape [b, 1,T_t] 每个文本有多少帧 T_t是文字
# 对齐之前 m_p 的shape [b,feat_dim,T_t] 
# 对齐之前 logs_p 的shape [b,feat_dim,T_t] 
m_p = torch.matmul(attn.squeeze(1), m_p.transpose(1, 2)).transpose(1, 2)# expand prior
# 对齐后扩展后 m_p 的shape [b,feat_dim,T_s] 
# 对齐后扩展后 logs_p 的shape [b,feat_dim,T_s] z_slice, ids_slice = commons.rand_slice_segments(z, y_lengths, self.segment_size) # 为了减少内存,进入解码器之前,需要进行采样,segment_size决定了采样的频率;一个帧频谱对应256个波形点
o = self.dec(z_slice, g=g) # 反卷积和参差网络,一个帧频谱对应256个波形点,如果想从频谱产出波形,需要上采样256,需要4个上采样 8 8 2 2if use_sdp: # 随机时长预测器self.dp = StochasticDurationPredictor(hidden_channels, 192, 3, 0.5, 4, gin_channels=gin_channels)else:self.dp = DurationPredictor(hidden_channels, 256, 3, 0.5, gin_channels=gin_channels)# x输入 经过神经网络或者transfrom 和 w计算f1 lossclass StochasticDurationPredictor(nn.Module): # 随机 事表现力更强,预测每个因素饿时长分布,从分布中采样就是随机 通过重参数化 基于flow来设计的。

valle

名词解释

VITS: VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)是一种结合变分推理(variational inference)、标准化流(normalizing flows)和对抗训练的高表现力语音合成模型
b站 bert+vits2:
https://www.bilibili.com/video/BV1oC4y1D7VX/?spm_id_from=333.337.search-card.all.click
Zero-Shot Learning简称ZSL
TTS:Text-to-Speech
飞桨 PaddlePaddle:百度旗下产品

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

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

相关文章

RabbitMQ有哪些优缺点

一&#xff0c;RabbitMQ有哪些优势 RabbitMQ 作为一款流行的消息队列服务&#xff0c;具有许多优势&#xff0c;这些优势使得它在各种应用场景中都能发挥出色的作用。以下是 RabbitMQ 的一些主要优势&#xff1a; 高可靠性&#xff1a; RabbitMQ 使用持久化功能&#xff0c;无…

路由导航守卫-全局前置守卫

路由导航守卫中的全局前置守卫&#xff08;Global Before Guards&#xff09;是Vue Router中的一个重要概念。当路由即将改变&#xff08;导航触发&#xff09;时&#xff0c;这些守卫会按照创建顺序调用。它们允许你在路由跳转之前执行一些操作或判断&#xff0c;例如检查用户…

epoch的数据不能随便截取,不是特征,要根据时间!!!

长个记性&#xff0c;这半个多月像个笑话&#xff0c;哈哈哈哈

pip如何快速install packet

1、在后面加-i https://mirrors.aliyun.com//pypi//simple或https://pypi.tuna.tsinghua.edu.cn/simple pip install numpy -i https://mirrors.aliyun.com//pypi//simplepip install numpy1.21.0 -i https://pypi.tuna.tsinghua.edu.cn/simple2、需要注意的是&#xff0c;如果…

IDEA指南

IDEA简介 截止到2021.08.31&#xff0c;是全世界最流行的Java集成开发环境 tips 快捷键 ctrl alt v&#xff1a;快速生成方法返回值接收代码/** enter&#xff1a;生成javaDoc注释 IDEA常见error Error: java: System Java Compiler was not found in classpath Proj…

【Python设计模式04】策略模式

策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互相替换。策略模式让算法的变化不会影响使用算法的客户端&#xff0c;使得算法可以独立于客户端的变化而变化。…

Langchain:数据连接封装、缓存封装和LCEL学习和探索

&#x1f335; 目录 &#x1f335; &#x1f60b; 数据连接封装 &#x1f354; 文档加载器&#xff1a;Document Loaders 文档处理器&#xff1a;TextSplitter 向量数据库与向量检索 总结 &#x1f349; 缓存封装&#xff1a;Memory &#x1f3d6;️ 对话上下文&#xf…

上位机图像处理和嵌入式模块部署(mcu之芯片选择)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前市面上的mcu很多&#xff0c;有国产的&#xff0c;有进口的&#xff0c;总之种类很多。以stm32为例&#xff0c;这里面又包括了stm32f1、stm32…

Flutter 中的 LicensePage 小部件:全面指南

Flutter 中的 LicensePage 小部件&#xff1a;全面指南 在软件开发中&#xff0c;遵守开源许可证的要求是至关重要的。Flutter 提供了一个内置的 LicensePage 小部件&#xff0c;它用于展示应用中使用的所有开源库的许可证信息。本文将为您提供一个全面的指南&#xff0c;帮助…

git commit 规范

在提交代码时标识本次提交的属性 feat: 新功能&#xff08;feature&#xff09; fix: 修补bug docs: 文档&#xff08;documentation&#xff09; style: 格式&#xff08;不影响代码运行的变动&#xff09; refactor: 重构&#xff08;即不是新增功能&#xff0c;也不是修改b…

热爱无解 少年万丈光芒!首席艺人【彭禹锦】登陆第八季完美童模全球赛

2024年7月&#xff0c;一档由IPA模特委员会创办于2017年的王牌少儿模特大赛即将拉开全球总决赛的帷幕!作为家喻户晓的国民赛事——完美童模曾6季荣获CCTV央视新闻报道&#xff0c;以创意引领、美学引领、和兼具文化底蕴的赛事特色&#xff0c;收获了全球百万亲子家庭的喜爱。20…

深度学习之基于Pytorch+Flask Web框架预测手写数字

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着人工智能和深度学习的快速发展&#xff0c;手写数字识别已成为一个重要的应用领域。该项目…

Python 实现批量文件重命名工具

在现代软件开发中&#xff0c;图形用户界面 (GUI) 工具的创建是一个常见需求。对于那些需要频繁处理文件的任务&#xff0c;拥有一个简便的 GUI 工具尤为重要。在这篇博客中&#xff0c;我们将介绍如何使用 wxPython 创建一个简单的批量文件重命名工具。该工具可以选择一个文件…

判断子序列二刷

文章目录 1、描述2、思路3、notes4、复杂度 1、描述 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长&#xff08;长度 ~ 500,000&#xff09;&#xff0c;而 s 是个短字符串&#xff08;长度 <1…

Web开发——HTMLCSS

1、概述 Web开发分前端开发和后端开发&#xff0c;前端开发负责展示数据&#xff0c;后端开发负责处理数据。 HTML&CSS是浏览器数据展示相关的内容。 1&#xff09;网页的组成部分 文字、图片、音频、视频、超链接、表格等等 2&#xff09;网页背后的本质 程序员写的前端…

重大活动网络安全保障建设及运营指南

在当今高度数字化的社会中&#xff0c;各类重大活动如会议、展览、赛事及庆典等正面临着日益复杂和严峻的网络安全威胁。这些威胁不限于网络入侵或数据泄露&#xff0c;更涉及到对基础设施、关键信息系统和公众舆论的复杂攻击&#xff0c;需要国际社会的密切合作和长期关注。因…

一张图看懂大模型性价比:能力、价格、并发量全面PK

最近&#xff0c;国内云厂商的大模型掀起一场降价风暴。火山引擎、阿里云、百度云等纷纷宣布降价&#xff0c;部分模型价格降幅据称高达99%&#xff0c;甚至还有些模型直接免费。 五花八门的降价话术&#xff0c;一眼望去遍地黄金。但事实真的如此吗&#xff1f;今天我们就拨开…

统计信号处理基础 习题解答10-2

题目 两个随机变量x和y&#xff0c;如果联合PDF分解为&#xff1a; 那么称他们为条件独立的。在上式中z是条件随机变量。 我们观察 其中, , 是相互独立的。证明和是条件独立的。给出条件变量是A。和是无条件独立么&#xff1f;也就是 成立么&#xff1f;为了回答这个问题&…

如何使用jmap工具生成堆内存快照

1、确保已安装JDK&#xff1a; 首先&#xff0c;确保你的系统上安装了Java Development Kit (JDK)。 2、找到Java进程的PID&#xff1a; 你需要知道你想要生成堆内存快照的Java进程的进程ID&#xff08;PID&#xff09;。你可以使用命令行工具如ps&#xff08;在Unix/Linux系…

Redis Cluster 集群搭建

1. 安装 Redis sudo apt-get update sudo apt-get install redis-server2. 创建配置文件 为每个 Redis 实例创建独立的配置文件和数据目录&#xff1a; mkdir -p /usr/local/redis-cluster/{7000,7001,7002,7003,7004,7005}3. 配置文件内容 每个 Redis 实例的配置文件内容如…