当前位置: 首页 > news >正文

【GPT-SOVITS-03】SOVITS 模块-生成模型解析

说明:该系列文章从本人知乎账号迁入,主要原因是知乎图片附件过于模糊。

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

系列文章地址:
【GPT-SOVITS-01】源码梳理
【GPT-SOVITS-02】GPT模块解析
【GPT-SOVITS-03】SOVITS 模块-生成模型解析
【GPT-SOVITS-04】SOVITS 模块-鉴别模型解析
【GPT-SOVITS-05】SOVITS 模块-残差量化解析
【GPT-SOVITS-06】特征工程-HuBert原理

1.概述

SOVIT 模块的主要功能是生成最终的音频文件。

GPT-SOVITS的核心与SOVITS差别不大,仍然是分了两个部分:

  • 基于 VAE + FLOW 的生成器,源代码为 SynthesizerTrn
  • 基于多尺度分类器的鉴别器,源代码为 SynthesizerTrn

针对鉴别器相较于SOVITS5做了一些简化,主要的差异是在在生成模型处引入了残差量化层。

在训练时进入先验编码器的是经过残差量化层的 quatized 数据。

在推理时,用的是AR模块推理出的 code,然后用code直接生成 quatized 数据,再进入先验编码器。

训练所涉及特征包括:
在这里插入图片描述

2.训练流程

在这里插入图片描述

  • 如概述所注,在训练时SSL特征经过残差量化层中会产生量化编码 code 和数据 quatized。
  • 这个 code 也会作为 AR,即GPT模块训练的特征
  • 在推理时,这个code 就由 GPT 模块生成
  • 损失函数如下:
y_d_hat_r, y_d_hat_g, fmap_r, fmap_g = net_d(y, y_hat)
with autocast(enabled=False):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 + kl_ssl * 1 + loss_kl

3.推理流程

在这里插入图片描述
推理时直接通过先验编码器,通过FLOW的逆,进入解码器后输出推理音频

4.调试代码参考

import os,sys
import json
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from torch.utils.data import DataLoaderfrom vof.vits.data_utils import (TextAudioSpeakerLoader,TextAudioSpeakerCollate,DistributedBucketSampler,
)
from vof.vits.models import SynthesizerTrn
from vof.script.utils import HParamsnow_dir   = os.getcwd()
root_dir  = os.path.dirname(now_dir)
prj_name  = 'project01'               # 项目名称
prj_dir   = root_dir + '/res/' + prj_name + '/'with open(root_dir + '/res/configs/s2.json') as f:data = f.read()data = json.loads(data)# 新增其他参数
s2_dir = prj_dir + 'logs'  # gpt 训练用目录
os.makedirs("%s/logs_s2" % (s2_dir), exist_ok=True)data["train"]["batch_size"]             = 3
data["train"]["epochs"]                 = 15
data["train"]["text_low_lr_rate"]       = 0.4
data["train"]["pretrained_s2G"]         = root_dir + '/res/pretrained_models/s2G488k.pth'
data["train"]["pretrained_s2D"]         = root_dir + '/res/pretrained_models/s2D488k.pth'
data["train"]["if_save_latest"]         = True
data["train"]["if_save_every_weights"]  = True
data["train"]["save_every_epoch"]       = 5
data["train"]["gpu_numbers"]            = 0
data["data"]["exp_dir"]                 = data["s2_ckpt_dir"] = s2_dir
data["save_weight_dir"]                 = root_dir + '/res/weight/sovits'
data["name"]                            = prj_name
data['exp_dir']                         = s2_dirhps = HParams(**data)
print(hps)
"""
self.path2 = "%s/2-name2text-0.txt" % exp_dir
self.path4 = "%s/4-cnhubert" % exp_dir
self.path5 = "%s/5-wav32k" % exp_dir
"""
train_dataset = TextAudioSpeakerLoader(hps.data)
"""
ssl  hubert 特征 [1,768,195]
spec [1025,195]
wav  [1,124800]
text [14,]
"""
train_sampler = DistributedBucketSampler(train_dataset,hps.train.batch_size,[32,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,],num_replicas=1,rank=0,shuffle=True,
)
collate_fn = TextAudioSpeakerCollate()
train_loader = DataLoader(train_dataset,batch_size=1,shuffle=False,pin_memory=True,collate_fn=collate_fn,batch_sampler=train_sampler
)def _model_forward(ssl, y, y_lengths, text, text_lengths):net_g = SynthesizerTrn(hps.data.filter_length // 2 + 1,hps.train.segment_size // hps.data.hop_length,n_speakers=hps.data.n_speakers,**hps.model,)net_g.forward(ssl, y, y_lengths, text, text_lengths)for data in train_loader:ssl_padded   = data[0]ssl_lengths  = data[1]spec_padded  = data[2]spec_lengths = data[3]wav_padded   = data[4]wav_lengths  = data[5]text_padded  = data[6]text_lengths = data[7]_model_forward(ssl_padded, spec_padded, spec_lengths, text_padded, text_lengths)

相关文章:

  • 【NTN 卫星通信】 TN和多NTN配合的应用场景
  • shardingsphere-elastic-job-ui 管理界面安装
  • 数据分析-Pandas数据分类的转换控制
  • 速盾cdn:cdn节点缓存内容不一致怎么办?
  • 面试经典-MySQL篇
  • MQTT和Modbus的物联网网关协议区别分析
  • 上位机图像处理和嵌入式模块部署(qmacvisual畸变矫正)
  • [Java、Android面试]_05_内存泄漏和内存溢出
  • 由浅到深认识C语言(13):共用体
  • 1060:均值
  • 百度paddleocr GPU版部署
  • 如何实现自己的Spring Boot Starter
  • c语言游戏实战(8):飞机大作战
  • [嵌入式系统-39]:龙芯1B 开发学习套件 -9-PMON的文件结构
  • js【详解】深拷贝
  • js如何打印object对象
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Python中eval与exec的使用及区别
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • spark本地环境的搭建到运行第一个spark程序
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vue 动态创建 component
  • 回流、重绘及其优化
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端设计模式
  • 区块链分支循环
  • 全栈开发——Linux
  • 如何进阶一名有竞争力的程序员?
  • 使用docker-compose进行多节点部署
  • 一个项目push到多个远程Git仓库
  • 移动端唤起键盘时取消position:fixed定位
  • 怎么将电脑中的声音录制成WAV格式
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $NOIp2018$劝退记
  • (175)FPGA门控时钟技术
  • (pojstep1.1.2)2654(直叙式模拟)
  • (二)c52学习之旅-简单了解单片机
  • (二)斐波那契Fabonacci函数
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (七)Java对象在Hibernate持久化层的状态
  • (强烈推荐)移动端音视频从零到上手(上)
  • (推荐)叮当——中文语音对话机器人
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET CLR基本术语
  • .Net IOC框架入门之一 Unity
  • .Net的DataSet直接与SQL2005交互
  • ?.的用法
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C++]类和对象【上篇】
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [C语言]一维数组二维数组的大小