pflowtts_pytorch

pflowtts_pytorch

高效零样本语音合成模型

pflowtts_pytorch是P-Flow论文的一个非官方实现,提供了基于语音提示的零样本文本转语音功能。该模型采用语音提示文本编码器和流匹配生成解码器,仅需少量训练数据即可实现与大规模模型相当的说话人相似度,同时具有显著更快的采样速度。在发音准确性和语音自然度方面表现出色,为高效率和高质量的语音合成提供了新的解决方案。

P-Flow零样本TTS语音提示语音合成流匹配生成解码器Github开源项目

P-Flow: 通过语音提示实现快速高效的零样本文本转语音

作者: Sungwon Kim, Kevin J Shih, Rohan Badlani, Joao Felipe Santos, Evelina Bhakturina, Mikyas Desta, Rafael Valle, Sungroh Yoon, Bryan Catanzaro

机构: NVIDIA

状态: 添加了具有更好韵律和发音的新样本。请查看samples文件夹。LJSpeech预训练检查点 - GDrive链接

NVIDIA论文P-Flow: 通过语音提示实现快速高效的零样本文本转语音的非官方实现。

P-Flow

尽管最近的大规模神经编解码语言模型通过训练数千小时的数据在零样本TTS方面显示出显著改进,但它们存在一些缺点,如缺乏鲁棒性、采样速度慢(类似于之前的自回归TTS方法),以及依赖预训练的神经编解码表示。我们的工作提出了P-Flow,一种快速且数据高效的零样本TTS模型,使用语音提示进行说话人适应。P-Flow包括一个用于说话人适应的语音提示文本编码器和一个用于高质量快速语音合成的流匹配生成解码器。我们的语音提示文本编码器使用语音提示和文本输入生成说话人条件的文本表示。流匹配生成解码器使用说话人条件输出合成高质量的个性化语音,速度明显快于实时。与神经编解码语言模型不同,我们专门在LibriTTS数据集上使用连续mel表示训练P-Flow。通过我们使用连续语音提示的训练方法,P-Flow在训练数据量少两个数量级的情况下,达到了大规模零样本TTS模型的说话人相似度性能,并且采样速度提高了20多倍。我们的结果表明,P-Flow具有更好的发音,并且在人类真实性和说话人相似度方面优于最近的最先进对手,因此将P-Flow定义为一种有吸引力且理想的替代方案。

致谢

  • 当然要感谢论文的作者花时间向我解释了一些我一开始没有理解的论文细节。
  • 我们将基于VITS2 repoMATCHA-TTS repoVoiceFlow-TTS repo构建这个仓库。
  • LMNT-com的朋友们。可以在lmnt-com试用他们的超快速、逼真的TTS模型。如果你喜欢我们在这里构建的内容,来加入LMNT吧

快速运行

cd pflowtts_pytorch/notebooks
import sys sys.path.append('..') from pflow.models.pflow_tts import pflowTTS import torch from dataclasses import dataclass @dataclass class DurationPredictorParams: filter_channels_dp: int kernel_size: int p_dropout: float @dataclass class EncoderParams: n_feats: int n_channels: int filter_channels: int filter_channels_dp: int n_heads: int n_layers: int kernel_size: int p_dropout: float spk_emb_dim: int n_spks: int prenet: bool @dataclass class CFMParams: name: str solver: str sigma_min: float # 示例用法 duration_predictor_params = DurationPredictorParams( filter_channels_dp=256, kernel_size=3, p_dropout=0.1 ) encoder_params = EncoderParams( n_feats=80, n_channels=192, filter_channels=768, filter_channels_dp=256, n_heads=2, n_layers=6, kernel_size=3, p_dropout=0.1, spk_emb_dim=64, n_spks=1, prenet=True ) cfm_params = CFMParams( name='CFM', solver='euler', sigma_min=1e-4 ) @dataclass class EncoderOverallParams: encoder_type: str encoder_params: EncoderParams duration_predictor_params: DurationPredictorParams encoder_overall_params = EncoderOverallParams( encoder_type='RoPE Encoder', encoder_params=encoder_params, duration_predictor_params=duration_predictor_params ) @dataclass class DecoderParams: channels: tuple dropout: float attention_head_dim: int n_blocks: int num_mid_blocks: int num_heads: int act_fn: str decoder_params = DecoderParams( channels=(256, 256), dropout=0.05, attention_head_dim=64, n_blocks=1, num_mid_blocks=2, num_heads=2, act_fn='snakebeta', ) model = pflowTTS( n_vocab=100, n_feats=80, encoder=encoder_overall_params, decoder=decoder_params.__dict__, cfm=cfm_params, data_statistics=None, ) x = torch.randint(0, 100, (4, 20)) x_lengths = torch.randint(10, 20, (4,)) y = torch.randn(4, 80, 500) y_lengths = torch.randint(300, 500, (4,)) dur_loss, prior_loss, diff_loss, attn = model(x, x_lengths, y, y_lengths) # 反向传播损失 # 现在进行合成 x = torch.randint(0, 100, (1, 20)) x_lengths = torch.randint(10, 20, (1,)) y_slice = torch.randn(1, 80, 264) model.synthesise(x, x_lengths, y_slice, n_timesteps=10)

在Google Colab上快速运行

在Colab中打开

运行说明

  1. 创建环境(建议但非必需)
conda create -n pflowtts python=3.10 -y conda activate pflowtts

保持在根目录(当然先要克隆仓库!)

cd pflowtts_pytorch pip install -r requirements.txt
  1. 构建单调对齐搜索
# Cython版本的单调对齐搜索 python setup.py build_ext --inplace

假设我们使用LJ Speech进行训练

  1. 这里下载数据集,解压到data/LJSpeech-1.1,并准备文件列表以指向解压的数据,如NVIDIA Tacotron 2仓库设置中的第5项所示。

3a. 转到configs/data/ljspeech.yaml并更改

train_filelist_path: data/filelists/ljs_audio_text_train_filelist.txt valid_filelist_path: data/filelists/ljs_audio_text_val_filelist.txt

3b. 懒人的辅助命令

!mkdir -p /home/ubuntu/LJSpeech/LJSpeech-1.1/filelists !wget -O /home/ubuntu/LJSpeech/LJSpeech-1.1/filelists/ljs_audio_text_test_filelist.txt https://raw.githubusercontent.com/NVIDIA/tacotron2/master/filelists/ljs_audio_text_test_filelist.txt !wget -O /home/ubuntu/LJSpeech/LJSpeech-1.1/filelists/ljs_audio_text_train_filelist.txt https://raw.githubusercontent.com/NVIDIA/tacotron2/master/filelists/ljs_audio_text_train_filelist.txt !wget -O /home/ubuntu/LJSpeech/LJSpeech-1.1/filelists/ljs_audio_text_val_filelist.txt https://raw.githubusercontent.com/NVIDIA/tacotron2/master/filelists/ljs_audio_text_val_filelist.txt !sed -i -- 's,DUMMY,/home/ubuntu/LJSpeech/LJSpeech-1.1/wavs,g' /home/ubuntu/LJSpeech/LJSpeech-1.1/filelists/*.txt !sed -i -- 's,train_filelist_path: data/filelists/ljs_audio_text_train_filelist.txt,train_filelist_path: /home/ubuntu/LJSpeech/LJSpeech-1.1/filelists/ljs_audio_text_train_filelist.txt,g' /home/ubuntu/LJSpeech/pflowtts_pytorch/configs/data/ljspeech.yaml !sed -i -- 's,valid_filelist_path: data/filelists/ljs_audio_text_val_filelist.txt,valid_filelist_path: /home/ubuntu/LJSpeech/LJSpeech-1.1/filelists/ljs_audio_text_val_filelist.txt,g' /home/ubuntu/LJSpeech/pflowtts_pytorch/configs/data/ljspeech.yaml
  1. 使用数据集配置的yaml文件生成标准化统计
cd pflowtts_pytorch/pflow/utils python generate_data_statistics.py -i ljspeech.yaml # 输出: #{'mel_mean': -5.53662231756592, 'mel_std': 2.1161014277038574}

configs/data/ljspeech.yaml中的data_statistics键下更新这些值。

data_statistics: # 为ljspeech数据集计算得出 mel_mean: -5.536622 mel_std: 2.116101

到你的训练和验证文件列表的路径。

  1. 运行训练脚本
python pflow/train.py experiment=ljspeech
  • 对于多GPU训练,运行
python pflow/train.py experiment=ljspeech trainer.devices=[0,1]

架构细节

  • 带有Prenet和RoPE Transformer的语音提示文本编码器
  • 带有MAS的持续时间预测器
  • 带有CFM的流匹配生成解码器(论文使用wavenet解码器;我们使用修改的wavenet,并包含可选的U-NET解码器进行实验)
  • 语音提示输入目前切片输入频谱图并与文本嵌入连接。可以支持外部语音提示输入(在训练期间也可以)
  • 用于训练的pflow提示掩码损失
  • HiFiGan作为声码器
  • 采样的指导

待办事项、功能和更新说明

  • (2023/11/12) 目前这是一个实验性仓库,许多功能都采用了我在网上找到的快速架构实现。我将很快添加原始架构。
  • (2023/11/12) 查看notebooks文件夹以快速运行和测试模型架构。
  • (2023/11/12) 目前在我的数据集上训练失败,我会尽快调试并修复。但训练代码运行时没有错误。
  • (2023/11/13)
    • 修复了单调对齐构建中的重大错误
    • 模型内部可以有多种组合
    • 架构的整体框架与论文相同,但内部实现不同
    • 如果模型无法收敛,最终会采用论文中的确切架构
  • (2023/11/13) Tensorboard截图 替代文本
  • (2023/11/13)
    • 添加了安装说明
  • (2023/11/13)
    • 看起来模型正在学习,并且走上了正轨。 替代文本
  • (2023/11/14) 替代文本
  • (2023/11/14)
    • 添加了Google Colab笔记本以便快速运行
  • (2023/11/16)
    • 添加了示例音频
    • 进行了一些架构更改
    • 我们知道模型在学习,现在需要尝试多说话人并检查韵律。
  • (2023/11/17)
    • 添加了3个新分支 ->
      • dev/stochastic -> 对后验采样和文本编码器(先验)进行了一些更改,使其具有随机性
      • dev/encodec -> 预测encodec连续潜在变量而不是梅尔频谱图;如果可行,使用encodec进行解码而不是hifi-gan
      • exp/end2end -> pflow与hi-fi gan的端到端训练,直接从文本和语音提示输入生成音频;如果可行,vits-tts将被淘汰。
  • (2023/11/17)
    • 24轮encodec样本(虽然有机器人感,但这是概念验证)encodec_poc.wav
  • (2023/11/20)
    • 模型基本准备就绪。
    • 为估计器添加了3种选择,需要将它们设为超参数并添加到配置文件中。
    • 感谢@zidsi指出代码中的拼写错误。
  • (2023/11/23)
    • 添加了具有更好韵律和发音的新样本。查看samples文件夹。(LJSpeech训练300k步)论文建议800k步。
  • (2023/12/02)
    • 按照论文建议,为欧拉求解器添加了引导。这大大提高了音频质量。感谢discord上的@robbit指出这一点。
  • (2023/12/03)
    • 为好奇的人添加了descript-codec分支。(尚未测试)
  • (2024/01/17)
    • 在配置文件(data/[dataset].yaml)中添加了最小wav样本大小(秒)参数,min_sample_size(默认为4秒;以确保提示至少3秒,预测至少1秒)
    • 在配置文件(models/pflow.yaml)中添加了prompt_size,用于控制提示的大小。它是训练时从wav样本中使用的mel帧数。(默认约3秒;3*22050//256 = 258;在配置中四舍五入为264)
    • 在配置文件(models/pflow.yaml)中添加了dur_p_use_log,用于控制是否使用持续时间预测的对数进行损失计算。(现在默认为False)我的假设是,对数持续时间的均方误差损失对较长的停顿等效果不佳(由于对数函数的性质)。因此,我们在计算损失之前对对数持续时间进行e的幂运算。另一种方法可以是使用relu而不是对数。
    • 在配置文件(train.yaml)中添加了transfer_ckpt_path,用于控制用于迁移学习的检查点路径。(默认为None)如果为None,则从头开始训练模型。如果不为None,则从检查点路径加载模型并从步骤0开始训练。如果ckpt_path也不为None,则从ckpt_path加载模型并从保存的步骤开始训练。transfer_ckpt_path可以处理检查点和模型之间的层大小不匹配。
  • (2024/01/28)
    • 基于Matcha-TTS仓库添加了ONNX导出支持。(尚未测试,很快会测试){草稿}
  • (2024/01/30)
    • ONNX已测试并运行良好。使用export.pyinference.py中的参数导出和测试模型。(参数是自解释的)
  • (2024/03/18)
    • 在语音文本编码器中添加了位置嵌入。
  • 欢迎任何人为这个仓库做出贡献。请随时提出问题或提交PR。

编辑推荐精选

问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多