大模型之三十-语音合成TTS(coqui)

news2024/12/25 2:00:43

TTS是text2speech的简称,TTS主要的一些常见包括小说、对话、视频配音、chatbot、虚拟人等场景,因coqui/XTTS-v2生成质量高、完全开源、多语言支持等特点,所以本篇基于coqui/XTTS-v2工具包浅出TTS。官方文档见[link]。

介绍

Coqui TTS 是一个开源的文字到语音(Text-to-Speech, TTS)系统,旨在使语音合成技术对研究人员、开发者和创造者更加可接近。它基于先前的 Mozilla TTS 项目。

这个TTS端到端模型提供的特征如下:

  • 音色克隆,可以提供仅仅3 秒的音频就实现声音克隆;
  • 跨语言克隆,比如英文到中文,中文到英文等,共计16中语言
  • 24kHz采样率,对于speech够了,但是对于Music一般要支持立体声、44.1kHz
  • 流式推理延迟小于200ms
  • 支持模型fine-tune

因其完全开源的特性,所以很多后继的TTS都是基于此的,比如中英的chatTTS的架构和XTTS-v2非常类似,使用的也是DVAE和GPT架构,包括采样率也都是24kHz,chatTTS开源了4万小时训练的小模型,但是没有开源fine-tune的代码,而诸如Stability AI公司在开源小模型的时候,也会附上完整的fine-tune代码,这极有可能是因为chatTTS堆数据出来的结果,训练并没有多少trick,所以我的建议是,直接看coqui/XTTS-v2

语音识别是从波形到频谱,频谱输入模型,模型输出文字的token,语音合成是其逆过程,首先是将文字token化,然后输入模型得到频谱,再从频谱恢复到波形。

coqui/XTTS-v2是从文本到语音频谱,然后再用声码器(如WaveNet神经网络)将频谱编码成音频,TTS 还包含了许多其他组件,如说话人编码器、语种、音色转换模型等。这些组件共同协作,确保 TTS 能够生成高质量的语音。这里我们只关注和中文有关系的模型,对于其他支持诸如法语、葡萄牙语、丹麦语等模型就不再一一列出了。

(venv) ➜  TTS git:(dev) ✗ pip install tts
(venv) ➜  TTS git:(dev) ✗ tts --list_models

 Name format: type/language/dataset/model
 ## 多语言,多数据集
 1: tts_models/multilingual/multi-dataset/xtts_v2
 4: tts_models/multilingual/multi-dataset/bark
 34: tts_models/zh-CN/baker/tacotron2-DDC-GST

## 声码器模型
 Name format: type/language/dataset/model
 1: vocoder_models/universal/libri-tts/wavegrad
 2: vocoder_models/universal/libri-tts/fullband-melgan

## 音色转换模型
 Name format: type/language/dataset/model
 1: voice_conversion_models/multilingual/vctk/freevc24

对bark和tacotron2-DDC-GST感兴趣的,可以自行研究。

对于语种支持和内置多说话人的情况,可以参考:

 tts --model_name tts_models/multilingual/multi-dataset/xtts_v2 \
    --list_language_idx
    
 tts --model_name tts_models/multilingual/multi-dataset/xtts_v2 \
    --list_speaker_idx

生成语音和音色克隆也很方便

#内置说话人生成 英语
 tts --model_name tts_models/multilingual/multi-dataset/xtts_v2 \
    --text "It took me quite a long time to develop a voice, and now that I have it I'm not going to be silent." \
    --speaker_idx "Ana Florence" \
    --language_idx en \
    --use_cuda true

#音色克隆
tts --model_name tts_models/multilingual/multi-dataset/xtts_v2 \
    --text "Bugün okula gitmek istemiyorum." \
    --speaker_wav /path/to/target/speaker.wav \
    --language_idx tr \
    --use_cuda true

当然也提供了API的调用方式,下面是流式生成的例子。

import os
import time
import torch
import torchaudio
from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts

print("Loading model...")
config = XttsConfig()
config.load_json("/path/to/xtts/config.json")
model = Xtts.init_from_config(config)
model.load_checkpoint(config, checkpoint_dir="/path/to/xtts/", use_deepspeed=True)
model.cuda()

print("Computing speaker latents...")
gpt_cond_latent, speaker_embedding = model.get_conditioning_latents(audio_path=["reference.wav"])

print("Inference...")
t0 = time.time()
chunks = model.inference_stream(
    "It took me quite a long time to develop a voice and now that I have it I am not going to be silent.",
    "en",
    gpt_cond_latent,
    speaker_embedding
)

wav_chuncks = []
for i, chunk in enumerate(chunks):
    if i == 0:
        print(f"Time to first chunck: {time.time() - t0}")
    print(f"Received chunk {i} of audio length {chunk.shape[-1]}")
    wav_chuncks.append(chunk)
wav = torch.cat(wav_chuncks, dim=0)
torchaudio.save("xtts_streaming.wav", wav.squeeze().unsqueeze(0).cpu(), 24000)

模型结构

XTTS是建立在自回归模型的最新进展基础上的,比如Tortoise、Vall-E和Soundstorm,这些模型基于训练有离散音频表示的语言模型。XTTS利用VQ-VAE模型将音频离散成音频标记。随后,它使用GPT模型来根据输入文本和说话者的潜变量来预测这些音频标记。说话者的潜变量是通过一组自注意力层计算的。GPT模型的输出传递给一个解码器模型,该模型输出音频信号。对于XTTS-v1,我们采用Tortoise方法,它结合了扩散模型和UnivNet声码器。这种方法涉及使用扩散模型将GPT输出转换为谱图帧,然后利用UnivNet生成最终的音频信号。

关于loss:

  1. 验证集Loss:关注验证集上的loss是判断过拟合和模型普适性的关键。理想情况下,验证集的loss应当与训练集的loss相似或略高。如果验证集的loss开始增加,而训练集的loss继续下降,这可能是过拟合的标志。
  2. 听觉评估:最终,由于TTS系统的目标是产生高质量、自然的语音,因此主观听觉测试也非常重要。即使loss值看起来合理,最终的语音质量和自然度才是评估模型性能的关键。

模型结构

xtts 基于Tortoise模型,做了几个改动以实现multilingual e ZS-TTS,其模型结构主要包括VQ-VAE、Encoder(GPT2 blocks)以及Decoder(HiFi-GAN vocoder)。

在这里插入图片描述

VQ-VAE

VQ-VAE(Vector Quantised-Variational AutoEncoder)是一种使用向量量化的变分自编码器。该技术结合了自编码器的强大数据压缩能力和向量量化的高效编码方法,在保留重要信息的同时,实现了数据的有效压缩。
VQ的思想其实早在传统的语音编码器中就使用到了,比如实时音频编解码之十九 基于AI的语音编码(LPCNet)。
基本概念

  • 自编码器(AutoEncoder):是一种无监督学习的神经网络,用于学习一个数据的有效表示(即编码),通常用于降维或特征学习。在自编码器中,数据通过一个编码器被压缩成一个低维空间(潜在空间),然后通过一个解码器重新构建。
  • 变分自编码器(Variational AutoEncoder, VAE):是自编码器的一种变体,它不仅学习数据编码,还学习编码的分布,使模型能生成新的数据点。
  • 向量量化(Vector Quantisation, VQ):是一种将大量的向量简化为较少量的代码的技术,常用于数据压缩。在VQ-VAE中,编码的潜在表示被量化为离散的向量,这些向量来自预定义的码本(codebook)。
    模型描述
  • 参数数量:VQ-VAE模型有13M(1300万)个参数。
  • 输入:输入数据是梅尔频谱图,这是一种常用于语音处理的频率特征表示方法。
  • 编码:模型使用一个包含8192个码字的码本对每一帧的梅尔频谱进行编码。
  • 帧率:编码的帧率为21.53 Hz,意味着每秒产生21.53个编码帧。
    码本过滤
    过滤过程:在VQ-VAE训练完成后,为了提高模型的表达能力,对码本进行了过滤,只保留了最常用的前1024个码字。这可以看作是一种优化过程,通过减少不常用的代码来提高模型整体的效率和输出质量。

实验验证:初步实验表明,过滤掉较少频繁的代码后,模型的表达能力有所提高。

GPT模型

采用的就是GPT-2的结构,这是Transformer结构中的Decoder部分,共计443M个参数,关于Transformer可以参考《大语言模型之一 Attention is all you need —Transformer》

  • 输入:编码器接受通过特定的Byte-Pair Encoding(BPE)分词器得到的文本token作为输入。这里使用的是6681个token的自定义BPE分词器,这种分词方法通过合并常见的字节对来有效减少词汇表的大小,从而提升处理效率。
  • 输出:编码器的输出是对VQ-VAE音频编码的码字预测,这些码字用于后续的音频生成或处理。

Conditioning Encoder(条件编码器)

  • 功能:Conditioning Encoder 接收梅尔频谱图(mel-spectrograms)作为输入,为不同长度的每个音频样本产生32个1024维的嵌入向量。
  • 结构:该编码器由六层16头的缩放点积注意力(Scaled Dot-Product Attention)层组成,这是一种常见的注意力机制,用于模型中不同部分的交互和信息整合。
    Perceiver Resampler:接着使用Perceiver Resampler对注意力层的输出进行重采样,以产生固定数量的嵌入,使输出的尺寸独立于输入音频的长度。

Decoder

Decoder是基于26M参数量的 HiFi-GAN vocoder,其输入是GPT-2 Encoder的潜空间(latent vectors)向量,由于VQ-VAE的高压缩率,直接从VQ-VAE的码字重构音频会导致很多发音问题和机械音。所以直接使用了GPT-2的latent vectors作为Decoder的输入而非VQ-VAE的码字。

在解码过程中说话人的Embedding通过Linear projection的方式增加到每一个upsampling层。所以在loss的设计的时候,也增加了speaker Consistency Loss(SCL)。

HiFi-GAN网络结构的简化图,用以说明主要的数据流和网络结构,

输入 x
  |
  v
Leaky ReLU (lrelu)
  |
  v
Upsampling Layer
  |
  v
Residual Block 1 (resblock1_k1x1) ---> z1
  |                                     |
  v                                     |
Residual Block 2 (resblock2_k2x1) ---> z2
  |                                     |
  v                                     |
  .                                     .
  .                                     .
  .                                     .
  v                                     |
Residual Block N (resblockN_kNx1) ---> zN
  |                                     |
  v                                     v
  ------------------------------------> +
  |                                     |
  v                                     |
Divide by Number of Residual Blocks (#resblocks)
  |
  v
Leaky ReLU (lrelu)
  |
  v
Convolutional Layer (conv_post_7x1)
  |
  v
Tanh Activation (tanh)
  |
  v
输出 o

在这张图中:

  • 数据流 从上到下流动。
  • 每个 “zN” 表示从对应的残差块输出的特征,这些特征在流程的末端被累加。
  • “+” 表示将所有残差块的输出累加在一起。
  • “/ #resblocks” 表示将累加的结果除以残差块的数量,进行平均化处理。
  • 最后,通过一系列的激活和卷积层,将处理过的信号输出。

其Residual Block中采用了MRF技术,Multi-Receptive Field Fusion (MRF) 是 HiFi-GAN 中用于提高生成音质的一种技术。MRF 的目的是在生成网络中利用不同大小的感受野,从而更好地捕捉和再现音频信号中的各种时间尺度的特征。感受野是指神经网络中一个节点能“看到”的输入数据的区域大小。

在普通的卷积神经网络中,每个卷积层的感受野是固定的。而在使用 MRF 的 HiFi-GAN 中,网络会整合来自不同尺寸感受野的信息,这些感受野可能由不同大小的卷积核或不同数量的卷积层堆叠形成。通过这种方式,网络能同时捕捉细节(小感受野)和更广泛的上下文信息(大感受野)。

fine-tune

Tortoise 49k英文
Mega-TTS 2 38k 中英文
Xtts的模型使用了1.4万小时的英文数据,233小时的中文数据。相比而言,几乎相同结构的chattts开源的小版本使用了4万小时,闭源的使用了10万小时音频数据。

在训练的时候,需要32GB内存的GPU卡,免费GPU应该是蹭不到了。欢迎关注、收藏、点赞,以便及时收到下一篇 fine-tune博客推送

下一篇公布fine-tune细节,这里剧透一个Training loss截图。

在这里插入图片描述

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

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

相关文章

形象化理解pytorch中的tensor.scatter操作

定义 scatter_(dim, index, src, *, reduceNone) -> Tensor pytorch官网说这个函数的作用是从src中把index指定的位置把数据写入到self里面,然后给了一个公式: self[index[i][j][k]][j][k] src[i][j][k] # if dim 0self[i][index[i][…

ROS CDK魔法书:建立你的游戏王国(TypeScript篇)

引言 在虚拟游戏的世界里,数字化的乐趣如同流动的音符,谱写着无数玩家的共同回忆。而在这片充满创意与冒险的乐园中,您的使命就是将独特的游戏体验与丰富的技术知识相结合,打造出令人难以忘怀的作品。当面对如何实现这一宏伟蓝图…

MOS管G极串联电阻的作用是什么

MOS管栅极串联电阻是如何抑制谐振? 为什么会震荡? 首先了解一下LC串联谐振电路,虽然,LC串联在电路中运用的并不多,但是在无意中总会形成串联谐振,从而产生很多各种各样的现象。如果不了解其本质,会让我们很难理解。比如,使用同样的LC电路滤波,用到两个电路上,有的电…

CCF推荐B类会议和期刊总结:(计算机体系结构/并行与分布计算/存储系统领域)

目录 前言 B类会议 1. SoCC 2. SPAA 3. PODC 4. FPGA 5. CGO 6. DATE 7. HOT CHIPS 8. CLUSTER 9. ICCD 10. ICCAD 11. ICDCS 12. CODESISSS 13. HiPEAC 14. SIGMETRICS 15. PACT 16. ICPP 17. ICS 18. VEE 19. IPDPS 20. Performance 21. HPDC 22. ITC…

在亚马逊云科技上利用Graviton4代芯片构建高性能Java应用(下篇)

简介 在AI迅猛发展的时代,芯片算力对于模型性能起到了至关重要的作用。一款能够同时兼具高性能和低成本的芯片,能够帮助开发者快速构建性能稳定的生成式AI应用,同时降低开发成本。今天小李哥将介绍亚马逊推出的4代高性能计算处理器Gravition…

计算机毕业设计Python电影评论情感分析 电影可视化 豆瓣电影爬虫 电影推荐系统 电影数据分析 电影大数据 大数据毕业设计 机器学习 深度学习 知识图谱

相关技术介绍 豆瓣电影数据采集与可视化分析系统是用当前应用很广泛的Python语言和Flask框架,并结合CSS与HTML搭建Web网页,使用MySQL数据库对数据进行存储,依次来开发实现系统的功能。本系统运行需要的软件有Pycharm、普通浏览器、Navicat f…

AD原理图update为pcb

首先,要在自己的项目下面创建好原理图和PCB,记得保存!!! 点击设计>update 更新成功!

数据结构-图-存储-邻接矩阵-邻接表

数据结构-图-存储 邻接矩阵 存储如下图1,图2 图1 对应邻接矩阵 图2 #include<bits/stdc.h> #define MAXN 1005 using namespace std; int n; int v[MAXN][MAXN]; int main(){cin>>n;for(int i1;i<n;i){for(int j1;j<n;j){cin>>v[i][j];}}for(int…

RM比赛常见的电机(直流无刷电机)

声明&#xff1a;个人笔记&#xff0c;仅供参考 一、M2006电机 M2006 P36 电机采用三相永磁直流无刷结构&#xff0c;具有输出转速高、体积小、功率密度高等特点。该电机内置位置传感器&#xff0c;可提供精确的位置反馈&#xff0c;以 FOC 矢量控制方式使电机产生连续的扭矩。…

Cannot Locate Document 原理图导入pcb出现报错

将原理图update到pcb时报错Cannot Locate Document&#xff1a; 记得保存pcb到你的项目就可以了

爬虫之淘宝接口获取||Python返回淘宝商品详情数据SKU接口

在学习爬虫的过程中&#xff0c;大多数的人都是些豆瓣&#xff0c;招聘网站什么的。这里给出一些工作上能够用得到的内容&#xff0c; 仅供大家参考。 本次需要看的是淘宝的接口&#xff0c; 这个接口与微博寻找接口的方式大致相同。请看详细的寻找方法。首先我们先在百度页面点…

python实现c4d的tp粒子在多个物体上发射思维粒子

基本状态思维粒子只能传入一个物体&#xff0c;在一个物体身上发射粒子。 场景如下&#xff0c;右边的multiEmitter的python标签里的python脚本执行后会在其下面生成数个从pt物体的拷贝&#xff0c;同时拷贝其上的XPresso标签及标签里的内容 下面是pt物体的XPresso标签标签的内…

[ RK3566-Android11 ] 关于 RK628F 驱动移植以及调试说明

问题描述 我这个项目的SDK比较老&#xff0c;移植RK628F最新驱动的调试过程&#xff0c;踩了很多坑&#xff0c;希望大家别踩坑。 解决方案&#xff1a; 首先在FTP上下载最新的RK628的驱动 rk628-for-all-v27-240730 版本。 下载完后 不要直接替换&#xff0c;不要直接替换&a…

Vue获取后端重定向拼接的参数

前言 比如我们要重定向这样一个连接&#xff1a; http://192.168.2.189:8081?nameadmin springboot重定向&#xff1a; Vue获取&#xff1a; getParam(param) {var reg new RegExp("(^|&)" param "([^&]*)(&|$)");var r location.searc…

计算机的错误计算(八十八)

摘要 探讨双曲反正切函数 atanh(x)的计算精度问题。 IEEE 754-2019 中含有 atanh(x)函数。其定义为 例1. 计算 atanh(0.9999999999997) . 不妨用 LibreOffice中的电子表格计算&#xff0c;则有&#xff1a; 若在线运行JavaScript代码&#xff1a; let result Math.atanh(0.…

单电源转正负双电源电路

单电源转正负双电源电路&#xff1a; 1.通过两个DCDC芯片进行降压&#xff1a; 不同负载下电源纹波不同&#xff0c;所以看电源纹波首先先说明负载是什么&#xff1a; 采用TPS5430将单电源转换成双电源的方式供电&#xff1a; 2.通过电荷泵的方式转换电压 成本可以压低&#…

民生水暖工程背后的科技力量引领工程智能化转型

物联网技术的广泛应用&#xff0c;使得物理设备能够实时传输运行状态数据至云端&#xff0c;实现了设备的全面感知与互联互通。每一台机器、每一个传感器都成为数据的源泉&#xff0c;为远程监控提供了坚实的基础。而大数据分析技术的应用&#xff0c;则让这些海量数据得以被高…

R语言统计分析——用回归做ANOVA

参考资料&#xff1a;R语言实战【第2版】 ANOVA&#xff08;方差分析&#xff09;和回归都是广义线性模型的特例&#xff0c;方差分析也都可以使用lm()函数来分析。 # 加载multcomp包 library(multcomp) # 查看cholesterol数据集的处理水平 levels(cholesterol$trt) # 用aov()…

久久派搭建风电系统网站(基于mariadb数据库)

久久派搭建风电系统网站 1、安装mariadb2、设置root账号密码3、设置MariaDB开机自启4、允许远程登录5、还原数据库6、扩容swap7、拷贝数据8、运行系统方法1&#xff1a;通过sh脚本运行方法2&#xff1a;直接运行jar包 文中所需网盘资料及讲解视频在文章末尾哦1。 本文中参考资料…

万能无线航模模拟器加密狗说明书

快速开始 Step1 插入加密狗到你的电脑&#xff0c;手机或MAC的USB口。 Step2 使用加密狗上的按钮&#xff0c;选择一个合适的协议。具体看第一节。 Step3 和遥控器对码&#xff0c;成功后指示灯常亮。具体看FAQ第二节。 Step4 在你的电脑&#xff0c;手机或MAC 安装对…