paint-brush
Cómo clonar por voz con SoftVC VITS y Bert-VITS2: una inmersión profundaby@techshinobi
765
765

Cómo clonar por voz con SoftVC VITS y Bert-VITS2: una inmersión profunda

Tech Shinobi12m2024/03/06
Read on Terminal Reader

En la publicación anterior, probé un poco la WebUI de generación TTS y la encontré interesante. Entonces decidí entrenar un modelo utilizable con mi propia voz. Este proyecto de clonación de voz explora tanto SVC para cambio de voz como VITS para texto a voz. No existe una única herramienta que haga todos los trabajos. He probado varias herramientas para este proyecto. Muchas de las buenas guías, como ésta, ésta y ésta, están en chino. Entonces pensé que sería útil publicar mis notas en inglés.
featured image - Cómo clonar por voz con SoftVC VITS y Bert-VITS2: una inmersión profunda
Tech Shinobi HackerNoon profile picture
0-item

Tabla de contenido

  • Una inmersión profunda en la clonación de voz con SoftVC VITS y Bert-VITS2
    • Preparar conjunto de datos
      • Extracto de una canción
        • Flujos de trabajo de UVR
      • Preparación para la grabación vocal.
        • Equipo de audio de tacaño
        • Flujos de trabajo de audacia
      • cortadora de audio
        • Conjunto de datos de limpieza
        • Emparejar el volumen
    • so-vits-svc
      • Configurar el entorno
      • Inicialización
        • Descargar modelos previamente entrenados
        • Preparación del conjunto de datos
        • Editar configuraciones
      • Capacitación
      • Inferencia
      • Edición de audio
    • so-vits-svc-tenedor
      • Instalación
      • Preparación
      • Capacitación
      • Inferencia
    • DDSP-SVC
      • Preparación
      • Capacitación
      • Inferencia
    • Bert-vits2-V2.3
      • Inicialización
      • Preparación
        • Transcripción
      • Entrenamiento e inferencia
    • vits-simple-api
      • Ajustes
      • Compartir modelos


En la publicación anterior , probé un poco de TTS Generation WebUI y lo encontré interesante. Entonces decidí entrenar un modelo utilizable con mi propia voz.


Este proyecto de clonación de voz explora tanto SVC para cambio de voz como VITS para texto a voz. No existe una única herramienta que haga todos los trabajos.


He probado varias herramientas para este proyecto. Muchas de las buenas guías, como ésta , ésta y ésta , están en chino. Entonces pensé que sería útil publicar mis notas en inglés.


Aunque so-vits-svc lleva unos meses archivado, probablemente debido a la opresión, sigue siendo la herramienta para obtener el mejor resultado.


Otras herramientas relacionadas, como so-vits-svc-fork , so-vits-svc-5.0 , DDSP-SVC y RVC , proporcionan una optimización más rápida por litro, más funciones o mejores interfaces.


Pero con suficiente tiempo y recursos, ninguna de estas alternativas puede competir con el resultado superior generado por el so-vits-svc original.


Para TTS, una nueva herramienta llamada Bert-VITS2 funciona fantásticamente y ya ha madurado con su lanzamiento final el mes pasado. Tiene algunos casos de uso muy diferentes, por ejemplo, la creación de contenido de audio.

Preparar conjunto de datos

Los archivos de audio del conjunto de datos deben estar en formato WAV, 44100 Hz, 16 bits, mono, idealmente entre 1 y 2 horas.

Extracto de una canción

Ultimate Vocal Remover es la herramienta más sencilla para este trabajo. Hay un hilo que explica todo detalladamente.

Flujos de trabajo de UVR

  • Quitar y extraer instrumental
    • Modelo: VR - UVR(4_HP-Vocal-UVR)

    • Configuraciones: 512 - 10 - GPU

    • Salida instrumental y vocal sucia.


  • Elimina y extrae voces de fondo.
    • Modelo: VR - UVR(5_HP-Karaoke-UVR)

    • Configuraciones: 512 - 10 - GPU

    • Salida de voz de fondo y voz principal sucia.


  • Elimina la reverberación y el ruido.
    • Modelo: VR - UVR-DeEcho-DeReverb y UVR-DeNoise

    • Configuraciones: 512 - 10 - GPU - No solo otros

    • Salida de voz principal limpia


  • (Opcional) Uso de RipX (no gratuito) para realizar una limpieza fina manual.

Preparación para la grabación vocal

Es mejor grabar en una habitación tratada con un micrófono de condensador; de lo contrario, utilice un micrófono direccional o dinámico para reducir el ruido.

Equipo de audio de tacaño

La primera vez que me metí en la música fue durante la escuela secundaria, con el Sennheiser MX500 azul y el Koss Porta Pro. Todavía recuerdo la primera vez que estaba grabando una canción en un Sony VAIO con Cool Edit Pro.


Hoy en día, todavía me resisto a gastar mucho dinero en hardware de audio como aficionado porque es literalmente un agujero negro que chupa dinero.


No obstante, realmente aprecio la confiabilidad de esos equipos de producción baratos.


La parte principal de mi configuración es un Behringer UCA202 y es perfecto para mis casos de uso. Lo compré por $10 durante una bajada de precio.


Se trata de la llamada "Interfaz de audio", pero básicamente es sólo una tarjeta de sonido con múltiples puertos. Utilicé cables RCA a TRS de 3,5 mm para mis auriculares, un K240 semiabierto para salida normal y un HD669/MDR7506 cerrado para salida de monitor.


Los tres auriculares mencionados cuestan menos de $100 por el precio normal. Y hay clones de Samson, Tascam, Knox Gear y más por menos de $50.


Para el dispositivo de entrada, estoy usando un micrófono dinámico por el bien de mis ruidos ambientales. Es una copia SM58 (Pyle) + una grabadora Tascam DR-05 (a modo de amplificador). Otros clones como SL84c o wm58 también lo harían.


Utilizo un cable XLR a TRS de 3,5 mm para conectar el micrófono a la entrada MIC/externa de la grabadora, y luego uso un cable AUX para conectar entre la salida de línea de la grabadora y la entrada del UCA202.


No se recomienda comprar una “interfaz de audio” y un amplificador dedicado para replicar mi configuración. Una tarjeta de sonido USB c-media de 10 dólares debería ser suficiente. El modelo Syba que tenía es capaz de “preamplificar” micrófonos dinámicos directamente e incluso algunos micrófonos con alimentación fantasma de gama baja.


La configuración puede ser extremadamente económica ($40~60), pero con UCA202 y DR-05, el sonido es mucho más limpio. Y realmente me gustan los controles físicos, la versatilidad y la portabilidad de mi vieja y buena grabadora digital.

Flujos de trabajo de audacia

Aunque cuando me pagaban como diseñador, estaba bastante contento con Audition. Pero para uso personal en un proyecto divertido, Audacity es la forma de evitar el mal caótico de Adobe.

cortadora de audio

Utilice audio-slicer o audio-slicer (gui) para dividir el archivo de audio en trozos pequeños para su uso posterior.

La configuración predeterminada funciona muy bien.

Conjunto de datos de limpieza

Retire los muy cortos y vuelva a cortar los que aún tengan más de 10 segundos.


En el caso de un conjunto de datos grande, elimine todos los que tengan menos de 4 segundos. En el caso de un conjunto de datos pequeño, elimínelos solo en menos de 2 segundos.


Si es necesario, realice una inspección manual de cada archivo.

Combinar sonoridad

Utilice Audacity nuevamente con Normalización de sonoridad ; 0db debería hacerlo.

so-vits-svc

Configurar el entorno

El entorno virtual es esencial para ejecutar múltiples herramientas Python dentro de un sistema. Solía usar máquinas virtuales y Docker, pero ahora descubrí que anaconda es mucho más rápida y práctica que las demás.


Cree un nuevo entorno para so-vits-svc y actívelo.

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


Luego, instale los 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

Inicialización

Descargar modelos previamente entrenados

  • pre-entrenamiento
    • 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


  • registros/44k/difusión
    • 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


  • pre-entrenamiento/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

Preparación del conjunto de datos

Coloque todos los archivos audio.wav preparados en 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 configuraciones

El archivo se encuentra en configs/config.json

log interval : la frecuencia de impresión eval interval del registro: la frecuencia de guardar los puntos de control epochs : pasos totales keep ckpts : números de puntos de control guardados, 0 para ilimitado. half_type : fp32 En mi caso, batch_size : cuanto más pequeño, más rápido (más tosco), más grande, más lento (mejor).


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


Mantener el valor predeterminado para configs/diffusion.yaml

Capacitación

 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


Sobre los pasos del entrenamiento:

Utilice train.py para entrenar el modelo principal; Por lo general, se podrían utilizar entre 20.000 y 30.000, y 50.000 y más serían suficientes. Esto puede tardar unos días dependiendo de la velocidad de la GPU.


Siéntase libre de detenerlo presionando ctrl+c y continuará entrenando volviendo a ejecutar python train.py -c configs/config.json -m 44k en cualquier momento.


Utilice train_diff.py para entrenar el modelo de difusión; Se recomiendan pasos de entrenamiento a 1/3 del modelo principal.


Tenga cuidado con el sobreentrenamiento. Utilice tensorboard --logdir=./logs/44k para monitorear los gráficos y ver si se aplana.


Cambie la learning rate de 0,0001 a 0,00005 si es necesario.


Cuando termine, comparta/transporte estos archivos para realizar inferencias.


  • configuración/
    • configuración.json

    • difusión.yaml


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

Inferencia

Es hora de probar el modelo entrenado. Preferiría Webui por la conveniencia de modificar los parámetros.


Pero antes de activarlo, edite las siguientes líneas en webUI.py para acceder a LAN:

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


Ejecute python webUI.py ; luego acceda a su ipaddress:7860 desde un navegador web.


La webui no tiene localización en inglés, pero Immersive Translate sería útil.


La mayoría de los parámetros funcionarían bien con el valor predeterminado. Consulte this y this para realizar cambios.


Sube estos 5 archivos:

main model.pt y su config.json


diffusion model.pt y su diffusion.yaml


Ya sea el modelo de clúster kmeans_10000.pt para hablar o la recuperación de funciones feature_and_index.pkl para cantar.


F0 predictor es sólo para hablar, no para cantar. Recomiende RMVPE cuando lo use.


Pitch change es útil cuando se canta una canción femenina usando un modelo con voz masculina, o viceversa.


Clustering model/feature retrieval mixing ratio es la forma de controlar el tono. Utilice 0.1 para obtener el discurso más claro y utilice 0.9 para obtener el tono más cercano al modelo.


shallow diffusion steps deben establecerse alrededor de 50 , mejora el resultado en 30-100 pasos.

Edición de audio

Este procedimiento es opcional. Sólo para la producción de una mejor canción.


No entraré en detalles sobre esto ya que el software de edición de audio, o el llamado DAW (estación de trabajo de audio digital), que estoy usando no es gratuito. No tengo intención de defender el software propietario a pesar de que toda la industria tiene muros de pago y de código cerrado.


Audacity admite multipista, efectos y mucho más. También carga algunos complementos VST avanzados.


No es difícil encontrar tutoriales sobre cómo masterizar canciones con Audacity.


Normalmente, el proceso de masterización debe consistir en mezclar/equilibrar, ecualizar/comprimir, reverberación e imágenes. Cuanto más avanzada sea la herramienta, más sencillo será el proceso.


Definitivamente dedicaré más tiempo a adoptar Audacity para mi proceso de masterización en el futuro, y recomiendo a todos que lo hagan.

so-vits-svc-tenedor

Esta es una bifurcación de so-vits-svc con soporte en tiempo real y los modelos son compatibles. Más fácil de usar pero no es compatible con el modelo Diffusion. Para un cambio de voz dedicado en tiempo real, se recomienda un cambiador de voz .

Instalación

 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

Preparación

Coloque los archivos .wav del conjunto de datos en so-vits-svc-fork/dataset_raw

 svc pre-resample svc pre-config


Edite un batch_size en configs/44k/config.json . Este tenedor es de un tamaño mayor que el original.

Capacitación

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

Inferencia

Utilice la GUI con svcg . Esto requiere un entorno de escritorio local.


O use CLI con svc vc en tiempo real y svc infer -m "logs/44k/xxxxx.pth" -c "configs/config.json" raw/xxx.wav para generar.

DDSP-SVC

DDSP-SVC requiere menos recursos de hardware y se ejecuta más rápido que so-vits-svc. Admite modelos de difusión y en tiempo real (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 la sección Inicialización para los dos archivos:

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

Preparación

 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

Capacitación

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

Inferencia

Se recomienda utilizar main_diff.py ya que incluye DDSP y modelo de difusión.

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


GUI en tiempo real para clonación de voz:

 python gui_diff.py

Bert-vits2-V2.3

Esta es una herramienta TTS que es completamente diferente a todo lo anterior. Al usarlo, ya he creado varios audiolibros con mi voz para mis padres y ellos realmente lo disfrutan.


En lugar de usar el original , utilicé la bifurcación de v3u para una configuración más sencilla.

Inicialización

 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


Descargue modelos previamente entrenados (incluye chino, 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

Crear una carpeta de modelo de personaje mkdir -p Data/xxx/models/


Descargar modelos 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

Edite train_ms.py reemplazando todo bfloat16 por float16


Edite webui.py para acceso 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 y spk2id

Preparación

Flujo de trabajo similar al de la sección anterior .


Elimine el ruido y el silencio, normalice y luego coloque el archivo WAV sin cortar en Data/xxx/raw .


Edite config.yml para dataset_path , num_workers y keep_ckpts .


Ejecute python3 audio_slicer.py para dividir el archivo WAV.


Limpie el conjunto de datos ( Data/xxx/raw ) eliminando archivos pequeños que tengan menos de 2 segundos.

Transcripción

Instalar susurro pip install git+https://github.com/openai/whisper.git


Para desactivar la detección automática de idioma, configúrelo solo en inglés y use un modelo large ; edite short_audio_transcribe.py como se muestra a continuación:

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

Ejecute python3 short_audio_transcribe.py para iniciar la transcripción.


Vuelva a muestrear el conjunto de datos cortado: python3 resample.py --sr 44100 --in_dir ./Data/zizek/raw/ --out_dir ./Data/zizek/wavs/


Transcripción previa al proceso: python3 preprocess_text.py --transcription-path ./Data/zizek/esd.list


Generar configuración de función BERT: python3 bert_gen.py --config-path ./Data/zizek/configs/config.json

Entrenamiento e inferencia

Ejecute python3 train_ms.py para comenzar a entrenar


Edite config.yml para la ruta del modelo:

 model: "models/G_20900.pth"

Ejecute python3 webui.py para iniciar webui para realizar inferencias

vits-simple-api

vits-simple-api es una interfaz web para utilizar modelos entrenados. Lo uso principalmente por su compatibilidad con textos largos que el proyecto original no tiene.

 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 archivos de modelo previamente entrenados de Bert-vits2-V2.3/ a vits-simple-api/bert_vits2/


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


Edite config.py para MODEL_LIST y Default parameter como prefiera


Edite Model/xxx/config.json como se muestra a continuación:

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

Verifique/Edite model_list en config.yml como [xxx/G_xxxxx.pth, xxx/config.json]


Ejecute python app.py

Ajustes

SDP Ratio para tono, Noise para aleatoriedad, Noise_W para pronunciación y Length para velocidad. emotion y style se explican por sí solos.

Compartir modelos

En su repositorio Hugging Face , hay muchos modelos VITS compartidos por otros. Puede probarlo primero y luego descargar los modelos deseados desde Archivos .


El modelo Genshin es muy utilizado en algunas comunidades de creación de contenidos debido a su alta calidad. Contiene cientos de caracteres, aunque sólo se admiten chino y japonés.

En otro repositorio , hay muchos modelos de Bert-vits2 creados por streamers y VTubers chinos populares.


Ya hay proyectos que crean AI Vtubers como este y este . Estoy deseando ver cómo esta tecnología puede cambiar la industria en un futuro próximo.


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