paint-brush
Como clonar voz com SoftVC VITS e Bert-VITS2: um mergulho profundopor@techshinobi
970 leituras
970 leituras

Como clonar voz com SoftVC VITS e Bert-VITS2: um mergulho profundo

por Tech Shinobi12m2024/03/06
Read on Terminal Reader

Muito longo; Para ler

No post anterior, experimentei um pouco do TTS Generation WebUI e achei interessante. Então, decidi treinar um modelo utilizável com minha própria voz. Este projeto de clonagem de voz explora SVC para alteração de voz e VITS para conversão de texto em fala. Não existe uma ferramenta que faça todas as tarefas. Testei várias ferramentas para este projeto. Muitos dos bons guias, como este, este e este, estão em chinês. Então, pensei que seria útil postar minhas anotações em inglês.
featured image - Como clonar voz com SoftVC VITS e Bert-VITS2: um mergulho profundo
Tech Shinobi HackerNoon profile picture
0-item

Índice

  • Um mergulho profundo na clonagem de voz com SoftVC VITS e Bert-VITS2
    • Preparar conjunto de dados
      • Extrair de uma música
        • Fluxos de trabalho de UVR
      • Preparação para gravação vocal
        • Equipamento de áudio do Cheapskate
        • Fluxos de trabalho do Audacity
      • fatiador de áudio
        • Limpeza do conjunto de dados
        • Volume correspondente
    • so-vits-svc
      • Configurar ambiente
      • Inicialização
        • Baixe modelos pré-treinados
        • Preparação do conjunto de dados
        • Editar configurações
      • Treinamento
      • Inferência
      • Edição de áudio
    • so-vits-svc-fork
      • Instalação
      • Preparação
      • Treinamento
      • Inferência
    • DDSP-SVC
      • Preparação
      • Treinamento
      • Inferência
    • Bert-vits2-V2.3
      • Inicialização
      • Preparação
        • Transcrição
      • Treinamento e Inferência
    • vits-simple-api
      • Ajustes
      • Compartilhar modelos


No post anterior , experimentei um pouco do TTS Generation WebUI e achei interessante. Então, decidi treinar um modelo utilizável com minha própria voz.


Este projeto de clonagem de voz explora SVC para mudança de voz e VITS para conversão de texto em fala. Não existe uma ferramenta que faça todas as tarefas.


Testei várias ferramentas para este projeto. Muitos dos bons guias, como este , este e este , estão em chinês. Então, pensei que seria útil postar minhas anotações em inglês.


Embora so-vits-svc esteja arquivado há alguns meses, provavelmente devido à opressão, ainda é a ferramenta para obter o melhor resultado.


Outras ferramentas relacionadas, como so-vits-svc-fork , so-vits-svc-5.0 , DDSP-SVC e RVC fornecem otimização mais rápida/litro, mais recursos ou interfaces melhores.


Mas com tempo e recursos suficientes, nenhuma dessas alternativas pode competir com o resultado superior gerado pelo so-vits-svc original.


Para o TTS, uma nova ferramenta chamada Bert-VITS2 funciona de maneira fantástica e já amadureceu com seu lançamento final no mês passado. Possui alguns casos de uso muito diferentes, por exemplo, criação de conteúdo de áudio.

Preparar conjunto de dados

Os arquivos de áudio do conjunto de dados devem estar no formato WAV, 44100 Hz, 16 bits, mono, idealmente de 1 a 2 horas.

Extrair de uma música

Ultimate Vocal Remover é a ferramenta mais fácil para este trabalho. Existe um tópico que explica tudo detalhadamente.

Fluxos de trabalho de UVR

  • Remova e extraia Instrumental
    • Modelo: VR - UVR (4_HP-Vocal-UVR)

    • Configurações: 512 - 10 - GPU

    • Saída instrumental e vocal impuro


  • Remova e extraia vocais de fundo.
    • Modelo: VR - UVR (5_HP-Karaokê-UVR)

    • Configurações: 512 - 10 - GPU

    • Saída de vocal de fundo e vocal principal impuro


  • Remova reverberação e ruído.
    • Modelo: VR - UVR-DeEcho-DeReverb e UVR-DeNoise

    • Configurações: 512 - 10 - GPU - Nenhum outro somente

    • Saída vocal principal limpo


  • (Opcional) Usando RipX (não gratuito) para realizar uma limpeza manual.

Preparação para Gravação Vocal

É melhor gravar em uma sala tratada com microfone condensador; caso contrário, use um microfone direcional ou dinâmico para reduzir o ruído.

Equipamento de áudio do Cheapskate

A primeira vez que me interessei pela música foi no ensino médio, com o Sennheiser MX500 azul e o Koss Porta Pro. Ainda me lembro da primeira vez que gravei uma música em um Sony VAIO com Cool Edit Pro.


Hoje em dia, ainda resisto a gastar muito dinheiro em hardware de áudio como amador, porque é literalmente um buraco negro sugador de dinheiro.


No entanto, aprecio muito a fiabilidade desses equipamentos de produção baratos.


A parte principal da minha configuração é um Behringer UCA202 e é perfeito para meus casos de uso. Comprei por US $ 10 durante uma queda de preço.


É a chamada “Interface de Áudio”, mas basicamente apenas uma placa de som com múltiplas portas. Usei cabos RCA para TRS de 3,5 mm para meus fones de ouvido, um K240s semiaberto para saída regular e um HD669/MDR7506 fechado para saída de monitor.


Todos os três fones de ouvido mencionados custam menos de US$ 100 pelo preço normal. E existem clones de Samson, Tascam, Knox Gear e outros por menos de US$ 50.


Para o dispositivo de entrada, estou usando um microfone dinâmico para evitar ruídos ambientais. É uma cópia SM58 (Pyle) + um gravador Tascam DR-05 (como amplificador). Outros clones como SL84c ou wm58 também fariam isso.


Eu uso um cabo XLR para TRS de 3,5 mm para conectar o microfone à entrada MIC/Externa do gravador e, em seguida, uso um cabo AUX para conectar entre a saída de linha do gravador e a entrada do UCA202.


Não é recomendado comprar uma “interface de áudio” e um amplificador dedicado para replicar minha configuração. Uma placa de som USB c-media de US$ 10 deve ser boa o suficiente. O modelo Syba que possuo é capaz de “pré-amplificar” microfones dinâmicos diretamente e até mesmo alguns microfones com alimentação fantasma de baixo custo.


A configuração pode ser extremamente barata (US$ 40~60), mas com UCA202 e DR-05, o som é muito mais limpo. E eu realmente gosto dos controles físicos, versatilidade e portabilidade do meu velho e bom gravador digital.

Fluxos de trabalho do Audacity

Embora quando eu era pago como designer, fiquei muito feliz com o Audition. Mas para uso pessoal em um projeto divertido, o Audacity é a maneira de evitar o mal caótico da Adobe.

fatiador de áudio

Use audio-slicer ou audio-slicer (gui) para cortar o arquivo de áudio em pequenos pedaços para uso posterior.

A configuração padrão funciona muito bem.

Limpeza do conjunto de dados

Remova os muito curtos e corte novamente os que ainda duram mais de 10 segundos.


No caso de um conjunto de dados grande, remova todos os que tenham menos de 4 segundos. No caso de um conjunto de dados pequeno, remova-os apenas em menos de 2 segundos.


Se necessário, realize uma inspeção manual para cada arquivo.

Volume da correspondência

Use o Audacity novamente com Loudness Normalization ; 0db deve fazer isso.

so-vits-svc

Configure o ambiente

O ambiente virtual é essencial para executar várias ferramentas Python dentro de um sistema. Eu costumava usar VMs e Docker, mas agora descobri que o anaconda é muito mais rápido e prático que os outros.


Crie um novo ambiente para so-vits-svc e ative-o.

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


Em seguida, instale os requisitos.

 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

Inicialização

Baixe modelos pré-treinados

  • pré-treinar
    • 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


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


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

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

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


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

Preparação do conjunto de dados

Coloque todos os arquivos audio.wav preparados em 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

Editar configurações

O arquivo está localizado em configs/config.json

log interval : a frequência de impressão eval interval do log: a frequência de salvamento de pontos de verificação epochs : total de etapas keep ckpts : número de pontos de verificação salvos, 0 para ilimitado. half_type : fp32 No meu caso, batch_size : quanto menor, mais rápido (mais áspero), quanto maior, mais lento (melhor).


Tamanho de lote recomendado por VRAM: 4 = 6G;6 = 8G;10 = 12G;14 = 16G;20 = 24G


Mantenha o padrão para configs/diffusion.yaml

Treinamento

 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


Nas etapas de treinamento:

Use train.py para treinar o modelo principal; normalmente, 20k-30k seriam utilizáveis, e 50k ou mais seriam bons o suficiente. Isso pode levar alguns dias dependendo da velocidade da GPU.


Sinta-se à vontade para interrompê-lo com ctrl+c e o treinamento continuará executando novamente python train.py -c configs/config.json -m 44k a qualquer momento.


Use train_diff.py para treinar o modelo de difusão; as etapas de treinamento são recomendadas em 1/3 do modelo principal.


Esteja ciente do excesso de treinamento. Use tensorboard --logdir=./logs/44k para monitorar os gráficos e ver se eles ficam planos.


Altere a learning rate de 0,0001 para 0,00005, se necessário.


Quando terminar, compartilhe/transporte esses arquivos para inferência.


  • configuração/
    • config.json

    • difusão.yaml


  • registros/44k
    • feature_and_index.pkl
    • kmeans_10000.pt
    • modelo_0.pt
    • G_xxxx.pt

Inferência

É hora de experimentar o modelo treinado. Eu preferiria o Webui pela conveniência de ajustar os parâmetros.


Mas antes de iniciá-lo, edite as seguintes linhas em webUI.py para acesso LAN:

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


Execute python webUI.py ; em seguida, acesse seu ipaddress:7860 em um navegador da web.


O webui não tem localização em inglês, mas a Tradução Imersiva seria útil.


A maioria dos parâmetros funcionaria bem com o valor padrão. Consulte this e this para fazer alterações.


Faça upload destes 5 arquivos:

main model.pt e seu config.json


diffusion model.pt e seu diffusion.yaml


Modelo de cluster kmeans_10000.pt para falar ou recuperação de recursos feature_and_index.pkl para cantar.


F0 predictor serve apenas para falar, não para cantar. Recomende RMVPE ao usar.


Pitch change é útil ao cantar uma música feminina usando um modelo com voz masculina ou vice-versa.


Clustering model/feature retrieval mixing ratio é a forma de controlar o tom. Use 0.1 para obter a fala mais clara e use 0.9 para obter o tom mais próximo do modelo.


shallow diffusion steps devem ser definidas em torno de 50 , o que melhora o resultado em 30-100 etapas.

Edição de áudio

Este procedimento é opcional. Apenas para a produção de uma música melhor.


Não entrarei em detalhes sobre isso, pois o software de edição de áudio, ou o chamado DAW (estação de trabalho de áudio digital), que estou usando não é gratuito. Não tenho intenção de defender software proprietário, embora toda a indústria tenha acesso pago e código fechado.


O Audacity oferece suporte a multitrack, efeitos e muito mais. Ele também carrega alguns plug-ins VST avançados.


Não é difícil encontrar tutoriais sobre como masterizar músicas com o Audacity.


Normalmente, o processo de masterização deve ser mixagem/balanceamento, equalização/compressão, reverberação e imagem. Quanto mais avançada for a ferramenta, mais fácil será o processo.


Definitivamente gastarei mais tempo adotando o Audacity para meu processo de masterização no futuro e recomendo a todos que façam isso.

so-vits-svc-fork

Este é um fork so-vits-svc com suporte em tempo real e os modelos são compatíveis. Mais fácil de usar, mas não suporta o modelo Diffusion. Para mudança de voz dedicada em tempo real, é recomendado um trocador de voz .

Instalação

 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

Preparação

Coloque os arquivos .wav do conjunto de dados em so-vits-svc-fork/dataset_raw

 svc pre-resample svc pre-config


Edite um batch_size em configs/44k/config.json . Este garfo é um tamanho maior que o original.

Treinamento

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

Inferência

Use GUI com svcg . Isso requer um ambiente de área de trabalho local.


Ou use CLI com svc vc para tempo real e svc infer -m "logs/44k/xxxxx.pth" -c "configs/config.json" raw/xxx.wav para geração.

DDSP-SVC

O DDSP-SVC requer menos recursos de hardware e é executado mais rapidamente que o so-vits-svc. Ele suporta modelos em tempo real e de difusão (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


Consulte a seção Inicialização para os dois arquivos:

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

Preparação

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


Editar configs/

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

Treinamento

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

Inferência

É recomendado usar main_diff.py , pois inclui DDSP e modelo de difusão.

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


GUI em tempo real para clonagem de voz:

 python gui_diff.py

Bert-vits2-V2.3

Esta é uma ferramenta TTS completamente diferente de tudo acima. Com ele, já criei vários audiolivros com minha voz para meus pais, e eles gostaram muito.


Em vez de usar o original , usei o fork da v3u para uma configuração mais fácil.

Inicialização

 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


Baixe modelos pré-treinados (inclui chinês, japonês e inglês):

 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

Crie uma pasta de modelo de personagem mkdir -p Data/xxx/models/


Baixe modelos básicos:

 !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

Edite train_ms.py substituindo todos bfloat16 por float16


Edite webui.py para acesso LAN:

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


Edite Data/xxx/config.json para batch_size e spk2id

Preparação

Fluxo de trabalho semelhante ao da seção anterior .


Remova o ruído e o silêncio, a normalização e, em seguida, coloque o arquivo WAV não fatiado em Data/xxx/raw .


Edite config.yml para dataset_path , num_workers e keep_ckpts .


Execute python3 audio_slicer.py para fatiar o arquivo WAV.


Limpe o conjunto de dados ( Data/xxx/raw ) removendo arquivos pequenos com menos de 2 segundos.

Transcrição

Instale o sussurro pip install git+https://github.com/openai/whisper.git


Para desativar a detecção automática de idioma, configure-a apenas para inglês e use um modelo large ; edite short_audio_transcribe.py conforme abaixo:

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

Execute python3 short_audio_transcribe.py para iniciar a transcrição.


Faça uma nova amostra do conjunto de dados fatiado: python3 resample.py --sr 44100 --in_dir ./Data/zizek/raw/ --out_dir ./Data/zizek/wavs/


Transcrição de pré-processamento: python3 preprocess_text.py --transcription-path ./Data/zizek/esd.list


Gere a configuração do recurso BERT: python3 bert_gen.py --config-path ./Data/zizek/configs/config.json

Treinamento e Inferência

Execute python3 train_ms.py para iniciar o treinamento


Edite config.yml para o caminho do modelo:

 model: "models/G_20900.pth"

Execute python3 webui.py para iniciar o webui para inferência

vits-simple-api

vits-simple-api é uma interface web para usar modelos treinados. Eu uso isso principalmente pelo suporte a textos longos que o projeto original não possui.

 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

(Opcional) Copie os arquivos de modelo pré-treinados de Bert-vits2-V2.3/ para vits-simple-api/bert_vits2/


Copie Bert-vits2-V2.3/Data/xxx/models/G_xxxxx.pth e Bert-vits2-V2.3/Data/xxx/config.json para vits-simple-api/Model/xxx/


Edite config.py para MODEL_LIST e Default parameter conforme preferido


Edite Model/xxx/config.json conforme abaixo:

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

Verifique/edite model_list em config.yml como [xxx/G_xxxxx.pth, xxx/config.json]


Execute python app.py

Ajustes

SDP Ratio para tom, Noise para aleatoriedade, Noise_W para pronúncia e Length para velocidade. emotion e style são autoexplicativos

Compartilhar modelos

Em seu repositório Hugging Face , há muitos modelos VITS compartilhados por outras pessoas. Você pode experimentá-lo primeiro e depois baixar os modelos desejados em Arquivos .


O modelo Genshin é amplamente utilizado em algumas comunidades de criação de conteúdo devido à sua alta qualidade. Ele contém centenas de caracteres, embora apenas chinês e japonês sejam suportados.

Em outro repositório , existem muitos modelos Bert-vits2 feitos de streamers e VTubers chineses populares.


Já existem projetos fazendo AI Vtubers como este e este . Estou ansioso para ver como essa tecnologia pode mudar a indústria em um futuro próximo.


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