English | 日本語 | 한국어 | Türkçe | Español | Português
此名字已获GPT-SoVITS作者花儿不哭的许可。
GPT-SoVITS | GPT-SoVITS2 |
---|---|
Text | Text |
Text->Phone | Text->BPE |
Phone->Embedding | BPE->Embedding |
Roberta-Chinese | BGE-M3 |
Speech Encoder | Speech Encoder |
Hubert | $S^3$ |
VQ | $S^3$->Embedding |
1024 Speech Token | 4096 Speech Token |
AR | AR |
Old-Style GPT | Qwen2-0.3b |
Speech Decoder | Speech Decoder |
VITS | VITS2 |
Hidden Size 192 | Hidden Size 256 |
2 Heads | 4 Heads |
Inter Size 768 | Inter Size 1024 |
Training | Training |
No Zero-Shot Training | Inference Different Speech with same Speaker |
ZH,EN,JA | Multi-Lingual |
2k hours | Not Sure Yet |
单码本-> 2码本/4码本
$S^3$ 的vocab size为4096 单码本
换成qwen2-0.3b
cnhubert-> ~~w2v-bert-2.0(暂定,此为meta做的目前训练集最夸张4.6m小时多语言预训练。如果结果像外国人说中文就换cnhubert-large)/cnhubert-large/mHubert-147~~
我发现w2v-bert-2.0训练有点难,mHubert-147训练会比较简单,体积差了四倍,而且实测fp16直接会炸,只能fp32.并且mHubert已经够大了(600MB)
使用CosyVoice中的$S^3$ Encoder,外接Embedding层
去掉音素以及相应embedding
音素->BPE分词
cn-roberta -> BGE-m3
文本与语音编码各自做sinusoidal->全局做RoPE embedding.
从原本的 x1+x2+y1->y2 变成 x1+y1+x2->y2 并且整条序列共享一个RoPE embedding 理论上来讲这样更加适合扩展更多目标音频来进行声线融合 比如可以 x1+y1+x2+y2+x3+y3+x4+y4+x5->y5 这样感觉会比 x1+x2+x3+x4+x5+y1+y2+y3+y4->y5 更自然一点.无法严格证明
MLP(768, 512) -> 无MLP直接1024维度。因为w2v-bert-2.0和bge-m3都是1024维,天生一对啊. MLP(1024, 768)
纯自回归->自回归+同一speaker下zero shot训练样本回归
可能想办法把维度扩大.(256->512) VITS->VITS2(主要是流模型添加transformer block) 量化->GroupResidualFSQ text embedding(len(symbol)) -> text embedding(250000)[BGE m3 tokenizer]
统一半精度 单精度(实测之后发现半精度会炸) 半精度修复了,用回bf16(已经给vector-quantize-pytorch交了PR),根据vall-e, 可以GPT bf16,VITS+hubert+量化 fp32,或者别的组合,到时候实验。 hubert 16000采样 vits 32000采样 对所有音频做响度统一
其实总体上来说,改动基本都是
都看到这里了,说明你看懂了,欢迎来加入这个项目!
QQ: 1715069210
微信: JunityZ
是否一定需要BGE-m3呢?直接用BGE-m3的tokenizer,然后自己训练一个text-embedding不行吗?或者融合他们,自己训练一个embedding再加上BGE-m3的embedding。 自回归模型深度很重要,但是深度不能被显卡的并行能力所利用,batch size = 1和 batch size = 10推理一次的速度是一样的。但实际上推理一句话只能batch size = 1 如何加速呢?
今天看了很多论文包括VALLE2的论文又有很多新的想法.有一个很重要的事情就是目前这个ar_audio_embedding和ar_text_embedding其实是一个历史遗留问题了。
因为audioLM率先使用了hubert+kmeans获得token,但是因为kmean量化学习不需要学整体数据,而是直接从hubert分布上学习。所以会加一个后续的embedding。
但如果用了vq,vq本身就已经做了学习了,所以vq不需要再加一个embedding,这里历史遗留问题一直都有加embedding,虽然影响应该不会很大,但是去掉的话会合理很多。
还有就是 audio lm 同时用了semantic和acoustic,分别通过hubert和soundstream。但其实GPT SoVITS也有这个,meltransferencoder获得acoustic,而hubert获得semantic,所以非常巧。
而VALLE系一般用的是EnCodec,EnCodec是直接从音频得到token,才会需要再做一个embedding,因为本身就没出embedding,但是很明显用hubert就不需要了,因为hubert的输出就是embedding。
反过来,我们用hubert embedding得到token,而EnCodec是得到token之后反过来做embedding。
所以原版的GPTSoVITS包括之前参考的AUdio LM更像是参考了基于EnCodec系列TTS的做法,但实际上这两个是不一样的。
重写量化, 直接调用vector-quantize-pytorch的Group Residual VQ