paint-brush
如何使用 SoftVC VITS 和 Bert-VITS2 进行语音克隆:深入探讨经过@techshinobi
2,549 讀數
2,549 讀數

如何使用 SoftVC VITS 和 Bert-VITS2 进行语音克隆:深入探讨

经过 Tech Shinobi12m2024/03/06
Read on Terminal Reader

太長; 讀書

在上一篇文章中,我尝试了一些 TTS Generation WebUI,发现它很有趣。因此,我决定用自己的声音训练一个可用的模型。 该语音克隆项目探索了用于语音更改的 SVC 和用于文本转语音的 VITS。没有一种工具可以完成所有工作。 我已经为这个项目测试了几种工具。许多好的指南,比如这个、这个、这个,都是中文的。所以,我认为用英语发布我的笔记会很有用。
featured image - 如何使用 SoftVC VITS 和 Bert-VITS2 进行语音克隆:深入探讨
Tech Shinobi HackerNoon profile picture
0-item

目录

  • 使用 SoftVC VITS 和 Bert-VITS2 深入研究语音克隆
    • 准备数据集
      • 歌曲摘录
        • UVR 工作流程
      • 录音准备
        • 小气鬼的音频设备
        • Audacity 工作流程
      • 音频切片器
        • 清理数据集
        • 匹配响度
    • 索维茨-SVC
      • 设置环境
      • 初始化
        • 下载预训练模型
        • 数据集准备
        • 编辑配置
      • 训练
      • 推理
      • 音频编辑
    • so-vits-svc-fork
      • 安装
      • 准备
      • 训练
      • 推理
    • DDSP-SVC
      • 准备
      • 训练
      • 推理
    • Bert-vits2-V2.3
      • 初始化
      • 准备
        • 转录
      • 训练和推理
    • vits-简单-api
      • 调整
      • 分享模型


上一篇文章中,我尝试了一些TTS Generation WebUI ,发现它很有趣。因此,我决定用自己的声音训练一个可用的模型。


该语音克隆项目探索了用于语音更改的 SVC 和用于文本转语音的VITS 。没有一种工具可以完成所有工作。


我已经为这个项目测试了几种工具。许多好的指南,比如这个这个这个,都是中文的。所以,我认为用英语发布我的笔记会很有用。


尽管so-vits-svc已经存档了几个月,可能是因为压抑,但它仍然是效果最好的工具。


其他相关工具(例如so-vits-svc-forkso-vits-svc-5.0DDSP-SVCRVC )提供更快/升的优化、更多功能或更好的接口。


但只要有足够的时间和资源,这些替代方案都无法与原始 so-vits-svc 产生的卓越结果相竞争。


对于 TTS,一种名为Bert-VITS2的新工具效果非常好,并且在上个月的最终版本中已经成熟。它有一些非常不同的用例,例如音频内容创建。

准备数据集

数据集的音频文件应为WAV格式,44100 Hz,16位,单声道,理想情况下为1-2小时。

歌曲摘录

Ultimate Vocal Remover是完成这项工作最简单的工具。有一个线程详细解释了一切。

UVR 工作流程

  • 删除并提取乐器
    • 型号:VR - UVR(4_HP-Vocal-UVR)

    • 设置:512 - 10 - GPU

    • 输出器乐和不干净的人声


  • 删除并提取背景声音。
    • 型号:VR-UVR(5_HP-卡拉OK-UVR)

    • 设置:512 - 10 - GPU

    • 输出背景人声和不干净的主声


  • 消除混响和噪音。
    • 型号:VR - UVR-DeEcho-DeReverb 和 UVR-DeNoise

    • 设置:512 - 10 - GPU - 仅无其他

    • 输出干净的主音


  • (可选)使用RipX(非免费)进行手动精细清理。

录音准备

最好在经过处理的房间内使用电容式麦克风进行录音,否则,请使用定向或动圈式麦克风来减少噪音。

小气鬼的音频设备

我第一次接触音乐是在高中的时候,当时使用的是蓝色的 Sennheiser MX500 和 Koss Porta Pro。我还记得第一次在 Sony VAIO 上使用 Cool Edit Pro 录制歌曲时的情景。


如今,作为业余爱好者,我仍然拒绝在音频硬件上花很多钱,因为它实际上是一个吸钱的黑洞。


尽管如此,我真的很欣赏这些廉价生产设备的可靠性。


我的设置的核心部分是 Behringer UCA202,它非常适合我的用例。我在降价期间以 10 美元的价格购买了它。


它是所谓的“音频接口”,但基本上只是一个具有多个端口的声卡。我的耳机使用了 RCA 转 3.5mm TRS 线缆,使用半开放式 K240s 进行常规输出,使用封闭式 HD669/MDR7506 进行监听输出。


上述三款耳机的正常价格均低于 100 美元。还有 Samson、Tascam、Knox Gear 等的克隆产品,价格不到 50 美元。


对于输入设备,出于环境噪音的考虑,我使用动圈麦克风。它是 SM58 副本(Pyle)+ Tascam DR-05 录音机(作为放大器)。其他克隆如 SL84c 或 wm58 也可以做到这一点。


我使用XLR转3.5mm TRS电缆将麦克风连接到录音机的MIC/外部输入,然后使用AUX电缆连接录音机的线路输出和UCA202的输入。


不建议购买“音频接口”和专用放大器来复制我的设置。 10 美元的 c-media USB 声卡应该足够了。我拥有的 Syba 型号能够直接对动圈麦克风甚至一些低端幻象供电麦克风进行“前置放大”。


该设置可以非常便宜(40~60 美元),但使用 UCA202 和 DR-05,声音会干净得多。我真的很喜欢我的旧数码录音机的物理控制、多功能性和便携性。

大胆工作流程

尽管当我作为设计师拿薪水时,我对劲舞团还是很满意的。但对于个人在有趣的项目中使用,Audacity 是避免 Adobe 混乱邪恶的方法。

音频切片器

使用audio-sliceraudio-slicer (gui)将音频文件切成小块以供以后使用。

默认设置效果很好。

清理数据集

删除那些非常短的片段,并重新切片那些仍超过 10 秒的片段。


如果数据集很大,请删除所有小于 4 秒的数据。如果数据集较小,只需在 2 秒内删除那些数据。


如有必要,请对每个文件执行手动检查。

匹配响度

再次使用 Audacity 进行响度归一化; 0db 应该可以。

索维茨-SVC

设置环境

虚拟环境对于在一个系统内运行多个 Python 工具至关重要。我以前使用虚拟机和 Docker,但现在我发现anaconda比其他的更快、更方便。


为so-vits-svc创建一个新环境,并激活它。

 conda create -n so-vits-svc python=3.8 conda activate so-vits-svc


然后,安装要求。

 git clone https://github.com/svc-develop-team/so-vits-svc cd so-vits-svc pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 #for linux pip install -r requirements.txt #for windows pip install -r requirements_win.txt pip install --upgrade fastapi==0.84.0 pip install --upgrade gradio==3.41.2 pip install --upgrade pydantic==1.10.12 pip install fastapi uvicorn

初始化

下载预训练模型

  • 预训练
    • wget https://huggingface.co/WitchHuntTV/checkpoint_best_legacy_500.pt/resolve/main/checkpoint_best_legacy_500.pt

    • wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/rmvpe.pt


  • 日志/44k
    • wget https://huggingface.co/datasets/ms903/sovits4.0-768vec-layer12/resolve/main/sovits_768l12_pre_large_320k/clean_D_320000.pth

    • wget https://huggingface.co/datasets/ms903/sovits4.0-768vec-layer12/resolve/main/sovits_768l12_pre_large_320k/clean_G_320000.pth


  • 原木/44k/扩散
    • wget https://huggingface.co/datasets/ms903/Diff-SVC-refactor-pre-trained-model/resolve/main/fix_pitch_add_vctk_600k/model_0.pt

    • (替代) wget https://huggingface.co/datasets/ms903/DDSP-SVC-4.0/resolve/main/pre-trained-model/model_0.pt

    • (替代) wget https://huggingface.co/datasets/ms903/Diff-SVC-refactor-pre-trained-model/blob/main/hubertsoft_fix_pitch_add_vctk_500k/model_0.pt


  • 预训练/nsf_hifigan
    • wget -P pretrain/ https://github.com/openvpi/vocoders/releases/download/nsf-hifigan-v1/nsf_hifigan_20221211.zip
    • unzip -od pretrain/nsf_hifigan pretrain/nsf_hifigan_20221211.zip

数据集准备

将所有准备好的audio.wav文件放入dataset_raw/character

cd so-vits-svc python resample.py --skip_loudnorm python preprocess_flist_config.py --speech_encoder vec768l12 --vol_aug python preprocess_hubert_f0.py --use_diff

编辑配置

该文件位于configs/config.json

log interval : 打印日志的频率eval interval : 保存检查点的频率epochs : 总步数keep ckpts : 保存检查点的数量,0 表示无限制。 half_type : fp32 在我的例子中, batch_size :越小越快(越粗糙),越大越慢(更好)。


建议每个 VRAM 的批量大小:4=6G;6=8G;10=12G;14=16G;20=24G


保留configs/diffusion.yaml的默认值

训练

python cluster/train_cluster.py --gpu python train_index.py -c configs/config.json python train.py -c configs/config.json -m 44k python train_diff.py -c configs/diffusion.yaml


关于训练步骤:

使用train.py训练主模型;一般情况下20k-30k就可以了,50k以上就足够了。这可能需要几天时间,具体取决于 GPU 速度。


请随意通过ctrl+c停止它,并且随时重新运行python train.py -c configs/config.json -m 44k来继续训练。


使用train_diff.py训练扩散模型;训练步数建议为主模型的1/3。


注意过度训练。使用tensorboard --logdir=./logs/44k监视图以查看其是否变平。


如有必要,将learning rate从 0.0001 更改为 0.00005。


完成后,共享/传输这些文件以进行推理。


  • 配置/
    • 配置.json

    • 扩散.yaml


  • 日志/44k
    • 特征和索引.pkl
    • kmeans_10000.pt
    • model_0.pt
    • G_xxxxx.pt

推理

是时候尝试训练好的模型了。我更喜欢 Webui,因为它可以方便地调整参数。


但在启动之前,请在webUI.py中编辑以下行以进行 LAN 访问:

 os.system("start http://localhost:7860") app.launch(server_name="0.0.0.0", server_port=7860)


运行python webUI.py ;然后从网络浏览器访问其ipaddress:7860


WebUI 没有英文本地化,但沉浸式翻译会有所帮助。


大多数参数使用默认值就可以很好地工作。请参阅进行更改。


上传这5个文件:

main model.pt及其config.json


diffusion model.pt及其diffusion.yaml


用于说话的聚类模型kmeans_10000.pt或用于唱歌的特征检索feature_and_index.pkl


F0 predictor仅适用于说话,不适用于唱歌。使用时推荐RMVPE


当使用具有男性声音的模型演唱女性歌曲时, Pitch change非常有用,反之亦然。


Clustering model/feature retrieval mixing ratio是控制基调的方式。使用0.1可以获得最清晰的语音,使用0.9可以获得最接近模型的语气。


shallow diffusion steps应设置在50左右,它可以在30-100步时增强结果。

音频编辑

此过程是可选的。只为创作出更好的歌曲。


我不会详细介绍这一点,因为我使用的音频编辑软件或所谓的 DAW(数字音频工作站)是非免费的。尽管整个行业都是付费和闭源的,但我无意提倡专有软件。


Audacity 支持多轨、效果等等。它也加载一些高级 VST 插件。


找到有关使用 Audacity 掌握歌曲的教程并不难。


通常,母带处理过程应该是混音/平衡、EQ/压缩、混响和成像。工具越先进,过程就越容易。


将来我肯定会花更多的时间在我的母带处理过程中采用 Audacity,我建议每个人都这样做。

so-vits-svc-fork

这是一个具有实时支持的 so-vits-svc分支,并且模型是兼容的。更易于使用,但不支持 Diffusion 模型。对于专用的实时变声,建议使用变声器

安装

conda create -n so-vits-svc-fork python=3.10 pip conda activate so-vits-svc-fork git clone https://github.com/voicepaw/so-vits-svc-fork cd so-vits-svc-fork python -m pip install -U pip setuptools wheel pip install -U torch torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install -U so-vits-svc-fork pip install click sudo apt-get install libportaudio2

准备

将数据集.wav文件放入so-vits-svc-fork/dataset_raw

 svc pre-resample svc pre-config


编辑configs/44k/config.json中的batch_size 。这个叉子的尺寸比原来的叉子大。

训练

svc pre-hubert svc train -t svc train-cluster

推理

将 GUI 与svcg结合使用。这需要本地桌面环境。


或者使用 CLI 与svc vc进行实时处理,并svc infer -m "logs/44k/xxxxx.pth" -c "configs/config.json" raw/xxx.wav进行生成。

DDSP-SVC

DDSP-SVC比 so-vits-svc 需要更少的硬件资源并且运行速度更快。它支持实时模型和扩散模型 (Diff-SVC)。

 conda create -n DDSP-SVC python=3.8 conda activate DDSP-SVC git clone https://github.com/yxlllc/DDSP-SVC cd DDSP-SVC pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt


这两个文件请参考初始化部分

 pretrain/rmvpe/model.pt pretrain/contentvec/checkpoint_best_legacy_500.pt

准备

python draw.py python preprocess.py -c configs/combsub.yaml python preprocess.py -c configs/diffusion-new.yaml


编辑configs/

 batch_size: 32 (16 for diffusion) cache_all_data: false cache_device: 'cuda' cache_fp16: false

训练

conda activate DDSP-SVC python train.py -c configs/combsub.yaml python train_diff.py -c configs/diffusion-new.yaml tensorboard --logdir=exp

推理

建议使用main_diff.py ,因为它同时包含 DDSP 和扩散模型。

python main_diff.py -i "input.wav" -diff "model_xxxxxx.pt" -o "output.wav"


用于语音克隆的实时 GUI:

 python gui_diff.py

Bert-vits2-V2.3

这是一个与上面的完全不同的 TTS 工具。通过使用它,我已经为我的父母制作了几本用我的声音制作的有声读物,他们非常喜欢。


我没有使用原来的,而是使用了v3u的 fork 来简化设置。

初始化

conda create -n bert-vits2 python=3.9 conda activate bert-vits2 git clone https://github.com/v3ucn/Bert-vits2-V2.3.git cd Bert-vits2-V2.3 pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 torchaudio==2.0.2+cu118 --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt


下载预训练模型(包括中文、日文、英文):

 wget -P slm/wavlm-base-plus/ https://huggingface.co/microsoft/wavlm-base-plus/resolve/main/pytorch_model.bin wget -P emotional/clap-htsat-fused/ https://huggingface.co/laion/clap-htsat-fused/resolve/main/pytorch_model.bin wget -P emotional/wav2vec2-large-robust-12-ft-emotion-msp-dim/ https://huggingface.co/audeering/wav2vec2-large-robust-12-ft-emotion-msp-dim/resolve/main/pytorch_model.bin wget -P bert/chinese-roberta-wwm-ext-large/ https://huggingface.co/hfl/chinese-roberta-wwm-ext-large/resolve/main/pytorch_model.bin wget -P bert/bert-base-japanese-v3/ https://huggingface.co/cl-tohoku/bert-base-japanese-v3/resolve/main/pytorch_model.bin wget -P bert/deberta-v3-large/ https://huggingface.co/microsoft/deberta-v3-large/resolve/main/pytorch_model.bin wget -P bert/deberta-v3-large/ https://huggingface.co/microsoft/deberta-v3-large/resolve/main/pytorch_model.generator.bin wget -P bert/deberta-v2-large-japanese/ https://huggingface.co/ku-nlp/deberta-v2-large-japanese/resolve/main/pytorch_model.bin

创建角色模型文件夹mkdir -p Data/xxx/models/


下载基础模型:

 !wget -P Data/xxx/models/ https://huggingface.co/OedoSoldier/Bert-VITS2-2.3/resolve/main/DUR_0.pth !wget -P Data/xxx/models/ https://huggingface.co/OedoSoldier/Bert-VITS2-2.3/resolve/main/D_0.pth !wget -P Data/xxx/models/ https://huggingface.co/OedoSoldier/Bert-VITS2-2.3/resolve/main/G_0.pth !wget -P Data/xxx/models/ https://huggingface.co/OedoSoldier/Bert-VITS2-2.3/resolve/main/WD_0.pth #More options https://openi.pcl.ac.cn/Stardust_minus/Bert-VITS2/modelmanage/model_filelist_tmpl?name=Bert-VITS2_2.3%E5%BA%95%E6%A8%A1 https://huggingface.co/Erythrocyte/bert-vits2_base_model/tree/main https://huggingface.co/OedoSoldier/Bert-VITS2-2.3/tree/main

编辑train_ms.py ,将所有bfloat16替换为float16


编辑webui.py以进行 LAN 访问:

 webbrowser.open(f"start http://localhost:7860") app.launch(server_name="0.0.0.0", server_port=7860)


编辑Data/xxx/config.jsonbatch_sizespk2id

准备

上一节类似的工作流程。


去除噪音和静音,标准化,然后将未切片的WAV文件放入Data/xxx/raw中。


编辑dataset_pathnum_workerskeep_ckptsconfig.yml


运行python3 audio_slicer.py对 WAV 文件进行切片。


通过删除 2 秒以下的小文件来清理数据集 ( Data/xxx/raw )。

转录

安装耳语pip install git+https://github.com/openai/whisper.git


要关闭语言自动检测,请设置为仅英语,并使用large模型;编辑short_audio_transcribe.py如下:

 # set the spoken language to english print('language: en') lang = 'en' options = whisper.DecodingOptions(language='en') result = whisper.decode(model, mel, options) # set to use large model parser.add_argument("--whisper_size", default="large") #Solve error "Given groups=1, weight of size [1280, 128, 3], expected input[1, 80, 3000] to have 128 channels, but got 80 channels instead" while using large model mel = whisper.log_mel_spectrogram(audio,n_mels = 128).to(model.device)

运行python3 short_audio_transcribe.py以开始转录。


对切片数据集重新采样: python3 resample.py --sr 44100 --in_dir ./Data/zizek/raw/ --out_dir ./Data/zizek/wavs/


预处理转录: python3 preprocess_text.py --transcription-path ./Data/zizek/esd.list


生成 BERT 功能配置: python3 bert_gen.py --config-path ./Data/zizek/configs/config.json

训练和推理

运行python3 train_ms.py开始训练


编辑模型路径的config.yml

 model: "models/G_20900.pth"

运行python3 webui.py启动 webui 进行推理

vits-简单-api

vits-simple-api是一个使用经过训练的模型的 Web 前端。我使用它主要是因为它的长文本支持,而原始项目没有。

 git clone https://github.com/Artrajz/vits-simple-api git pull https://github.com/Artrajz/vits-simple-api cd vits-simple-api conda create -n vits-simple-api python=3.10 pip conda activate vits-simple-api && pip install -r requirements.txt

(可选)将预训练的模型文件从Bert-vits2-V2.3/复制到vits-simple-api/bert_vits2/


Bert-vits2-V2.3/Data/xxx/models/G_xxxxx.pthBert-vits2-V2.3/Data/xxx/config.json复制到vits-simple-api/Model/xxx/


根据首选编辑MODEL_LISTDefault parameterconfig.py


编辑Model/xxx/config.json如下:

 "data": { "training_files": "Data/train.list", "validation_files": "Data/val.list", "version": "2.3"

检查/编辑config.yml中的model_list[xxx/G_xxxxx.pth, xxx/config.json]


运行python app.py

调整

SDP Ratio表示音调, Noise表示随机性, Noise_W表示发音, Length表示速度。 emotionstyle是不言自明的

分享模型

在其Hugging Face 仓库中,有很多其他人分享的 VITS 模型。您可以先尝试一下,然后从文件中下载所需的模型。


原神模型因其高质量而被一些内容创作社区广泛使用。它包含数百个字符,但仅支持中文和日文。

另一个仓库中,有很多由中国热门主播和 VTuber 制作的 Bert-vits2 模型。


已经有项目制作这样AI Vtuber。我期待这项技术在不久的将来如何改变这个行业。


https://techshinobi.org/posts/voice-vits/https://techshinobi.org/posts/voice-vits/