论文解读 VITS: Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech

前文讲到OpenVoicev2,补充下细节,然后梳理使用的基础模型VITS:

📓

melo-tts 生成原始音频:

  • OpenVoice 版本1不依赖melo-tts, 升级后的V2版本依赖melo-tts, 主要是生成原始音频质量加强了(由melo-tts生成);
  • 默认配置使用了TransformerCouplingBlock list作为flow 和 reverse flow, 而第一版的OpenVoice 模型使用的 ResidualCouplingBlock ;
  • melo-tts的模型权重支持多语言,更具语言区分,比如 ZH: myshell-ai/MeloTTS-Chinese, EN_NEWEST: myshell-ai/MeloTTS-English-v3;

音色转换生成目标音频:

  • 通过训练好的音色抽取器抽取目标说话者的音色 (myshell-ai/OpenVoiceV2/converter);
  • 生成的原始音频信息通过 训练抽取好的基础说话者的音色(myshell-ai/OpenVoiceV2/base_speakers/ses),将原始音频中的音色去除 (flow);
  • 将去除原始音色的音频 和 抽取好的目标说话者的音色 合并 (reverse flow); 最终通过 vocoder(也是论文中的Decoder,使用的 HiFi-Gan模型)合成目标音频。

额外注意的是,由melo-tts生成原始音频sample rate是 44100, 而通过音色提取器 提取 并且 生成目标音频sample rate是 22050

前提知识这里简单概括如下:

AE(Autoencoder): 自编码器是自监督系统,其训练目标是通过降维来压缩(或编码)输入数据,然后使用该压缩后的表示准确重建(或解码)其原始输入。无泛化生成能力,但是可以执行特定任务:常用于数据压缩、图像去噪、异常检测和面部识别等任务。

VAE(Variational Autoencoder) :与其他自编码器(Autoencoder(AE)的区别在于它们对潜在空间进行编码的独特方式,以及可以应用其概率编码的不同用例,即随机生成训练数据的变体。具有泛化生成能力。

CVAE(Conditional Variational Autoencoder): 条件变分自编码器 可以以特定输入为条件进行输出,而不仅仅是随机生成训练数据的变体。这是通过将监督学习(或半监督学习)的元素与常规自编码器的传统无监督训练目标相结合来实现的。具有指定特征的泛化能力。

  • VAE 与 GAN的区别:

    VAE 经常与生成式对抗网络 (GAN) 进行比较,GAN 是另一种模型架构,用于生成类似于训练数据的样本,尤其是图像。

    与 VAE 类似,GAN 是结合两种神经网络的联合架构:一个生成器网络,负责输出与训练数据集中的图像相似的图像样本,另一个判别器网络,负责确定特定图像是训练数据中的“真实”图像还是来自生成器网络的“虚假”图像。

    这两个网络在零和博弈中进行对抗性训练:来自判别器的反馈用于改进生成器的输出,直到判别器不再能够区分真假样本。

    就图像合成而言,两者各有优劣:

    • GAN 可以生成更清晰的图像,但由于两种复合模型之间的对抗性权衡,在训练中并不稳定。
    • VAE 更容易训练,但由于其根据训练数据的“平均”特征生成图像的性质,往往会生成比较模糊的图像。
  • VAE-GAN 两者结合 顾名思义,VAE-GAN 是变分自编码器 (VAE) 和生成式对抗网络 (GAN) 的混合体。通过用判别器网络替换 VAE 模型的重建损失项,来降低 VAE 生成图像的模糊性,提高生成质量。

VITS 使用了 条件变分自编码器 (Conditional Variational Autoencoder (CVAE)) 和生成式对抗网络 (Generative adversarial network(GAN)) 两个模型架构。 至于VAE和GAN的细节可以关注下baby-llm这个学习项目中的对应模块PR学习资料:

这篇文章是讲解VITS,是现在工业上TTS常用的基础方案(NAR模型,成本相对AR模型低, 推理快,生成质量尽可能追平或超越SOTA AR模型)。作者来自韩国现代汽车公司的 AIR 实验室(人工智能研究实验室),论文结合了以前的研究成果:

后续作者还研究了加入扩散模型来生成语音,不需要使用分类器指导的目标说话者的任何转录。

Guided-TTS 将无条件扩散概率模型(unconditional Diffusion Model)与单独训练的音素分类器(phoneme classifier )相结合,用于分类器指导。无条件扩散模型学习在没有任何上下文的情况下从未转录的语音数据中生成语音。对于 TTS 合成,使用在大规模语音识别数据集上训练的音素分类器来指导扩散模型的生成过程。

VITS

主要贡献:

  • 提出了一种并行的端到端 TTS 方法,它可以生成比当前两阶段模型更自然的音频;
  • 采用通过归一化流程和对抗性训练过程增强的变分推理,提高了生成模型的表达能力;
  • 一个随机持续时间预测器(stochastic duration predictor)来从输入文本中合成具有不同节奏的语音;
  • 通过对潜在变量的不确定性建模和随机持续时间预测器,表达了自然的一对多关系,其中文本输入可以以不同的音调(pitches)和节奏(rhythms)以多种方式说出。

通过利用条件变分自编码器 CVAE,模型特点:

  1. 学习直接从文本合成原始波形,而不需要额外的输入条件;
  2. 使用动态编程方法 MAS 来搜索最佳对齐方式,而不是与计算损失相比,不需要任何外部对齐器;
  3. 并行生成样本;
  4. 高效的端到端训练方法, 并且生成质量优于最好的公开可用的两阶段模型。附两阶段的数据处理过程(在后续的研究论文中称之为级联方法(cascaded),见VALL-E系列论文研究):
    • 第一阶段是从预处理的文本中生成中间语音表示,例如梅尔谱图(mel-spectrograms)或语言特征(linguistic features)
    • 第二阶段是生成以中间表示为条件的原始波形。
    • 两阶段的相关模型大都是独立开发的。

结构:

VITS

PS: achatbot 集成了OpenVoiceV2 with meloTTS(meloTTS代码大部分来自VITS,Flow 采用 Transformer Encoder 结构来自 VITS2: Improving Quality and Efficiency of Single-Stage Text-to-Speech with Adversarial Learning and Architecture Design | paper code

PR地址: https://github.com/ai-bot-pro/achatbot/pull/103

论文解读 OpenVoice: Versatile Instant Voice Cloning

使用meloTTS 本文生成的音频

使用openVoice clone 自己的声音 阅读本文内容

文件直接上传在github中, 暂未走cdn, 缓存比较慢,可下载播放, 下载地址: http://github.com/weedge/paper-speaker/tree/main/multimoding/voices/open_voice_inference


openVoiceV2 tone color clone: base TTS + extra tone color + convert

Base TTS: use meloTTS , 支持TTS模型训练,以及load Pre-Trained ckpt 进行TTS, 在 VITS基础上支持多种语言;

论文地址:OpenVoice: Versatile Instant Voice Cloning

论文主作者:Zengyi Qin (同时是JetMoE的作者,站在巨人的肩膀上创新)

公开的权重:

源码:

训练: MSML dataset 和 训练过程 未公开

附操作笔记https://github.com/weedge/doraemon-nb/blob/main/myshell_ai_OpenVoiceV2.ipynb

论文解读 DeLighT: Very Deep and Light-weight Transformers

在看apple 最近发布的OpenELM 模型,其论文中提到 block-wise scaling 模型结构优化方法,(论文见: OpenELM: An Efficient Language Model Family with Open-source Training and Inference Framework),这里记录下DeLighT论文中的 block-wise scaling,翻译整理下以便对照代码实现,了解背景和原理。DeLighT论文中的实验任务主要是在两个标准的序列建模任务上评估了DeLighT的性能:机器翻译(machine translation)任务 encoder-decoder architecture 和 语言建模( language modeling)decoder architecture,论文中机器翻译任务未对En-Zh(英文译中文)进行实验,可以作为一个复现练习,根据源码实操一下论文中的实验;而语言建模可以作为openELM的来源延伸~ 结合cornet进行复现(也有mxl示例,mxl针对Apple Silicon 硬件进行的优化深度学习框架)。

论文主作者:Sachin Mehta

论文地址:https://arxiv.org/pdf/2008.00623

论文代码: https://github.com/sacmehta/delight (基于当时facebook的 fairseq seq2seq工具库开发)

该论文研究是在作者以前的DeFINE: DEep Factorized INput Token Embeddings for Neural Sequence Modeling 进行改进,模型结构引入更多的GLTs,来学习更宽的权重,并且减少了参数数量。

摘要

我们介绍了一种深度且轻量级的Transformer,名为DeLighT,它在参数数量显著减少的情况下,提供了与标准基于Transformer的模型相似或更好的性能。DeLighT更有效地在每个Transformer块内部(通过DeLighT变换)以及跨块(通过块级缩放)分配参数,允许输入端使用较浅较窄的DeLighT块,输出端使用较宽较深的DeLighT块。总体而言,DeLighT网络比标准Transformer模型深2.5到4倍,但参数和运算量更少。在基准机器翻译和语言建模任务上的实验表明,DeLighT在平均参数数量减少2到3倍的情况下,达到或提高了基线Transformer的性能。

解读论文:Leave No Context Behind: Efficient Infinite Context Transformers with Infini-attention

图片来源: https://aiptcomics.com/2024/04/10/transformers-7-2024-review/

摘要: 本文介绍了一种有效的方法,将基于Transformer的大型语言模型(LLMs)扩展到无限长的输入,同时受到内存和计算的限制。我们提出的方法的关键组成部分是一种新的注意力技术,称为Infini-attention。Infini-attention将一种压缩内存集成到了传统的注意力机制中,并在单个Transformer块中构建了掩码局部注意力和长期线性注意力机制。我们通过在长上下文语言建模基准、1M序列长度的口令(keypass)上下文块检索和500K长度的书籍摘要任务中使用1B和8B LLMs,展示了我们方法的有效性。我们的方法引入了最小的有界内存参数,并实现了LLMs的快速流式推理。

:为解决大模型(LLMs)在处理超长输入序列时遇到的内存限制问题,本文作者提出了一种新型架构:Infini-Transformer,它可以在有限内存条件下,让基于Transformer的大语言模型(LLMs)高效处理无限长的输入序列。实验结果表明:Infini-Transformer在长上下文语言建模任务上超越了基线模型,内存最高可节约114倍。

感觉有种外挂存储库(类似向量数据库)嵌入到模型结构中。比如: Memorizing Transformers + code

在论文《Memorizing Transformers》中,作者提出了一种新的注意力机制,称为kNN-augmented attention layer,它结合了局部上下文的密集自注意力和对外部记忆的近似k-最近邻(kNN)搜索。这个机制的关键部分之一是使用了一个门控机制(gating mechanism)来结合局部注意力和外部记忆的注意力。

翻译模型 inference 和 微调

image-20240328231303644

想把 HuggingFaceTB/cosmopedia 英文数据中的prompt和text 翻译成 中文, 然后看了下python库 deep_translator的实现, 翻译调用的是三方接口集成库, 于是使用这个库封装的谷歌翻译接口来翻译,但是三方平台接口多会有限流和接口调用频率限制,即使在代码中有容错处理, 比如常规的sleep下再调用,不影响整理处理流程,但是整体处理时间受接口限制,即使用批处理也如此,这个在大规模数据处理中使用三方接口时,经常会遇到的问题,用的三方服务,如果不升级接口服务,在技术上不太好解决; 于是选择另外一种方案,看是否有开源的翻译模型,底层模型结构一般也是Transform架构 Encoder-Decoder model ,也称sequence-to-sequence model; 比如 谷歌的T5模型, 但是推理速度受硬件条件影响,比较慢,而且原始模型不支持英文翻译成中文。

然后看了下meta nllb 模型,专门用来处理翻译的模型,单个 AI 模型中支持 200 种语言,开源地址: https://github.com/facebookresearch/fairseq/tree/nllb 模型相对现在的LLM参数量小一些,也在huggingface的Transforms库中集成 nllb-200-distilled-600M,直接可以load使用, 等等。。。 既然llm推理可以通过想llama.cpp通过加载ggml格式进行量化,在性能有少许折损的情况下降低推理成本,但是ggml gguf格式还不支持nllb模型权重文件(貌似llama.cpp只支持Transform Decoder模型结构);那就直接用Transforms库来加载facebook/nllb-200-distilled-600M 模型来批量翻译试试看;后续还尝试使用 Helsinki-NLP/opus-mt-en-zh 模型,进行了简单对比。

使用Gemma LLM构建RAG应用程序

img

介绍

随着大型语言模型的不断发展,构建 RAG(检索增强生成)应用程序的热潮与日俱增。谷歌推出了一个开源模型:Gemma。众所周知,RAG 代表了两种基本方法之间的融合: 基于检索的技术和生成模型。基于检索的技术涉及从广泛的知识库或语料库中获取相关信息以响应特定的查询。生成模型擅长利用训练数据中的见解从头开始创建新内容,从而精心制作原始文本或响应。

目的:使用开源模型gemma来构建 RAG 管道并看看它的性能如何。

通过chatGPT聊天解决rust线程安全问题

发现一个有趣玩法,针对rust 编译检查的问题(这个在编写代码逻辑的时候经常会遇到,逻辑是OK,但是通不过rust的安全检查),可以直接发给 chatGPT (其他通过代码库进行PT的模型,或者SFT的模型), 会给出修改意见,并且可以根据它的提示继续追问怎么解决; 如果直接通过传统的搜索引擎比如google, 也很难找出好的解决方法,而且还要去筛选,去尝试这个方法,如果不是权威网站,可能还被坑。来来回回折腾,效率太低了。像最近的AI程序员 david: introducing-devin ,其实类似思路,也是通过聊天来解决问题,只不过更加的专业,归根结底还是需要专业数据去PT/SFT底层的模型,上层应用通过pipeline对应框架去整体系统调优。(不知是否满足类似这种rust场景的解决方案pipeline,直接给它代码,帮忙修改)