Clonació de veu
Introducció
Per fer clonació de veu, la manera que millor funciona és fer-ho a partir d'una veu sintetitzada, i millor és clar si és de la variant dialectal correcta. De síntesi de veu tinc dues opcions: -vits-multispeaker (necessita espeak-ng) -Matxa v2 (multi-doalectal) (està basat en grafemes, no necessita espeak-ng). Començaré per la primera opció, però finalment acabaré fent la segona opció.
RVC (Retrieval Voice Conversion)
Reaprofito la carpeta veu-catala/, que no deixa de ser un contenidor de fitxers. I en aquesta carpeta hi haurà dos entorns virtuals: un per al model VITS-multispeaker (encarregat del TTS i que genera un fitxer .wav). I un altre entorn que té per missió convertir el .wav a la veu de mostra que se li passa (i generarà un altre .wav).
cd ~/veu-catala python3 -m venv venv-rvc source venv-rvc/bin/activate pip install --upgrade pip git clone https://github.com/fumiama/Retrieval-based-Voice-Conversion-WebUI.git rvc cd rvc # pytorch per la teva GPU pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128
4. Dependències — vigila amb fairseq
fairseq sovint necessita compilar-se i falla si el requirements.txt fixa una versió de torch/numpy incompatible amb la que ja tens instal·lada per Blackwell:
sudo apt install build-essential # ja ho tenia
cat requirements/main.txt
Si hi veus línies com torch==..., torchvision==..., torchaudio==..., numpy==... o fairseq==... amb una versió concreta fixada, comenta-les (posa un # al davant) perquè no et sobreescrigui el que ja tens funcionant.
la línia dins de requirements/main.txt que fa referència a fairseq és:
fairseq @ git+https://github.com/fumiama/fairseq.git
i no la comento (de fet, no comento res. En el main.txt no hi ha cap referència a torch).
Instal·lem les dependències:
pip install -r requirements/main.txt ... Building wheels for collected packages: fairseq, pyworld, antlr4-python3-runtime Building wheel for fairseq (pyproject.toml) ... - ...
Fairseq(-py) is a sequence modeling toolkit that allows researchers and developers to train custom models for translation, summarization, language modeling and other text generation tasks.
5. Baixa els models base necessaris
RVC necessita un extractor de característiques (HuBERT) i un detector de to (RMVPE):
mkdir -p assets/hubert assets/rmvpe curl -L -o assets/hubert/hubert_base.pt https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt curl -L -o assets/rmvpe/rmvpe.pt https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/rmvpe.pt
(s'han descarregat bé)
6. Prepara els àudios de la teva veu
- Grava't 10-30 minuts parlant amb normalitat (millor en frases variades, no llegint sempre el mateix to).
- So net: sense música de fons, soroll, ni eco. Si cal, neteja-ho abans amb algun eina de reducció de soroll.
- Format .wav, cap problema si és un sol fitxer llarg o diversos — el propi RVC els trossejarà durant l'entrenament.
- Posa'ls tots en una carpeta, per exemple ~/veu-catala/rvc/dataset/joan/.
$ mkdir -p datasets/joan
Gravacions que tinc per entrenar la meva veu. Per exemple:
- /home/joan/projectes/NLP_catala/practica_audio_classification_using_pytorch/gravacio/gravacio2.wav
(són 21 minuts, 55MB)
Faig la gravacio de la meva veu, una gravació de 30 min:
$ arecord -D plughw:1,0 -f S16_LE -r 48000 -c 1 gravacio_joan_260923.wav $ file gravacio_joan_260923.wav gravacio_joan_260923.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 48000 Hz $ aplay gravacio_joan_260923.wav
En aquest punt tenia molt interès de gravar la veu a 48000, doncs la interfície web d'entrenament veuré que hi ha el check 22000, 40000 i 48000.
7. Engega la interfície web
prompt: Estic en el punt 7. Engega la interfície web (python infer-web.py). Però jo estic treballant per SSH, en consola. Hi ha possibilitat de poder entrenar la meva veu?
La resposta seria que sí, que una web és un servidor Gradio local, i que s'ha de portar aquest port (fa servir el port 7860) fins al servidor. I la manera més neta de fer-ho és amb SSH port forwarding. De totes maneres, no hi ha problema per fer aquesta tasca d'entrenament RVC en el servidor directament. I a més a més, aprendrem al final d'aquesta entrada a fer l'entrenament RVC totalment des de la consola (hi ha el projecte RVC-NOGUI).
Ja podem engegar la interfície web, però el script que he d'executar no es diu infer-web.py sinó web.py:
$ python web.py /home/joan/veu-catala/venv-rvc/lib/python3.12/site-packages/torch/jit/_script.py:1491: FutureWarning: `torch.jit.script` is deprecated. Please switch to `torch.compile` or `torch.export`. warnings.warn( INFO:configs.config:Found GPU NVIDIA GeForce RTX 5060 Ti ...
NOTA: fixem-nos que tindrem dos venv (que es diu venv, millor sempre utilitzar un nom més nemotècnic), i un altre que es diu venv-rvc). Un és per al model de síntesi vits-multispeaker, i l'altre és per al RVC. Això és el correcte, cada funcionalitat treballant amb el seu entorn i les seves dependències. Ara bé, lo bo del cas és que no cal activar/desactivar els entorns virtuals. N'hi ha prou en executar el codi a través de la ruta correcta de la instal·lació de python en el virtual environment. Per exemple: ~/veu-catala/venv/bin/python prova.py, ~/veu-catala/venv-rvc/bin/python convertir.py. Així cada entorn fa servir les seves pròpies dependències sense trepitjar-se. La carpeta veu_catala/ és només un contenidor de fitxers, no té res a veure amb l'aïllament de dependències (això ho fan els venvs, no els directoris).
Un cop tinc la interfície web, la manera de procedir és, a la pestanya Train:
Pas 1:
- donar un nom a l'experiment
- target sample rate: fixem-nos que aquest és el target, no el input. No és el sample rate de les meves gravacions. Puc deixar-ho a 40K, que suposo que vol dir 44100.
- faig servir la versió 2
Pas 2a:
- model has pitch guidance: no cal
- definir la carpeta on estan els samples de veu. Per ex: ~/veu-catala/rvc/dataset/joan/. Pot haver-hi un sol arxiu wav o vàrios, ell ja ho sap gestionar.
- speaker id: aquí m'apareixerà la llista de totes les veus de clonació que tinc (era així això?)
- clicar el botó Process data i veure com apareix la output information. Aquí representa que es fa el split/chunking de la gravació.
Pas 2b:
- GPU que faig servir: aquí en principi res, ja detecta bé la meva GPU
- faig servir per defecte rmvpe_gpu
- Botó feature_extraction, i esperar a què acabi tota l'extracció
Pas 3:
- entrar els paràmetres d'entrenament, i començar a entrenar, i veure com passen les èpoques fins al final.
Aquesta és la pestanya Train, però important és també la pestanya Vocals/Accompaniment & Reververation Removal, perquè sap convertir la meva gravació (que potser jo em pensava que estava ben feta) en una bona qualitat abans de ser entrenada. Per exemple, si hi ha barrejada música i veu, sap extreure molt bé la veu. Després de l'entrenament anirem a la pestanya Model inference, que serà quan podrem provar els resultats.
(to be continued)