VITS源码解读6-训练推理
1. train.py
1.1 大体流程
- 执行main函数,调用多线程和run函数
- 执行run函数,加载日志、数据集、模型、模型优化器
- for循环迭代数据batch,每次执行train_and_evaluate函数,训练模型
这里需要注意,源码中加载数据集用的分布式,单卡最好将其删除,用普通的data_loader即可。
1.2 train_and_evaluate函数
训练每次迭代的执行函数
- g的输入和输出特别多,有2行,分布为:
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)
其中第二行为求kl所需值
- d的输入和输出为:
y_d_hat_r, y_d_hat_g, fmap_r, fmap_g = net_d(y, y_hat)
- 损失函数计算
g:
loss_dur = torch.sum(l_length.float())loss_mel = F.l1_loss(y_mel, y_hat_mel) * hps.train.c_melloss_kl = kl_loss(z_p, logs_q, m_p, logs_p, z_mask) * hps.train.c_klloss_fm = feature_loss(fmap_r, fmap_g)loss_gen, losses_gen = generator_loss(y_d_hat_g)loss_gen_all = loss_gen + loss_fm + loss_mel + loss_dur + loss_kl
d:
loss_disc, losses_disc_r, losses_disc_g = discriminator_loss(y_d_hat_r, y_d_hat_g)
1.3 evaluuate函数
这里主要是用到mel图的对比,通过可视化mel图判别生成效果。
来自数据集的spec
mel = spec_to_mel_torch(spec, hps.data.filter_length, hps.data.n_mel_channels, hps.data.sampling_rate,hps.data.mel_fmin, hps.data.mel_fmax)
来自生成的音频y
y_hat_mel = mel_spectrogram_torch(y_hat.squeeze(1).float(),hps.data.filter_length,hps.data.n_mel_channels,hps.data.sampling_rate,hps.data.hop_length,hps.data.win_length,hps.data.mel_fmin,hps.data.mel_fmax)
1.4 train_ms.py 文件
区别于train.py文件用于训练lj,train_ms.py用于训练vctk数据集。
即train_ms适用于多人数据集,模型的输入也多了一个多人的embedding_layer。
2. Inference.py
这个是jupter即 ipynb文件,其通过 SynthesizerTrn类的infer方法和voice_conversion方法实现。
2.1 infer方法
该方法实现tts功能,输入文本的音素化特征,输出对应文本语义的语音效果。
主要步骤如下:
- 通过文本编码器输入文本音素化向量,得到x, m_p, logs_p, x_mask
如果多人,潜入人物特征
x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths)if self.n_speakers > 0:g = self.emb_g(sid).unsqueeze(-1) # [b, h, 1]else:g = None
- 通过dp输入x,x_mask, 以及人物特征,得到logw
if self.use_sdp:logw = self.dp(x, x_mask, g=g, reverse=True, noise_scale=noise_scale_w)else:logw = self.dp(x, x_mask, g=g)
- logw与x_mask运算得到w_ceil, 最终得到y_lengths
w = torch.exp(logw) * x_mask * length_scalew_ceil = torch.ceil(w)y_lengths = torch.clamp_min(torch.sum(w_ceil, [1, 2]), 1).long()
- y_lengths得到y_mask,x_mask和y_mask得到注意力矩阵attn
y_mask = torch.unsqueeze(commons.sequence_mask(y_lengths, None), 1).to(x_mask.dtype)attn_mask = torch.unsqueeze(x_mask, 2) * torch.unsqueeze(y_mask, -1)attn = commons.generate_path(w_ceil, attn_mask)
- m_p 和 logs_p 分别与attn相乘,再相加得到z_p
m_p = torch.matmul(attn.squeeze(1), m_p.transpose(1, 2)).transpose(1, 2) # [b, t', t], [b, t, d] -> [b, d, t']logs_p = torch.matmul(attn.squeeze(1), logs_p.transpose(1, 2)).transpose(1, 2) # [b, t', t], [b, t, d] -> [b, d, t']z_p = m_p + torch.randn_like(m_p) * torch.exp(logs_p) * noise_scale
- z_p送入flow逆向,得到可用于生成音频的潜码z
z = self.flow(z_p, y_mask, g=g, reverse=True)
- z送入解码器 dec, 得到对应音频y
o = self.dec((z * y_mask)[:,:,:max_len], g=g)
2.2 voice_conversion
该方法实现vctk数据集下的不同人物音色转换。
- 通过输入人物的id,得到人物的嵌入特征
g_src = self.emb_g(sid_src).unsqueeze(-1)
g_tgt = self.emb_g(sid_tgt).unsqueeze(-1)
- 将原人物的音频y和y长度,及对应id输入,得到其潜码
z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g_src)
- 通过流模型输入目标任务的id,在潜码中嵌入目标任务的特征
z_p = self.flow(z, y_mask, g=g_src)
- 剩下的步骤和tts类似,用z_p合成目标语音
z_hat = self.flow(z_p, y_mask, g=g_tgt, reverse=True)o_hat = self.dec(z_hat * y_mask, g=g_tgt)
3.总结
VITS到这里就告于段落了, 后面的VITS2改进了VITS的dp模型(flow变gan),
在cosvoice等模型里面也能见到VITS的主干网络。
因此, VITS是音频tts和vc、sc的核心技术。
相关文章:
VITS源码解读6-训练推理
1. train.py 1.1 大体流程 执行main函数,调用多线程和run函数执行run函数,加载日志、数据集、模型、模型优化器for循环迭代数据batch,每次执行train_and_evaluate函数,训练模型 这里需要注意,源码中加载数据集用的分…...
力扣 简单 104.二叉树的最大深度
文章目录 题目介绍解法 题目介绍 解法 如果知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为max(l,r)1,而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用递归的方法来计算二叉树的最大深度。具体而言ÿ…...
单片机长短按简单实现
单片机长短按简单实现 目录 单片机长短按简单实现1 原理2 示例代码2.1 按键实现 3 测试log4 其他实现方式 1 原理 按键检测和处理的步骤如下: 1:定时扫描按键(使用定时器定时扫描,也可以用软件延时或者系统心跳之类的方式&#…...
如何用好通义灵码企业知识库问答能力?
通义灵码企业版:通义灵码企业标准版快速入门_智能编码助手_AI编程_智能编码助手通义灵码(Lingma)-阿里云帮助中心 通义灵码提供了基于企业知识库的问答检索增强的能力,在开发者使用通义灵码 IDE 插件时,可以结合企业知识库内上传的文档、文件…...
C语言自定义类型:联合体
目录 前言一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体的⼀个练习 总结 前言 前面我讲到C语言中的自定义结构——结构体,其实C语言中的自定义结构不只有结构体,还有枚举和联合体&am…...
【JavaEE】——线程池大总结
阿华代码,不是逆风,就是我疯, 你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 引入:问题引入 一:解决方案 1:方案一——协程/纤程 (1…...
编程中为什么使用0和1表示状态
前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 我们看到很多项目都使用0和1表示某些状态信息,具体含义取决于上下文。以下是一些常见的用法: 布尔值&#x…...
C++入门基础知识90(实例)——实例15【求两数的最大公约数】
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于求两数的最大公约数的相关内容ÿ…...
自动化办公-Python-os模块的使用
os.path 模块的使用 在指定文件路径时,由于操作系统的差异,直接使用硬编码的路径可能会导致程序在不同平台上无法正常运行。为了解决这个问题,Python 提供了 os.path 模块,它包含了一系列用于路径操作的函数,可以帮助您…...
无人机之数据处理技术篇
一、数据采集 无人机通过搭载的各种传感器和设备,如GPS、加速度计、陀螺仪、磁力计、激光雷达(LiDAR)、高光谱相机(Hyperspectral)、多光谱相机(Multispectral)以及普通相机等,实时采集飞行过程中的各种数据。这些数据包括无人机的位置、速度、高度、姿态…...
828华为云征文|部署多功能集成的协作知识库 AFFiNE
828华为云征文|部署多功能集成的协作知识库 AFFiNE 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 AFFiNE3.1 AFFiNE 介绍3.2 AFFiNE 部署3.3 AFFiNE 使用 四、…...
c++(AVL树及其实现)
一、AVL树的概念 AVL树是最先发明的自平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的 左右子树都是AV树,且左右子树的高度差的绝对值不超过1。AVL树是⼀颗高度平衡搜索⼆叉树, 通过控制高度差去控…...
Cesium GIS项目关于湖泊识别与提取的实现
1. 引言 项目背景 随着遥感技术的发展,地理信息系统的应用越来越广泛。本项目旨在开发一个基于Cesium的地理信息系统,利用深度学习技术自动识别并显示湖泊的位置。 目标与意义 通过自动化处理大量遥感影像数据,提高湖泊监测的效率和准确性,为水资源管理和环境保护提供支…...
两个圆形 一个z里面一个z外面,z里面的大,颜色不同 html
两个圆形 一个z里面一个z外面,z里面的大,颜色不同 html <!DOCTYPE html> <html> <head> <style> .outer-circle {width: 150px;height: 150px;border-radius: 50%;background-color: #ff9999; /* 外圆的颜色 */position: relat…...
【Power Query】M函数-table
M函数-table 添加列(AddColumn):条件语句(If..then..else):容错语句(try..otherwise): 排序(ReorderColumns):筛选(Selec…...
uni-app 封装websocket 心跳检测,开箱即用
class websocketUtils {constructor(url, needbeat, options {}) {this.needbeat needbeat;this.url url;this.options options;this.ws null;this.heartbeatInterval options.heartbeatInterval || 10000; // 心跳间隔,默认为10秒 this.reconnectInterval …...
ASP.NET Core8.0学习笔记(十九)——EF Core DbSet
一、DbSet概述 1.DbSet提供了通过DbContext对表进行查询操作的路径。DbSet对应的属性名称将默认映射为实体T的表名。 2.使用DbSet<T>进行查询的方法: (1)直接在DbContext中创建对应的DbSet<T>属性 (2)使用DbSet DbContext.Set<T>方法操作数据表。…...
Android Camera 预览角度和拍照保存图片角度相关
–基于Android R(11) 关于Camera Camera Framework 的架构 Android Camera Framework 是一个分层架构,由以下组件组成: HAL(硬件抽象层): HAL 抽象底层相机硬件,提供与不同设备相机进行交互的标准接口.CameraService : Camera…...
新手如何使用Qt——方法使用
前言 那么这篇文章其实是我在使用Qt的过程当中呢,我发现在Qt使用过程中,在我理解信号和槽这个概念后,在编写槽函数数的时候,发现了自身存在的问题,我的难点是在于当我在编写槽函数的时候,我知道这个槽函数是…...
友元运算符重载函数
目录 1.定义友元运算符重载函数的语法形式 2.双目运算符重载 3.单目运算符重载 1.定义友元运算符重载函数的语法形式 (1)在类的内部,定义友元运算符重载函数的格式如下: friend 函数类型 operator 运算符(形参表&a…...
量子力学的抽象地位与c语言等价
多种量子/粒子的各种表象,就像 cpu 的微架构指令集,量子力学的状态矢量表示和密度矩阵表示就像c语言。 中间从状态矢量到具体粒子的具体表象的转换,就像是一个编译器的工作。量子力学表象与编译器架构的深刻类比这个类比非常精妙且深刻&#…...
从OV2640升级到OV3660:除了像素提升,ESP32-Cam硬件设计要注意这几点
从OV2640升级到OV3660:硬件设计中的隐形挑战与实战指南 当我们在ESP32-Cam项目中从OV2640升级到OV3660摄像头模组时,很多工程师的第一反应是检查引脚兼容性——这当然没错,但真正的挑战往往藏在那些数据手册不会明确标注的细节里。去年我们团…...
Redux vs MVI:Android状态管理实战对比(附Kotlin代码示例)
Redux vs MVI:Android状态管理实战对比(附Kotlin代码示例) 在Android开发中,状态管理一直是构建可维护、可测试应用的核心挑战。随着应用复杂度提升,如何优雅地处理UI状态、用户交互和数据流,成为开发者必…...
Jimeng LoRA多版本管理技巧:自然排序与热切换功能详解
Jimeng LoRA多版本管理技巧:自然排序与热切换功能详解 1. 项目背景与核心价值 在AI图像生成领域,LoRA(Low-Rank Adaptation)技术已经成为微调大型扩散模型的主流方法。Jimeng LoRA系统针对模型迭代测试场景,解决了两…...
5大突破解决Android固件提取难题:面向开发者与技术爱好者的全能工具指南
5大突破解决Android固件提取难题:面向开发者与技术爱好者的全能工具指南 【免费下载链接】Firmware_extractor 项目地址: https://gitcode.com/gh_mirrors/fi/Firmware_extractor 问题引入:Android固件提取的碎片化困境 Android生态系统的开放性…...
Lychee Rerank MM零基础上手:图文混合Query构建与Document批量上传实操
Lychee Rerank MM零基础上手:图文混合Query构建与Document批量上传实操 1. 什么是Lychee Rerank MM?——多模态重排序的“精准标尺” 你有没有遇到过这样的问题:在图片库中搜索“穿红裙子站在樱花树下的女孩”,返回结果里却混着…...
Verilog新手避坑指南:从HDLBits的Getting Started到Vectors,我踩过的那些坑
Verilog新手避坑指南:从HDLBits的Getting Started到Vectors,我踩过的那些坑 第一次接触Verilog时,我像大多数初学者一样,被它既像C语言又不像C语言的语法搞得晕头转向。HDLBits这个在线练习平台确实是个好帮手,但当我从…...
Asian Beauty Z-Image Turbo 跨平台部署:基于.NET框架的Windows桌面应用集成
Asian Beauty Z-Image Turbo 跨平台部署:基于.NET框架的Windows桌面应用集成 最近在做一个Windows桌面项目,需要集成一个图片生成功能。团队里的小伙伴用Python在服务器上跑了一个Asian Beauty Z-Image Turbo模型,效果挺惊艳的,但…...
2022年中国90米人口密度栅格数据(LandScan)|高精度、单年快照、科研级空间人口产品
🔍 数据简介 本数据基于全球权威人口空间分布模型 LandScan™(由美国橡树岭国家实验室 ORNL 开发),并融合2020年第七次全国人口普查乡镇级数据、10米土地利用、VIIRS夜间灯光、OSM路网与建筑物足迹,生成 2022年中国90米…...
从视频处理到医疗影像:Conv3D输出形状计算中的那些‘坑’与高效设计指南
从视频处理到医疗影像:Conv3D输出形状计算中的那些‘坑’与高效设计指南 当你在深夜调试一个3D卷积神经网络时,突然发现输出的特征图尺寸比预期小了整整一半——这种场景对于处理视频分类或医疗影像的工程师来说再熟悉不过了。Conv3D层看似简单的参数设…...
