flow-matching 之学习matcha-tts cosyvoice

news2025/5/12 22:10:28

文章目录

  • matcha 实现
  • cosyvoice 实现
  • chunk_fm
    • chunk_mask
    • cache_attn
  • stream token2wav

  • 关于flow-matching 很好的原理性解释文章, 值得仔细读,多读几遍,关于文章Flow Straight and Fast:
    Learning to Generate and Transfer Data with Rectified Flow 的讲解梳理。

matcha 实现

def fm_comput_loss()
	# x1 是target_mel
	# random timestep
    t = torch.rand([b, 1, 1], device=mu.device, dtype=mu.dtype)
    # sample noise p(x_0)
    z = torch.randn_like(x1)

    y = (1 - (1 - self.sigma_min) * t) * z + t * x1
    u = x1 - (1 - self.sigma_min) * z
	pred_y = self.estimator(y, mask, mu, t.squeeze(), spks)
    loss = F.mse_loss(pred_y, u, reduction="sum") / (
        torch.sum(mask) * u.shape[1]
    )
    return loss, y
def estimator_forward():
	x = pack(y, mu)
	x = pack(x, spks)
	q,k,v = x, x, x
	x = slf_attn(q,k,v)
	outputs = linear(x)
	return outputs

cosyvoice 实现



        
def fm_forward():
    # mu: encoder_outputs
    # x1: target_mel
    # cond: prompt_mel 随机取的部分

    conds = torch.zeros(feat.shape, device=token.device)
    for i, j in enumerate(feat_len):
        if random.random() < 0.5:
            continue
        index = random.randint(0, int(0.3 * j))
        conds[i, :index] = feat[i, :index]
    conds = conds.transpose(1, 2)

    b, _, t = mu.shape

    # random timestep
    t = torch.rand([b, 1, 1], device=mu.device, dtype=mu.dtype)
    if self.t_scheduler == 'cosine':
        t = 1 - torch.cos(t * 0.5 * torch.pi)
    # sample noise p(x_0)
    z = torch.randn_like(x1)

    y = (1 - (1 - self.sigma_min) * t) * z + t * x1
    u = x1 - (1 - self.sigma_min) * z

    # during training, we randomly drop condition to trade off mode coverage and sample fidelity
    # inference 的时候实际不需要condition, 给zero就可以
    if self.training_cfg_rate > 0:
        cfg_mask = torch.rand(b, device=x1.device) > self.training_cfg_rate
        mu = mu * cfg_mask.view(-1, 1, 1)
        spks = spks * cfg_mask.view(-1, 1)
        cond = cond * cfg_mask.view(-1, 1, 1)

    pred = self.estimator(y, mask, mu, t.squeeze(), spks, cond, streaming=streaming)
    loss = F.mse_loss(pred * mask, u * mask, reduction="sum") / (torch.sum(mask) * u.shape[1])
    return loss, y

def estimator(x, mu, spks, cond):
    x = pack(x, mu, spks, cond)
    x = slf_attn(x)
    outputs = linear(x)
    return outputs

chunk_fm

  • 训练的时候将特征进行chunk_mask,推理的时候只准备chunk的部分,pre_chunk 存为kv_cache,
  • cache 初始seq_len为0;每次得到的cache,只留下[-chunk_len:] 的长度,作为下一次的输入;特征x 的pos 按照真的来算;

chunk_mask

在这里插入图片描述

  • 训练阶段样本按照seq_len 维度被mask 成不同的可见部分;chunk_mask 和长度mask 都会出现,为了加速收敛;

cache_attn

def slf_attn_cache(x, cache):
    k_in, v_in, q_in = x, x, x
	key_cache = linear1(k_in)
    value_cache = linear2(v_in)
    # NOTE here we judge cache.size(0) instead of cache.size(1), because init_cache has size (2, 0, 512, 2)
    if cache.size(0) != 0:
        # step into this branch
        key = torch.concat([cache[:, :, :, 0], key_cache], dim=1)
        value = torch.concat([cache[:, :, :, 1], value_cache], dim=1)
    else:
        key, value = key_cache, value_cache
    cache = torch.stack([key_cache, value_cache], dim=3)
    outputs = scale_dot_production(key, value)
    return outputs, cache

stream token2wav

在这里插入图片描述

  • 第一个包没有kv_cache, 卷积cache 有,但是值为0;first chunk 推理完就可以存下kv_cache & cnn_cache;
  • 输入token+cache_token,得到token 对应的mel;
  • mel2wav 阶段也是,第一次没有hift cache,直接退出mel 对应的wav,最后8帧存下来作为hift_cache,用于hift_wav 预测以及输出的音频片段间平滑;前n-8 帧的音频输出;
def inference(self, speech_feat: torch.Tensor, cache_source: torch.Tensor = torch.zeros(1, 1, 0)):
    # mel->f0 mel:[1,80,T]
    #print('hift inference speech_feat', speech_feat.size())
    f0 = self.f0_predictor(speech_feat)
    # f0->source
    s = self.f0_upsamp(f0[:, None]).transpose(1, 2)  # bs,n,t
    s, _, _ = self.m_source(s)
    s = s.transpose(1, 2) #sample
    #print('f0 s', s.size()) # sample level
    # use cache_source to avoid glitch
    if cache_source.shape[2] != 0:
        # s[1,1,t*480]
        s[:, :, :cache_source.shape[2]] = cache_source
        print('cache_source s', s.size())
    else:
        print('cache_source shape2 is 0')
    
    #print('hift inference s', s.size())
    generated_speech = self.decode(x=speech_feat, s=s)
    return generated_speech, s

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

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

相关文章

ubuntu22.04在 Docker容器中安装 ROS2-Humble

22.04 安装 docker 容器并实现rviz功能 1 docker pull命令拉取包含ROS-Humble的镜像&#xff1a; docker pull osrf/ros:humble-desktop-full-jammy docker images验证该镜像是否拉取成功。 使用镜像osrf/ros:humble-desktop-full-jammy创建并运行容器 sudo docker run -it…

【JavaWeb+后端常用部件】

回顾内容看&#xff1a; 一、获取请求参数的方法 参考&#xff1a;[JavaWeb]——获取请求参数的方式(全面&#xff01;&#xff01;&#xff01;)_java 获取请求参数-CSDN博客 Json格式的Body加备注RequestBody{id}动态路径加备注PathVariableid?&name?直接接收就好 i…

Redis 重回开源怀抱:开源精神的回归与未来展望

在开源软件的广袤天地里&#xff0c;Redis 一直是备受瞩目的明星项目。近期&#xff0c;Redis 宣布重新回归开源&#xff0c;这一消息犹如一颗石子投入平静的湖面&#xff0c;在技术社区激起层层涟漪。今天&#xff0c;就让我们深入了解 Redis 这一重大转变背后的故事、意义以及…

弹窗表单的使用,基于element-ui二次封装

el-dialog-form 介绍 基于element-ui封装的弹窗式表单组件 示例 git地址 https://gitee.com/chenfency/el-dialog-form.git 更新日志 2021-8-12 版本1.0.0 2021-8-17 优化组件&#xff0c;兼容element原组件所有Attributes及Events 2021-9-9 新增tip提示 安装教程 npm install …

实践005-Gitlab CICD全项目整合

文章目录 环境准备环境准备集成Kubernetes Gitlab CICD项目整合项目整合整合设计 后端Java项目部署后端Java项目静态检查后端Java项目镜像构建创建Java项目部署文件创建完整流水线 前端webui项目部署前端webui项目镜像构建创建webui项目部署文件创建完整流水线 构建父子类型流水…

懒人美食帮SpringBoot订餐系统开发实现

概述 快速构建一个订餐系统&#xff0c;今天&#xff0c;我们将通过”懒人美食帮”这个基于SpringBoot的订餐系统项目&#xff0c;为大家详细解析从用户登录到多角色权限管理的完整实现方案。本教程特别适合想要学习企业级应用开发的初学者。 主要内容 1. 用户系统设计与实现…

MySQL 从入门到精通(六):视图全面详解 —— 虚拟表的灵活运用

在数据库开发中&#xff0c;我们经常需要重复执行复杂的多表查询&#xff0c;或是需要限制用户只能访问特定数据。这时候&#xff0c;MySQL 的 视图&#xff08;View&#xff09;就能大显身手。作为一种 “虚拟表”&#xff0c;视图不存储实际数据&#xff0c;却能基于 SQL 查询…

手机隐私数据彻底删除工具:回收或弃用手机前防数据恢复

软件介绍 有这样一款由吾爱网友chenwangjun 原创开发的数据处理软件&#xff0c;名为 AndroidDiskClear。它的核心功能十分强大&#xff0c;能够将你手机里已经删除的各类文件&#xff0c;像图片、普通文件、文字信息等彻底清除干净&#xff0c;有效杜绝数据恢复类软件的二次恢…

数据压缩实现案例

在driver中修改代码 package com.root.mapreduce.compress; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.…

FlySecAgent:——MCP全自动AI Agent的实战利器

最近&#xff0c;出于对人工智能在网络安全领域应用潜力的浓厚兴趣&#xff0c;我利用闲暇时间进行了深入研究&#xff0c;并成功开发了一款小型轻量化的AI Agent安全客户端FlySecAgent。 什么是 FlySecAgent&#xff1f; 这是一个基于大语言模型和MCP&#xff08;Model-Contr…

ideal创建Springboot项目(Maven,yml)

以下是使用 IntelliJ IDEA 创建基于 Maven 的 Spring Boot 项目并使用 YAML 配置文件的详细步骤&#xff1a; 一、创建 Spring Boot 项目 启动项目创建向导 打开 IntelliJ IDEA&#xff0c;点击“File”->“New”->“Project”。 在弹出的“New Project”窗口中&#…

Pycharm(十九)深度学习

一、深度学习概述 1.1 什么是深度学习 深度学习是机器学习中的一种特殊方法,它使用称为神经网络的复杂结构,特别是“深层”的神经网络,来学习和做出预测。深度学习特别适合处理大规模和高维度的数据,如图像、声音和文本。深度学习、机器学习和人工智能之间的关系如下图所…

Scrapyd 详解:分布式爬虫部署与管理利器

Scrapyd 是 Scrapy 官方提供的爬虫部署与管理平台&#xff0c;支持分布式爬虫部署、定时任务调度、远程管理爬虫等功能。本文将深入讲解 Scrapyd 的核心功能、安装配置、爬虫部署流程、API 接口使用&#xff0c;以及如何结合 Scrapy-Redis 实现分布式爬虫管理。通过本文&#x…

驱动开发硬核特训 · 专题篇:Vivante GPU 与 DRM 图形显示体系全解析(i.MX8MP 平台实战)

视频教程请关注 B 站&#xff1a;“嵌入式Jerry”。 一、背景导读&#xff1a;GPU 与 DRM 到底谁负责“显示”&#xff1f; 在嵌入式 Linux 图形系统中&#xff0c;“画面怎么显示出来”的问题&#xff0c;表面看似简单&#xff0c;实则涉及多个内核子系统与用户态组件的协同&…

C——猜数字游戏

前面我们已经学习了C语言常见概念&#xff0c;数据类型和变量以及分置于循环的内容&#xff0c;现在我们可以将这些内容结合起来写一个有趣的小游戏。下面正式开始我们今天的主题——猜数字游戏的实现。 猜数字游戏的要求&#xff1a; 1.电脑自动生成1~100的随机数。 2.玩家…

C/C++实践(三)深入理解 C++ 三大特性之一:封装

一、封装的概念与核心思想 封装&#xff08;Encencapsulation&#xff09;是 C 面向对象编程&#xff08;OOP&#xff09;的三大核心特性之一&#xff0c;其本质是将数据&#xff08;成员变量&#xff09;和对数据的操作&#xff08;成员函数&#xff09;捆绑在一个逻辑单元&a…

1、RocketMQ 核心架构拆解

1. 为什么要使用消息队列&#xff1f; 消息队列&#xff08;MQ&#xff09;是分布式系统中不可或缺的中间件&#xff0c;主要解决系统间的解耦、异步和削峰填谷问题。 解耦&#xff1a;生产者和消费者通过消息队列通信&#xff0c;彼此无需直接依赖&#xff0c;极大提升系统灵…

vue3 element-plus 输入框回车跳转页面问题处理

问题描述&#xff1a; 当页面搜索条件只有一个的情况下&#xff0c;输入框不管有没有值&#xff0c;回车后会跳转页面 解决办法&#xff0c;给表单添加 submit.prevent <el-form ref"ruleForm" :model"search" label-width"120px" class&qu…

快速入门深度学习系列(2)----损失函数、逻辑回归、向量化

针对深度学习入门新手目标不明确 知识体系杂乱的问题 拟开启快速入门深度学习系列文章的创作 旨在帮助大家快速的入门深度学习 写在前面&#xff1a; 本系列按照吴恩达系列课程顺序发布(说明一下为什么不直接看原笔记 因为内容太多 没有大量时间去阅读 所有作者需要一次梳理…

[超详细,推荐!!!]前端性能优化策略详解

学习记录&#xff0c;部分内容版权归妙码学院 1.优化内容包括那些 其实前端的优化&#xff0c;整体粗略概括下来&#xff0c;白话之&#xff1a; 打开速度怎么变快再次打开速度怎么变快操作怎么才顺滑动画怎么保证流畅 2.性能优化 2.1首屏加载优化 在了解优化方法和策略之…