paint-brush
Comment cloner la voix avec SoftVC VITS et Bert-VITS2 : une plongée approfondiepar@techshinobi
949 lectures
949 lectures

Comment cloner la voix avec SoftVC VITS et Bert-VITS2 : une plongée approfondie

par Tech Shinobi12m2024/03/06
Read on Terminal Reader

Trop long; Pour lire

Dans le post précédent, j'ai essayé un peu TTS Generation WebUI et je l'ai trouvé intéressant. J'ai donc décidé de former un modèle utilisable avec ma propre voix. Ce projet de clonage vocal explore à la fois SVC pour le changement de voix et VITS pour la synthèse vocale. Il n’existe pas d’outil unique qui fasse toutes les tâches. J'ai testé plusieurs outils pour ce projet. La plupart des bons guides, comme celui-ci, celui-ci et celui-ci, sont en chinois. J'ai donc pensé qu'il serait utile de publier mes notes en anglais.
featured image - Comment cloner la voix avec SoftVC VITS et Bert-VITS2 : une plongée approfondie
Tech Shinobi HackerNoon profile picture
0-item

Table des matières

  • Une plongée approfondie dans le clonage vocal avec SoftVC VITS et Bert-VITS2
    • Préparer l'ensemble de données
      • Extrait d'une chanson
        • Flux de travail UVR
      • Préparation à l'enregistrement vocal
        • Équipement audio de Cheapskate
        • Flux de travail Audacity
      • trancheur audio
        • Ensemble de données de nettoyage
        • Faire correspondre le volume
    • so-vits-svc
      • Configurer l'environnement
      • Initialisation
        • Télécharger des modèles pré-entraînés
        • Préparation de l'ensemble de données
        • Modifier les configurations
      • Entraînement
      • Inférence
      • Édition audio
    • so-vits-svc-fork
      • Installation
      • Préparation
      • Entraînement
      • Inférence
    • DDSP-SVC
      • Préparation
      • Entraînement
      • Inférence
    • Bert-vits2-V2.3
      • Initialisation
      • Préparation
        • Transcription
      • Formation et inférence
    • vits-simple-api
      • Ajustements
      • Partager des modèles


Dans le post précédent , j'ai essayé un peu TTS Generation WebUI et je l'ai trouvé intéressant. J'ai donc décidé de former un modèle utilisable avec ma propre voix.


Ce projet de clonage vocal explore à la fois SVC pour le changement de voix et VITS pour la synthèse vocale. Il n’existe pas d’outil unique qui fasse toutes les tâches.


J'ai testé plusieurs outils pour ce projet. La plupart des bons guides, comme ceci , ceci et ceci , sont en chinois. J'ai donc pensé qu'il serait utile de publier mes notes en anglais.


Bien que so-vits-svc soit archivé depuis quelques mois, probablement à cause de l'oppression, il reste l'outil permettant d'obtenir le meilleur résultat.


D'autres outils associés tels que so-vits-svc-fork , so-vits-svc-5.0 , DDSP-SVC et RVC offrent soit une optimisation plus rapide/litre, plus de fonctionnalités ou de meilleures interfaces.


Mais avec suffisamment de temps et de ressources, aucune de ces alternatives ne peut rivaliser avec le résultat supérieur généré par le so-vits-svc original.


Pour TTS, un nouvel outil appelé Bert-VITS2 fonctionne à merveille et a déjà mûri avec sa version finale le mois dernier. Il existe des cas d’utilisation très différents, par exemple la création de contenu audio.

Préparer l'ensemble de données

Les fichiers audio de l'ensemble de données doivent être au format WAV, 44 100 Hz, 16 bits, mono, idéalement 1 à 2 heures.

Extrait d'une chanson

Ultimate Vocal Remover est l'outil le plus simple pour ce travail. Il y a un fil qui explique tout en détail.

Flux de travail UVR

  • Supprimer et extraire Instrumental
    • Modèle : VR-UVR (4_HP-Vocal-UVR)

    • Paramètres : 512 - 10 - GPU

    • Sortie Voix instrumentale et impure


  • Supprimez et extrayez les voix de fond.
    • Modèle : VR - UVR (5_HP-Karaoke-UVR)

    • Paramètres : 512 - 10 - GPU

    • Sortie vocale de fond et voix principale impure


  • Supprimez la réverbération et le bruit.
    • Modèle : VR - UVR-DeEcho-DeReverb & UVR-DeNoise

    • Paramètres : 512 - 10 - GPU - Aucun autre uniquement

    • Sortie vocale principale claire


  • (Facultatif) Utilisation de RipX (non gratuit) pour effectuer un nettoyage fin manuel.

Préparation à l'enregistrement vocal

Il est préférable d'enregistrer dans une pièce traitée avec un microphone à condensateur, sinon, utilisez un microphone directionnel ou dynamique pour réduire le bruit.

Équipement audio de Cheapskate

La toute première fois que je me suis lancé dans la musique, c'était au lycée, avec le Sennheiser MX500 bleu et le Koss Porta Pro. Je me souviens encore de la première fois que j'enregistrais une chanson sur un Sony VAIO avec Cool Edit Pro.


De nos jours, je résiste encore à dépenser beaucoup d’argent en matériel audio en tant qu’amateur car c’est littéralement un trou noir qui aspire de l’argent.


Néanmoins, j’apprécie vraiment la fiabilité de ces équipements de production bon marché.


La partie centrale de ma configuration est un Behringer UCA202, et il est parfait pour mes cas d'utilisation. Je l'ai acheté 10$ lors d'une baisse de prix.


Il s'agit d'une soi-disant « interface audio », mais essentiellement d'une simple carte son dotée de plusieurs ports. J'ai utilisé des câbles RCA vers TRS 3,5 mm pour mes écouteurs, un K240 semi-ouvert pour une sortie régulière et un HD669/MDR7506 fermé pour la sortie moniteur.


Les trois écouteurs mentionnés coûtent moins de 100 $ pour le prix normal. Et il existe des clones de Samson, Tascam, Knox Gear et bien d'autres pour moins de 50 $.


Pour le périphérique d'entrée, j'utilise un microphone dynamique pour le bien de mes bruits environnementaux. Il s'agit d'une copie SM58 (Pyle) + un enregistreur Tascam DR-05 (en guise d'amplificateur). D'autres clones comme SL84c ou wm58 le feraient aussi.


J'utilise un câble XLR vers TRS 3,5 mm pour connecter le microphone à l'entrée MIC/externe de l'enregistreur, puis j'utilise un câble AUX pour connecter entre la sortie ligne de l'enregistreur et l'entrée de l'UCA202.


Il n'est pas recommandé d'acheter une « interface audio » et un amplificateur dédié pour reproduire ma configuration. Une carte son USB c-media à 10 $ devrait suffire. Le modèle Syba que je possédais est capable de « pré-amplifier » directement des microphones dynamiques et même certains microphones à alimentation fantôme bas de gamme.


La configuration peut être extrêmement bon marché (40 à 60 $), mais avec l'UCA202 et le DR-05, le son est beaucoup plus propre. Et j’aime vraiment les commandes physiques, la polyvalence et la portabilité de mon bon vieux enregistreur numérique.

Flux de travail Audacity

Même si lorsque j'étais payé en tant que designer, j'étais plutôt satisfait d'Audition. Mais pour un usage personnel sur un projet amusant, Audacity est le moyen d'éviter le mal chaotique d'Adobe.

trancheur audio

Utilisez audio-slicer ou audio-slicer (gui) pour découper le fichier audio en petits morceaux pour une utilisation ultérieure.

Le paramètre par défaut fonctionne très bien.

Ensemble de données de nettoyage

Supprimez ceux qui sont très courts et retranchez ceux qui durent encore plus de 10 secondes.


Dans le cas d'un ensemble de données volumineux, supprimez tout ce qui dure moins de 4 secondes. Dans le cas d'un petit ensemble de données, supprimez-les seulement en moins de 2 secondes.


Si nécessaire, effectuez une inspection manuelle pour chaque fichier.

Faire correspondre le volume

Utilisez à nouveau Audacity avec la normalisation du volume ; 0 dB devrait le faire.

so-vits-svc

Configurer l'environnement

L'environnement virtuel est essentiel pour exécuter plusieurs outils Python dans un seul système. J'avais l'habitude d'utiliser des machines virtuelles et Docker, mais maintenant, j'ai découvert qu'anaconda est bien plus rapide et plus pratique que les autres.


Créez un nouvel environnement pour so-vits-svc et activez-le.

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


Ensuite, installez les exigences.

 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

Initialisation

Télécharger des modèles pré-entraînés

  • pré-entraînement
    • 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


  • journaux/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


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

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

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


  • pré-train/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

Préparation de l'ensemble de données

Mettez tous les fichiers audio.wav préparés dans 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

Modifier les configurations

Le fichier se trouve dans configs/config.json

log interval : la fréquence d'impression du journal eval interval : la fréquence de sauvegarde des points de contrôle epochs : le nombre total d'étapes keep ckpts : nombre de points de contrôle enregistrés, 0 pour illimité. half_type : fp32 Dans mon cas, batch_size : plus petit est rapide (plus rugueux), plus grand est lent (mieux).


Taille_de lot recommandée par VRAM : 4=6G;6=8G;10=12G;14=16G;20=24G


Conserver la valeur par défaut pour configs/diffusion.yaml

Entraînement

 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


Sur les étapes de formation :

Utilisez train.py pour entraîner le modèle principal ; généralement, 20 000 à 30 000 seraient utilisables, et 50 000 et plus seraient suffisants. Cela peut prendre quelques jours en fonction de la vitesse du GPU.


N'hésitez pas à l'arrêter par ctrl+c , et l'entraînement se poursuivra en réexécutant python train.py -c configs/config.json -m 44k à tout moment.


Utilisez train_diff.py pour entraîner le modèle de diffusion ; Les étapes de formation sont recommandées à 1/3 du modèle principal.


Soyez conscient du surentraînement. Utilisez tensorboard --logdir=./logs/44k pour surveiller les tracés et voir s'ils deviennent plats.


Modifiez le learning rate de 0,0001 à 0,00005 si nécessaire.


Une fois terminé, partagez/transportez ces fichiers pour inférence.


  • configuration/
    • config.json

    • diffusion.yaml


  • journaux/44k
    • feature_and_index.pkl
    • kmeans_10000.pt
    • modèle_0.pt
    • G_xxxxx.pt

Inférence

Il est temps d'essayer le modèle entraîné. Je préférerais Webui pour la commodité de modifier les paramètres.


Mais avant de le lancer, modifiez les lignes suivantes dans webUI.py pour l'accès au réseau local :

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


Exécutez python webUI.py ; puis accédez à son ipaddress:7860 depuis un navigateur Web.


Le webui n'a pas de localisation en anglais, mais une traduction immersive serait utile.


La plupart des paramètres fonctionneraient bien avec la valeur par défaut. Référez-vous à ceci et ceci pour apporter des modifications.


Téléchargez ces 5 fichiers :

main model.pt et son config.json


diffusion model.pt et sa diffusion.yaml


Soit le modèle de cluster kmeans_10000.pt pour parler, soit la récupération de fonctionnalités feature_and_index.pkl pour le chant.


F0 predictor sert uniquement à parler, pas à chanter. Recommander RMVPE lors de l'utilisation.


Pitch change est utile lorsque vous chantez une chanson féminine en utilisant un modèle avec une voix masculine, ou vice versa.


Clustering model/feature retrieval mixing ratio est le moyen de contrôler la tonalité. Utilisez 0.1 pour obtenir le discours le plus clair et utilisez 0.9 pour obtenir le ton le plus proche du modèle.


shallow diffusion steps doivent être réglées autour de 50 , cela améliore le résultat entre 30-100 étapes.

Édition audio

Cette procédure est facultative. Juste pour produire une meilleure chanson.


Je n'entrerai pas dans les détails à ce sujet puisque le logiciel d'édition audio, ou ce qu'on appelle DAW (digital audio workstation), que j'utilise n'est pas libre. Je n’ai pas l’intention de prôner les logiciels propriétaires, même si l’ensemble du secteur est payant et fermé.


Audacity prend en charge le multipiste, les effets et bien plus encore. Il charge également certains plugins VST avancés.


Il n'est pas difficile de trouver des tutoriels sur la maîtrise de chansons avec Audacity.


En règle générale, le processus de mastering doit comprendre le mixage/équilibrage, l'égalisation/compression, la réverbération et l'imagerie. Plus l’outil est avancé, plus le processus sera simple.


Je consacrerai certainement plus de temps à l'adoption d'Audacity pour mon processus de mastering à l'avenir, et je recommande à tout le monde de le faire.

so-vits-svc-fork

Il s'agit d'un fork so-vits-svc avec support en temps réel, et les modèles sont compatibles. Plus facile à utiliser mais ne prend pas en charge le modèle de diffusion. Pour un changement de voix dédié en temps réel, un changeur de voix est recommandé.

Installation

 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

Préparation

Placez les fichiers .wav de l'ensemble de données dans so-vits-svc-fork/dataset_raw

 svc pre-resample svc pre-config


Modifiez un batch_size dans configs/44k/config.json . Cette fourchette est d'une taille plus grande que l'originale.

Entraînement

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

Inférence

Utilisez l'interface graphique avec svcg . Cela nécessite un environnement de bureau local.


Ou utilisez CLI avec svc vc pour le temps réel et svc infer -m "logs/44k/xxxxx.pth" -c "configs/config.json" raw/xxx.wav pour la génération.

DDSP-SVC

DDSP-SVC nécessite moins de ressources matérielles et s'exécute plus rapidement que so-vits-svc. Il prend en charge les modèles en temps réel et en diffusion (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


Reportez-vous à la section Initialisation pour les deux fichiers :

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

Préparation

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


Modifier configs/

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

Entraînement

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

Inférence

Il est recommandé d'utiliser main_diff.py car il inclut à la fois le DDSP et le modèle de diffusion.

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


Interface graphique en temps réel pour le clonage vocal :

 python gui_diff.py

Bert-vits2-V2.3

Il s'agit d'un outil TTS complètement différent de tout ce qui précède. En l'utilisant, j'ai déjà créé plusieurs livres audio avec ma voix pour mes parents, et ils l'apprécient vraiment.


Au lieu d'utiliser l' original , j'ai utilisé le fork de v3u pour une configuration plus facile.

Initialisation

 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


Téléchargez des modèles pré-entraînés (comprend le chinois, le japonais et l'anglais) :

 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

Créez un dossier de modèles de personnages mkdir -p Data/xxx/models/


Téléchargez les modèles de base :

 !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

Modifiez train_ms.py en remplaçant tous bfloat16 par float16


Modifiez webui.py pour l'accès au réseau local :

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


Modifiez Data/xxx/config.json pour batch_size et spk2id

Préparation

Flux de travail similaire à celui de la section précédente .


Supprimez le bruit et le silence, normalisez, puis placez le fichier WAV non découpé dans Data/xxx/raw .


Modifiez config.yml pour dataset_path , num_workers et keep_ckpts .


Exécutez python3 audio_slicer.py pour découper le fichier WAV.


Nettoyez l'ensemble de données ( Data/xxx/raw ) en supprimant les petits fichiers de moins de 2 secondes.

Transcription

Installez Whisper pip install git+https://github.com/openai/whisper.git


Pour désactiver la détection automatique de la langue, réglez-la sur l'anglais uniquement et utilisez large modèle ; modifiez short_audio_transcribe.py comme ci-dessous :

 # 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)

Exécutez python3 short_audio_transcribe.py pour démarrer la transcription.


Ré-échantillonnez l'ensemble de données découpé : python3 resample.py --sr 44100 --in_dir ./Data/zizek/raw/ --out_dir ./Data/zizek/wavs/


Transcription de prétraitement : python3 preprocess_text.py --transcription-path ./Data/zizek/esd.list


Générer la configuration des fonctionnalités BERT : python3 bert_gen.py --config-path ./Data/zizek/configs/config.json

Formation et inférence

Exécutez python3 train_ms.py pour démarrer la formation


Modifiez config.yml pour le chemin du modèle :

 model: "models/G_20900.pth"

Exécutez python3 webui.py pour démarrer webui pour l'inférence

vits-simple-api

vits-simple-api est une interface Web permettant d'utiliser des modèles entraînés. Je l'utilise principalement pour son support de texte long que le projet original n'a pas.

 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

(Facultatif) Copiez les fichiers de modèle pré-entraînés de Bert-vits2-V2.3/ vers vits-simple-api/bert_vits2/


Copiez Bert-vits2-V2.3/Data/xxx/models/G_xxxxx.pth et Bert-vits2-V2.3/Data/xxx/config.json dans vits-simple-api/Model/xxx/


Modifiez config.py pour MODEL_LIST et Default parameter selon vos préférences


Modifiez Model/xxx/config.json comme ci-dessous :

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

Vérifiez/modifiez model_list dans config.yml comme [xxx/G_xxxxx.pth, xxx/config.json]


Exécutez python app.py

Ajustements

SDP Ratio pour la tonalité, Noise pour le caractère aléatoire, Noise_W pour la prononciation et Length pour la vitesse. emotion et style s'expliquent d'eux-mêmes

Partager des modèles

Dans son dépôt Hugging Face , il existe de nombreux modèles VITS partagés par d'autres. Vous pouvez d'abord l'essayer, puis télécharger les modèles souhaités à partir de Fichiers .


Le modèle Genshin est largement utilisé dans certaines communautés de création de contenu en raison de sa haute qualité. Il contient des centaines de caractères, bien que seuls le chinois et le japonais soient pris en charge.

Dans un autre dépôt , il existe de nombreux modèles Bert-vits2 fabriqués à partir de streamers et de VTubers chinois populaires.


Il existe déjà des projets créant des Vtubers IA comme celui-ci et celui-ci . J'ai hâte de voir comment cette technologie peut changer l'industrie dans un avenir proche.


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