Document 20, per documentar i esborrar
Salta a la navegació
Salta a la cerca
En el servidor tinc el fitxer:
configuracio_ordinador.txt
---
El linux mint ja vindrà amb una instal·lació de python:
python3 --version
si és prou moderna, no tocar res, i executar els projectes python amb venv
cat /etc/linuxmint/info
python3 --version
---
sublime text 4
venv
docker
ssh server
connectar-me des del meu client
cuda
https://chatgpt.com/c/6a96f781-d7b4-83ed-8bfd-7d42cf588d91
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2026 NVIDIA Corporation
Built on Mon_Aug_03_13:24:11_PDT_2026
Cuda compilation tools, release 13.4, V13.4.59
Build cuda_13.4.r13.4/compiler.38657139_0
6. No instal·lis PyTorch globalment
Això és important.
No facis:
sudo pip install torch
https://pytorch.org/get-started/locally/?utm_source=chatgpt.com
pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu132
$ python3 primera_prova.py
PyTorch: 2.14.0+cu132
CUDA disponible: True
CUDA de PyTorch: 13.2
GPU: NVIDIA GeForce RTX 5060 Ti
En aquest punt tens PyTorch + CUDA funcionant de veritat.
(recordem que ho fem en un venv)
---
10. Instal·la Ollama
curl -fsSL https://ollama.com/install.sh | sh
$ ollama -v
ollama version is 0.34.1
$ systemctl status ollama
● ollama.service - Ollama Service
Loaded: loaded (/etc/systemd/system/ollama.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-09-15 23:31:14 CEST; 29s ago
Main PID: 7980 (ollama)
Tasks: 15 (limit: 34856)
Memory: 72.6M (peak: 3
o bé des de l'exterior:
$ ssh joan@79.156.157.3 -p 2222
(funciona des de l'institut)
vull executar la pràctica 5073-EAC6-2627S1
portàtil:
scp cifar10.zip joan@192.168.1.184:~
servidor:
unzip cifar10.zip
i segons les instruccions del README:
cd cifar10
python3 -m venv venv
source venv/bin/activate # Linux / macOS
pip install --upgrade pip
pip install -r requirements.txt
i executem el projecte:
python3 -m src.main
Per tal de veure la VRAM que consumeix la RTX5060, en un altre terminar:
$ ssh joan@192.168.1.184
$ watch -n 1 nvidia-smi
=========================
compra a pcgamingbcn.com
PC Gaming AMD Ryzen 7 5800x
RTX 5060 TI 16GB
32 GB RAM
2 TB SSD (NVMe)
Windows 11 Pro -> Linux Mint
====
Per desactivar els LEDs:
aguantar el botó de reset 2 o 3 segons. Per tornar a activar-ho, tornar a apretar reset.
====
Treballar en el portàtil amb Sublime Text contra el servidor
En el portàtil instal·lem sshfs:
sudo apt install sshfs
En el portàtil creem un punt de muntatge:
mkdir -p ~/servidorIA
I muntem el directori de projectes del servidor
sshfs joan@192.168.1.184:/home/joan/projectes ~/servidorIA
I ara amb el Sublime Text del portàtil puc treballar amb els fitxers del servidor.
És a dir:
-/home/joan/projectes és el directori de treball en el servidor IA
-/home/joan/servidorIA és el punt de muntatge en el portàtil
==============
Em puc connectar a un servidor via xarxa local o via xarxa remota:
ssh joan@192.168.1.184
ssh joan@79.156.157.3 -p 2222
I també sé fer un punt de muntatge:
sshfs joan@192.168.1.184:/home/joan/projectes ~/servidorIA
sshfs joan@79.156.157.3:/home/joan/projectes ~/servidorIA2 -p 2222
Com faig el scp per enviar fitxers del portàtil al servidor, o del servidor al portàtil?
Del portàtil al servidor:
# Xarxa local
scp fitxer.txt joan@192.168.1.184:/home/joan/projectes/
# Xarxa remota (fixa't en la -P majúscula, i que va abans de l'origen)
scp -P 2222 fitxer.txt joan@79.156.157.3:/home/joan/projectes/
Del servidor al portàtil:
# Xarxa local
scp joan@192.168.1.184:/home/joan/projectes/fitxer.txt ~/Baixades/
# Xarxa remota
scp -P 2222 joan@79.156.157.3:/home/joan/projectes/fitxer.txt ~/Baixades/
Carpetes senceres: afegeix -r (recursiu):
scp -r -P 2222 ~/meu_projecte joan@79.156.157.3:/home/joan/projectes/
==============
Transcripció àudio en català
https://chatgpt.com/c/6aac108b-6940-83eb-9972-d8f7e76eefa2
sudo apt install ffmpeg
ho hem de fer en un venv:
mkdir model-whisper
cd model-whisper
python3 -m venv whisper-env
source whisper-env/bin/activate
() pip install -U pip
() pip install -U openai-whisper
i ara ja podem fer una transcripció:
per posar el fitxer t0001.wav al servidor, recordem que tenim una unitat muntada en el portàtil: ~/servidorIA
hem de mirar si ja el tenim muntat:
mount | grep servidorIA
si no està muntat el muntem:
$ sshfs joan@192.168.1.184:/home/joan/projectes ~/servidorIA
$ sshfs joan@79.156.157.3:/home/joan/projectes ~/servidorIA2 -p 2222
i si no es pot muntar perquè el directori no està buit, podem eliminar el contingut:
rm -rf ~/servidorIA/*
i aleshores ja podem muntar
o bé millor muntar-ho sense haver d'eliminar el contingut:
sshfs -o nonempty joan@192.168.1.184:/home/joan/projectes ~/servidorIA
per desmuntar-lo:
fusermount -u ~/servidorIA
i en el servidor:
$ mv /home/joan/projectes/t0001.wav .
whisper t0001.wav --language Catalan --model turbo
100%|██████████████████████████████████████| 1.51G/1.51G [00:14<00:00, 114MiB/s]
[00:00.000 --> 00:01.160] Gràcies per ser amb nosaltres.
[00:01.760 --> 00:02.040] Hola.
[00:02.280 --> 00:06.400] Helen, pot ser un problema ser crònicament amables i complements?
[00:07.100 --> 00:10.580] Sí, perquè quan parlem de ser crònicament amables i complements
[00:10.580 --> 00:14.160] estem parlant que ens estem traient a nosaltres
[00:14.160 --> 00:17.600] perquè són persones que no sabem mai escoltar-nos.
...
whisper t0001.wav --language Catalan --model turbo --output_format txt
amb un script python: prova_whisper.py:
import whisper
model = whisper.load_model("turbo")
result = model.transcribe(
"t0001.wav",
language="ca"
)
print(result["text"])
$ python3 prova_whisper.py
I una cosa important si el que busques és català amb la màxima qualitat
Existeix també un model específic de català, whisper-large-v3-ca-3catparla, desenvolupat pel Projecte AINA, entrenat específicament per a reconeixement automàtic de veu en català.
Per instal·lar aquest model:
() pip install torch transformers accelerate
creem el fitxer nano transcribe.py:
import torch
from transformers import pipeline
model_name = "projecte-aina/whisper-large-v3-ca-3catparla"
pipe = pipeline(
"automatic-speech-recognition",
model=model_name,
device=0 if torch.cuda.is_available() else -1,
)
result = pipe("t0001.wav")
print(result["text"])
$ python3 transcribe.py
Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.
config.json: 100%|█████████████████████████████████████████████████████████████████████████████████| 1.35k/1.35k [00:00<00:00, 6.20MB/s]
pytorch_model.bin.index.json: 100%|██████████████████████████████████████████████████████████████████| 112k/112k [00:00<00:00, 35.7MB/s]
model.safetensors.index.json: 100%|███████████████████████████████████████████████████
...
el primer que fa és descarregar el model
ValueError: You have passed more than 3000 mel input features (> 30 seconds) which automatically enables long-form generation
(li he passat un àudio de més de 30 segons, però funcionaria).
Ho provo amb el /home/joan/projectes/NLP_catala/gravar_so_intern/samples/t0014/c993.wav i funciona correctament: el número de seguidors a youtube en directe
la segona vegada que ho executo ja no caldrà descarregar el model. El que fa és carregar els pesos del model. Recordar que estic treballant en un venv, amb tots els avantatges que això comporta.
---
per aturar la màquina:
$ sudo shutdown now
---
model
1. Qwen3.5 9B
És probablement el que més et recomanaria afegir. Qwen3.5 és multimodal i la versió 9B ocupa uns 6,6 GB, amb context de 256K.
Per tenir un model ràpid per al dia a dia, és molt més interessant que fer servir sempre el teu 27B.
ollama pull qwen3.5:9b
$ ollama run qwen3.5:9b
---
model
2. Gemma 3 12B
Aquest és especialment interessant perquè és multimodal: pot treballar amb text i imatges, té context de 128K i suporta més de 140 idiomes. La versió 12B ocupa uns 8,1 GB.
ollama pull gemma3:12b
ollama run gemma3:12b
Pot treballar amb imatges. Ho podem fer mitjançant la API de la següent manera:
IMG=$(base64 -w 0 /home/joan/projectes/ratoli.jpeg)
curl http://localhost:11434/api/chat \
-H "Content-Type: application/json" \
-d "{
\"model\": \"gemma3:12b\",
\"messages\": [
{
\"role\": \"user\",
\"content\": \"Descriu detalladament aquesta imatge.\",
\"images\": [\"$IMG\"]
}
],
\"stream\": false
}"
Resposta:
{"model":"gemma3:12b","created_at":"2026-09-18T08:21:25.044041898Z","message":{"role":"assistant","content":"Aquí teniu una descripció detallada de la imatge:\n\n**Descripció general:**\n\nLa imatge mostra un ratolí de pèls marrons, vist de costat, sobre un fons blanc. La il·luminació és clara i uniforme, destacant les seves característiques.\n\n**Detalls específics:**\n\n* **Animal:** El ratolí és de mida mitjana, amb una postura alerta. El seu pelatge és dens i de color marró grisenc, amb un to lleugerament més clar a la panxa.\n* **Cap:** La seva cara és rosada, amb un musell llarg i una punta de nas rosada. Té ulls petits, rodons i negres, amb una mica de brillantor a la llum. Les seves orelles són grans, triangulals i de color rosa pàlid. Les vibrisses són llargues i blanques, i es projecten cap endavant.\n* **Cos:** El cos és arrodonit i proporcional a la cap. Les potes davanteres són petites i amb urpes. La cua és fina i coberta de pelusa.\n* **Fons:** El fons és totalment blanc, sense text o elements addicionals. Això ajuda a que l'atenció se centri completament en el ratolí.\n\n**Estil i composició:**\n\nLa imatge és una fotografia de primer pla que permet apreciar els detalls de l'animal. La composició és simple i equilibrada, posant l'èmfasi en la naturalesa del ratolí."},"done":true,"done_reason":"stop","total_duration":10394341884,"load_duration":1237038,"prompt_eval_count":289,"prompt_eval_cached_count":0,"prompt_eval_duration":2987531000,"eval_count":344,"eval_duration":6779488000}
Veiem que hem accedit a la API pel port 11434:
Sí. Aquesta és una de les coses més interessants d'Ollama: quan l'executes, actua també com un servidor HTTP local. Això vol dir que qualsevol programa que s'executi al teu ordinador pot parlar amb Ollama enviant peticions HTTP.
http://localhost:11434
vol dir essencialment: "Connecta't al servidor Ollama que està funcionant en aquest mateix ordinador."
---
model
3. Mistral Small 3.2 24B
Aquest és probablement el competidor més interessant del teu Qwen3.5 27B Q3. És un 24B Q4_K_M que ocupa aproximadament 15 GB, té context de 128K i és multimodal. Mistral destaca, a més, per instruction following i function calling.
ollama pull mistral-small3.2
provo el model amb curl i amb script python:
curl http://localhost:11434/api/chat \
-H "Content-Type: application/json" \
-d '{
"model": "mistral-small3.2",
"messages": [
{
"role": "user",
"content": "vull fer una petita narració en català (unes 100 paraules) que inclogui les paraules: atapeït, somicar i grapejar"
}
],
"stream": false
}'
resposta:
{"model":"mistral-small3.2","created_at":"2026-09-18T08:27:18.102796986Z","message":{"role":"assistant","content":"Aquí tens una petita narració:\n\nEl petit en Joan tornava de l'escola atapeït de tasques i cansament. En entrar a casa, va veure el seu gos, Tolo, somicar a la vora de la finestra. \"Tolo, no et grapegis tant!\", li va dir rient. El gos va obrir un ull i va movir la cua, com si entengués cada paraula. Joan va deixar la motxilla i va anar a la cuina per preparar un entrepà. Mentre menjava, Tolo va saltar al seu reguit i va començar a grapejar amb alegria. \"Estàs insuportable!\", va riure Joan, però en el fons li feia il·lusió tenir-lo al seu costat.\n\n(100 paraules)"},"done":true,"done_reason":"stop","total_duration":16327480542,"load_duration":5403826250,"prompt_eval_count":543,"prompt_eval_cached_count":0,"prompt_eval_duration":663015000,"eval_count":180,"eval_duration":10258082000}
narracio.py:
import ollama
response = ollama.chat(
model='mistral-small3.2',
messages=[
{
'role': 'user',
'content': (
'vull fer una petita narració en català '
'(unes 100 paraules) que inclogui les paraules: '
'atapeït, somicar i grapejar'
)
}
]
)
print(response['message']['content'])
Per executar-ho:
pip install ollama
$ pip install ollama
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
Millor crear un venv
mkdir ollama-mistral-small-python
cd ollama-mistral-small-python
python3 -m venv .venv
source .venv/bin/activate
pip install ollama
joe narracio.py
...
python3 narracio.py
resposta:
Aquí tens una petita narració de 100 paraules:
---
El petit poble de Montclar estava **atapeït** de turistes aquell estiu. En Marc, un noi de dotze anys, es **somicava** cada nit per escapar del soroll. Una vesprada, mentre **grapejava** per les velles carrerons, va trobar una porta secreta que portava a una gruta subterrània. Allà, va descobrir un antic rellotge de sorra que, segons la llegenda, podia aturar el temps. Amb curiositat, el va girar i, de sobte, tot es va quedar immòbil. Els turistes van quedar congelats, i el poble va recuperar la seva tranquil·litat. En Marc va aprendre que, a vegades, el millor és viure el present.
---
Si volem provar el model directament:
$ ollama run mistral-small3.2
ara els models que tinc instal·lats són:
$ ollama list
NAME ID SIZE MODIFIED
mistral-small3.2:latest 5a408ab55df5 15 GB 11 minutes ago
gemma3:12b f4031aab637d 8.1 GB 24 minutes ago
qwen3.5:9b 6488c96fa5fa 6.6 GB 28 minutes ago
qwen3.5:27b-q3 699f7cee9559 14 GB 40 hours ago
qwen3:8b 500a1f067a9f 5.2 GB 2 days ago
===================
Síntesi de veu
--------------
https://chatgpt.com/c/6ab042c5-4344-83eb-90bb-83cad23ab322
(m'he fet un lio amb el XTTS-v2 i la instal·lació de Coqui TTS)
prompt:
vull fer clonació i síntesi de veu en català amb F5-TTS. Tinc una RTX5060 Ti 16GB.
Per català, però, hi ha un punt important: el model base de F5-TTS no és específicament un model català, així que la qualitat de pronunciació catalana dependrà molt del text, del model/checkpoint i de l'àudio de referència. Si vols qualitat alta i consistent en català, podem plantejar també fine-tuning.
mkdir -p F5-TTS
cd F5-TTS
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip setuptools wheel
3. Instal·la PyTorch
El repositori actual de F5-TTS documenta PyTorch amb CUDA 12.8, i PyTorch publica wheels específiques cu128.
Jo tinc CUDA 13.2, però no passa res
pip install torch==2.8.0+cu128 torchaudio==2.8.0+cu128 \
--extra-index-url https://download.pytorch.org/whl/cu128
$ python3
import torch
print("PyTorch:", torch.__version__)
print("CUDA:", torch.version.cuda)
print("CUDA disponible:", torch.cuda.is_available())
print("GPU:", torch.cuda.get_device_name(0))
print("Compute capability:", torch.cuda.get_device_capability(0))
PyTorch: 2.8.0+cu128
CUDA: 12.8
CUDA disponible: True
GPU: NVIDIA GeForce RTX 5060 Ti
Compute capability: (12, 0)
4. Instal·la F5-TTS
git clone https://github.com/SWivid/F5-TTS.git
git clone https://github.com/SWivid/F5-TTS.git
cd F5-TTS
pip install -e .
ara el meu directori de treball és ~/F5-TTS/F5-TTS. No confondre el primer amb el segon.
$ f5-tts_infer-cli --help
$ f5-tts_infer-gradio --help -> es descarrega el model
5. Primera prova: interfície web
$ f5-tts_infer-gradio
Normalment et donarà una adreça local del tipus:
http://127.0.0.1:7860
Obre-la al navegador.
La interfície de F5-TTS permet fer inferència a partir d'una veu de referència i generar text nou. El projecte actual també disposa de funcionalitats d'inferència per chunks i altres modes.
però jo no estic davant de l'ordinador. I no puc fer:
http://79.156.157.3:7860
perquè el port 7860 no està obert
(m'he quedat aquí)
(...)
$ arecord -f cd gravacio.wav
scp gravacio.* joan@192.168.1.184:/home/joan/Baixades
$ f5-tts_infer-cli --model F5TTS_Base --ref_audio /home/joan/Baixades/gravacio.wav --ref_text "It was a cold and quiet evening when Emily arrived in the small village of Blackwood. The streets were almost empty, and a thick fog covered the old houses. As she walked towards the house she had recently inherited from her grandmother, she noticed a strange light shining from one of the upstairs windows. Emily stopped and stared at it for a moment. She was certain that the house had been empty for years, so she could not understand who could be inside." --gen_text "Good morning. This is a simple test of generating an English speech from a text" --output_dir /home/joan/projectes --output_file prova.wav --speed 0.06
es genera el fitxer /home/joan/Baixades/prova.wav
NOTA: recordem que en el portàtil tinc un punt de muntatge a /home/joan/projectes en el servidor.
$ find ~/.cache/gface -type d -iname "*F5*" 2>/dev/null
/home/joan/.cache/huggingface/hub/models--SWivid--F5-TTS
/home/joan/.cache/huggingface/hub/models--SWivid--F5-TTS/snapshots/84e5a410d9cead4de2f847e7c9369a6440bdfaca/F5TTS_v1_Base
/home/joan/.cache/huggingface/hub/models--SWivid--F5-TTS/snapshots/84e5a410d9cead4de2f847e7c9369a6440bdfaca/F5TTS_Base
/home/joan/.cache/huggingface/hub/.locks/models--SWivid--F5-TTS
$ f5-tts_infer-cli --model F5TTS_v1_Base --ref_audio /home/joan/Baixades/gravacio.wav --ref_text "It was a cold and quiet evening when Emily arrived in the small village of Blackwood. The streets were almost empty, and a thick fog covered the old houses. As she walked towards the house she had recently inherited from her grandmother, she noticed a strange light shining from one of the upstairs windows. Emily stopped and stared at it for a moment. She was certain that the house had been empty for years, so she could not understand who could be inside." --gen_text "Good morning. This is a simple test of generating an English speech from a text" --output_dir /home/joan/projectes --output_file prova2.wav --speed 0.06
$ f5-tts_infer-cli --model F5TTS_Base --ref_audio /home/joan/projectes/gravacio2.wav --ref_text "It was a cold and quiet evening when Emily arrived in the small village of Blackwood." --gen_text "Good morning. This is a simple test of generating an English speech from a text" --output_dir /home/joan/projectes --output_file prova.wav --speed 0.06
No m'acaba de sortir. Obtinc uns resultats en anglès bastant inconsistents, i en català no ho aconseguiré.
================
2a prova: síntesi d'una veu en català
https://claude.ai/chat/a77d2c6c-1051-4733-a6a8-31c5abe7b322
$ pip install TTS
ERROR: Ignored the following versions that require a different python version: 0.0.10.2 Requires-Python >=3.6.0,<3.9; 0.0.10.3 Requires-Python >=3.6.0,<3.9; 0.0.11 Requires-Python >=3.6.0,<3.9; 0.0.12 Requires-Python >=3.6.0,<3.9; 0.0.13.1 Requires-Python >=3.6.0,<3.9; 0.0.13.2 Requires-Python >=3.6.0,<3.9; 0.0.14.1 Requires-Python >=3.6.0,<3.9; 0.0.15 Requires-Python >=3.6.0,<3.9; 0.0.15.1 Requires-Python >=3.6.0,<3.9; 0.0.9 Requires-Python ... >=3.7.0,<3.11; 0.7.1 Requires-Python >=3.7.0,<3.11; 0.8.0 Requires-Python >=3.7.0,<3.11; 0.9.0 Requires-Python >=3.7.0,<3.11
ERROR: Could not find a version that satisfies the requirement TTS (from versions: none)
ERROR: No matching distribution found for TTS
Confirmat: el paquet TTS original de Coqui està abandonat (l'empresa va tancar) i el darrer release no accepta Python ≥3.12, que és probablement el que tens instal·lat. Hi ha un fork actiu mantingut per Idiap que ha canviat de nom a coqui-tts.
pip install coqui-tts -> ara sí
Aquest fork suporta Python 3.10 fins a <3.13 (i les últimes versions ja arriben fins <3.14). Si el teu python3 --version et dona 3.13 o més nou, hauràs de crear el venv amb una versió compatible:
Prova ràpida amb el model multi-parlant:
from TTS.api import TTS
tts = TTS("tts_models/ca/custom/vits-multispeaker") # o el nom exacte del repo d'Aina a HF
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu en català.", speaker="ona", file_path="prova.wav")
from TTS.api import TTS
ImportError: cannot import name 'isin_mps_friendly' from 'transformers.pytorch_utils' (/home/joan/veu-catala/venv/lib/python3.12/site-packages/transformers/pytorch_utils.py)
Trobat exactament: és un problema conegut i molt recent — transformers 5.x va eliminar la funció isin_mps_friendly que coqui-tts encara fa servir internament (a TTS/tts/layers/tortoise/autoregressive.py). Se't deu haver instal·lat automàticament una versió massa nova de transformers.
Solució
Fixa transformers a una versió anterior a la 5.0:
pip install "transformers==4.57.6"
$ pip show transformers
Name: transformers
Version: 4.57.6
$ python -c "from TTS.api import TTS; print('OK')"
OK
(ara sí!)
from TTS.api import TTS
tts = TTS("tts_models/ca/custom/vits-multispeaker") # o el nom exacte del repo d'Aina a HF
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu en català.",
speaker="ona",
file_path="prova.wav")
Els models que podem fer servir estan aquí:
https://huggingface.co/spaces/projecte-aina/catalan_tts_arena
i són:
-Vits 2
-Matxa-TTS
-Matxa-TTS-multiaccent
-StableTTS
-StyleTTS 2
tts = TTS("tts_models/ca/custom/vits") # funciona! descarrega el model
FileNotFoundError: [!] No espeak backend found. Install espeak-ng or espeak to your system.
primer he d'instal·lar espeak-ng
Instal·lo espeak-ng a la màquina, fora d'un venv, perquè ho faré servir bastant.
previ, les eines de make per compilar projectes C:
sudo apt update
sudo apt install autoconf automake libtool-bin pkg-config build-essential
$ which aclocal
/usr/bin/aclocal
$ aclocal --version
aclocal (GNU automake) 1.16.5
sudo apt install libtool
---
cd ~/veu-catala
git clone https://github.com/projecte-aina/espeak-ng.git
cd espeak-ng
./autogen.sh
./configure --prefix=$HOME/veu-catala/espeak-ng-build
make
make install
./autogen.sh
(ara ja funciona)
./configure --prefix=$HOME/veu-catala/espeak-ng-build
make
make install
ja ho tinc instal·lat.
3. Exporta les variables d'entorn
export ESPEAK_DATA_PATH=$HOME/veu-catala/espeak-ng-build/share/espeak-ng-data
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/veu-catala/espeak-ng-build/lib
export PATH=$HOME/veu-catala/espeak-ng-build/bin:$PATH
NOTA:
Val la pena afegir aquestes tres línies al final del ~/.bashrc (o a un script activate_env.sh propi que sourregis cada cop abans de treballar-hi), perquè si no les hauràs de tornar a exportar cada vegada que obris terminal nova.
4. Un parell de dependències més que demana Aina
bash
pip cache purge
pip install mecab-python3 unidic-lite
NOTA: he fet el fallo que ho hauria d'haver fet amb el venv del projecte que estava fent. Per tant, torno a activar el venv i faig la instal·lació del espeak
cd ~/veu-catala
source venv/bin/activate
(torno a estar dins del venv, i torno a fer la instal·lació del espeak-ng)
cd ~/veu-catala
git clone https://github.com/projecte-aina/espeak-ng.git
cd espeak-ng
./autogen.sh
./configure --prefix=$HOME/veu-catala/espeak-ng-build
make
make install
export ESPEAK_DATA_PATH=$HOME/veu-catala/espeak-ng-build/share/espeak-ng-data
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/veu-catala/espeak-ng-build/lib
export PATH=$HOME/veu-catala/espeak-ng-build/bin:$PATH
pip cache purge
pip install mecab-python3 unidic-lite
(ara sí!)
$ espeak-ng --voices=ca
Pty Language Age/Gender VoiceName File Other Languages
5 ca --/M Catalan roa/ca
5 ca-ba --/M Catalan_(Balearic) roa/ca-ba
5 ca-nw --/M Catalan_(North-western) roa/ca-nw
5 ca-va --/M Catalan_(Valencian) roa/ca-va
python -c "from TTS.api import TTS; print('OK')"
OK
(en aquest punt hauria de recordar de com funciona espeak-ng)
Ja puc continuar en el punt on estava abans, de fer una prova de síntesi:
from TTS.api import TTS
tts = TTS("tts_models/ca/custom/vits") # funciona! descarrega el model
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu en català.", speaker="ona", file_path="prova.wav")
ja ho tinc, ho ha fet bastant bé, amb algun error. Puc provar els altres models, o altres speakers.
---
Tinc aquest codi, que no funciona massa bé:
from TTS.api import TTS
tts = TTS("tts_models/ca/custom/vits") # funciona! descarrega el model
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu en català.", speaker="ona", file_path="prova.wav")
quins són els models que puc fer servir en comptes de "tts_models/ca/custom/vits"?
quins són els speakers que puc fer servir a més d'"ona"?
from TTS.api import TTS
models = TTS().list_models()
# Segons la versió, list_models() retorna una llista o un objecte ModelManager
noms = models if isinstance(models, list) else models.list_models()
print([m for m in noms if "/ca/" in m or "/cat/" in m])
['tts_models/ca/custom/vits']
només em retorna un model:
tts_models/ca/custom/vits: el que ja fas servir. És multi-speaker, entrenat amb dades de Festcat i Google Catalan.
tts = TTS("tts_models/ca/custom/vits")
print(tts.speakers)
...', 'jan', 'mar', 'ona', 'pau', 'pep', 'pol', 'teo']
for s in tts.speakers[:10]:
tts.tts_to_file(text="Bon dia, això és una prova.", speaker=s, file_path=f"/home/joan/projectes/t001_{s}.wav")
'/home/joan/projectes/t001_00236e350cc84b94a6684f182acf96e68963d7fa1164d4fa56da20f46f210b2dd3ecf189e97fb3c94113a54c12dc20550508f5b7b9b37e1873898d58a308feb5.wav'
'/home/joan/projectes/t001_00459.wav'
'/home/joan/projectes/t001_00762.wav'
'/home/joan/projectes/t001_00983a845f95493fb27125b114c635f3b40060efaee167d32d8a3dd040c877713446c7bd3e6944641227bdb4165ecb8d684ec2ef66c817e65e77c52cc50e62ed.wav'
'/home/joan/projectes/t001_01591.wav'
'/home/joan/projectes/t001_02452.wav'
'/home/joan/projectes/t001_02689.wav'
'/home/joan/projectes/t001_02992.wav'
'/home/joan/projectes/t001_02f7d61edf5063ca42953b1068539f1572985aa9448555cfd8d7667121eeedc72c912d95cf33abf61a1f9620f2a01be4251a53aa5440d15849003fb31210d830.wav'
'/home/joan/projectes/t001_03115.wav'
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu.", speaker="jan", file_path=f"/home/joan/projectes/t001_jan.wav")
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu.", speaker="mar", file_path=f"/home/joan/projectes/t001_mar.wav")
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu.", speaker="ona", file_path=f"/home/joan/projectes/t001_ona.wav")
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu.", speaker="pau", file_path=f"/home/joan/projectes/t001_pau.wav")
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu.", speaker="pep", file_path=f"/home/joan/projectes/t001_pep.wav")
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu.", speaker="pol", file_path=f"/home/joan/projectes/t001_pol.wav")
tts.tts_to_file(text="Bon dia, això és una prova de síntesi de veu.", speaker="teo", file_path=f"/home/joan/projectes/t001_teo.wav")
La qualitat no és molt bona:
-La llibreria original TTS de Coqui ja no es manté, perquè l'empresa va tancar. El fork mantingut és coqui-tts (pip install coqui-tts), que funciona amb el mateix codi i sol donar menys problemes amb versions noves de Python i PyTorch.
-El Projecte AINA (BSC) ha publicat models catalans més recents a Hugging Face, com Matxa amb el vocoder alVoCat, que tenen diversos accents i solen sonar més naturals. No es carreguen amb TTS(...): tenen el seu propi codi d'inferència.
---
Un codi més complet és el que em proposa Claude: (que és el model del projecte AINA (BSC))
pip install huggingface_hub
script prova.py:
import glob
from huggingface_hub import snapshot_download
from TTS.utils.synthesizer import Synthesizer
# Baixa el model (només cal la primera vegada, es queda en cau)
model_dir = snapshot_download(repo_id="projecte-aina/tts-ca-coqui-vits-multispeaker")
# Localitza els fitxers dins la carpeta "model"
config_path = f"{model_dir}/model/config.json"
speakers_path = glob.glob(f"{model_dir}/model/speakers*.pth")[0]
checkpoint_candidates = [
p for p in glob.glob(f"{model_dir}/model/*.pth")
if "speakers" not in p
]
model_path = checkpoint_candidates[0]
print("Checkpoint:", model_path)
print("Config:", config_path)
print("Speakers:", speakers_path)
synthesizer = Synthesizer(
model_path, config_path, speakers_path, None, None, None,
use_cuda=True,
)
# Mostra els parlants disponibles
print("Parlants disponibles:", synthesizer.tts_model.speaker_manager.speaker_names[:10])
text = "Bon dia! Això és una prova de síntesi de veu en català."
speaker = synthesizer.tts_model.speaker_manager.speaker_names[0]
wav = synthesizer.tts(text, speaker_name=speaker)
synthesizer.save_wav(wav, "prova.wav")
print("Fet! Genera't: prova.wav")
dóna un error que el Claude el sap solucionar:
Substitueix la crida al Synthesizer per:
synthesizer = Synthesizer(
tts_checkpoint=model_path,
tts_config_path=config_path,
tts_speakers_file=speakers_path,
use_cuda=True,
)
Puc provar amb els parlants:
'mar' (833), 'ona'(834), 'pau'(835), 'pep'(836), 'pol'(837), 'teo'(838), 'uri'(839)
hi ha 840 parlants.
per tant els índex d'aquests són
833, 834, 835, 836, 837, 838, 839
Els parlants de Festcat (ona, pau…) i d'OpenSLR tenen hores de gravació d'estudi. Són les veus més netes i estables.
aquestes veus (Festcat) es corresponen totes a parlants de català central. uri seria una mica unisex.
Però n'hi ha moltes d'altres de veus (840 parlants)
Sobre les 840 veus
La fitxa del model parla de 255 parlants, però tu en veus 840. No ho he trobat documentat, però és habitual en models de Coqui que el fitxer speakers.pth inclogui tots els identificadors que apareixien a les dades de partida. Això no vol dir que tots tinguin prou material d'entrenament. A Common Voice molts voluntaris només han gravat unes poques frases, i és probable que el model hagi après molt poc d'aquests parlants.
A la pràctica, això fa que la qualitat sigui molt desigual:
Els parlants de Festcat (ona, pau…) i d'OpenSLR tenen hores de gravació d'estudi. Són les veus més netes i estables.
Els parlants de Common Voice amb moltes gravacions poden sonar bé, però amb el soroll i la variabilitat de gravacions casolanes.
Els parlants amb molt poques gravacions sovint sonen genèrics, inestables o amb artefactes.
editar el config.json
ls -la /home/joan/.cache/huggingface/hub/models--projecte-aina--tts-ca-coqui-vits-multispeaker/snapshots/b90a4d6a94475a367ec4be8b9fca14e348240b6d/model/config.json
joe /home/joan/.cache/huggingface/hub/models--projecte-aina--tts-ca-coqui-vits-multispeaker/snapshots/b90a4d6a94475a367ec4be8b9fca14e348240b6d/model/config.json
python3 prova.py
Finalment ha funcionat!
...
7955f7d04b0a4ba49c653677f215265658afde6e89fdd2391eb714531056']
Fet! Genera't: prova.wav
I ara sí que se sent molt bé!
Per tant, ja tinc un codi per fer síntesi de veu en català amb una veu molt bona
Puc provar els altres speaker_names i els altres models
he provat fins a 15 veus, i sembla ser que encara n'hi ha més. El model que he provat és: tts-ca-coqui-vits-multispeaker
https://huggingface.co/projecte-aina/tts-ca-coqui-vits-multispeaker
https://huggingface.co/spaces/softcatala/comparativa-tts-catala
=================
Síntesi amb la meva veu (part II) -> aquí s'ha d'ajuntar amb el document del servidor
https://claude.ai/chat/a77d2c6c-1051-4733-a6a8-31c5abe7b322
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 timple a la veu de mostra que se li passa.
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
pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128
4. Dependències — vigila amb fairseq
sudo apt install build-essential
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).
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)
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?
el script que he d'executar no es diu infer-web.py sinó:
$ find . -maxdepth 2 -iname "*web*.py"
./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
...
ssh -L 7860:localhost:7860 joan@79.156.157.3 -> però això no funciona perquè en el router no tinc obert el port 7860. He de fer la prova en local (servidor) on en la xarxa local de casa.
(TODO)
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
=================
=== Model multidialectal===
m'he generat les veus dels 840 speakers (script prova.py), i després de mirar els 30 primers, tots es corresponen de moment a català central. Espero trobar entre les veus accent de Lleida, de València i de Mallorca. Estic fent alguna cosa malament, espero trobar diversitat dialectal
No estàs fent res malament. És una limitació del model: amb aquest model no trobaràs accents diferents del central, i és normal que no aparegui la diversitat que busques.
Per què totes les veus sonen a català central
El model no llegeix el text directament. Primer el converteix en fonemes amb espeak-ng configurat amb l'idioma ca, i aquesta transcripció segueix la pronúncia del català central. Per tant, trets com la reducció vocàlica (a/e àtones → [ə]) o la -r final muda ja vénen decidits abans d'arribar a la veu.
El parlant escollit només canvia el timbre, el to i una mica la prosòdia. Encara que el parlant original fos de València o de Mallorca, el model li fa pronunciar els fonemes centrals, i el resultat és una veu valenciana "llegint en central". A més, a Common Voice els parlants de català central són clarament majoritaris, cosa que reforça aquest biaix.
L'alternativa: un model multidialectal
El BSC ha publicat Matxa, un model pensat precisament per això. Funciona juntament amb el vocoder alVoCat i genera veu en quatre dialectes: balear, central, nord-occidental i valencià. Té dues veus per dialecte:
huggingface
Accent Veus (speaker_id) Cleaner
Balear quim (0), olga (1) catalan_balear_cleaners
Central grau (2), elia (3) catalan_cleaners
Nord-occidental (Lleida) pere (4), emma (5) catalan_occidental_cleaners
Valencià lluc (6), gina (7) catalan_valencia_cleaners
Podem escoltar totes les veus aquí:
https://huggingface.co/spaces/projecte-aina/matxa-alvocat-tts-ca
Existeix una versió 2 del model, basada en grafemes, que cobreix 5 dialectes. Com que ja no depèn d'espeak, probablement és més fàcil d'instal·lar. Val la pena mirar-la primer.
Què dóna més bon resultat, la versió 1 o la versió 2?
Leída una página
https://huggingface.co/BSC-LT/matxa-tts-v2-ca-multiaccent-graphemes
Leída una página
Per al teu cas, probablement la versió 2, tot i que no hi ha cap comparació publicada directament entre les dues versions.
Què diuen les dades
El BSC compara la v2 (basada en grafemes) amb el mateix model entrenat amb fonemes, no pas amb la v1. Els resultats són:
Qualitat d'àudio: la versió amb fonemes treu una mica més de puntuació (ScoreQ 3,37 i 3,46 davant de 3,29 i 3,30 per a la de grafemes). La diferència és petita.
Intel·ligibilitat: la versió amb grafemes s'entén clarament millor, amb una taxa d'error de paraules d'aproximadament 9,4 i 9,2, davant de 12,4 i 11,5.
És a dir, la de grafemes s'entén millor i la seva qualitat d'àudio és comparabl
Més veus i més dialectes. A més de les 8 veus de la v1, n'afegeix més. Hi ha 16 veus en total:
Accent Veus (ID a la v2)
Balear Olga (0->1), Quim (1->0), BM (10)
Central Elia (2->3), Grau (3->2), CF (11), CM (12)
Nord-occidental Emma (4->5), Pere (5->4), Estel (13)
Valencià Gina (6), Lluc (7), Arnau (8), Berta (9)
Septentrional Laura (14), Jordi (15)
Tot són gravacions d'estudi. El model s'ha entrenat des de zero amb LaFresCat i altres enregistraments catalans multiaccent de qualitat d'estudi (ReFresCat i EnVeuAlta).
Més fàcil d'instal·lar. No necessita fonemitzador, així que t'estalvies compilar espeak-ng. També té millores d'arquitectura: un descodificador més gran i un filtre de soroll aplicat en la inferència.
Està documentat aquí:
https://huggingface.co/BSC-LT/matxa-tts-v2-ca-multiaccent-graphemes
1. Crea i activa el venv
cd ~/veu-catala
python3 -m venv venv-matxa-v2
source venv-matxa-v2/bin/activate
pip install --upgrade pip
2. Clona la branca de la v2
git clone -b v2-graphemes --single-branch https://github.com/langtech-bsc/Matcha-TTS.git
cd Matcha-TTS
3. Instal·la Cython i numpy abans que res
pip install Cython numpy
5. Instal·la el paquet
pip install -e .
6. Genera el primer àudio
La primera vegada, el script descarrega automàticament el model i el vocoder alVoCat de Hugging Face:
python matxa_graphemes_alvocat_inference.py \
BSC-LT/matxa-tts-v2-ca-multiaccent-graphemes \
projecte-aina/alvocat-vocos-22khz \
--output_path /home/joan/projectes \
--text_input "Bon dia, això és una prova de síntesi de veu en català." \
--speaker_id 6 # Gina valencià D
Pots ajustar la síntesi amb aquests paràmetres:
--length_scale controla la velocitat. Per defecte val 0,9, i com més alt, més lent.
--temperature controla la variabilitat de l'entonació. Per defecte val 0,7.
script per fer la comparativa de totes les veus:
python genera_veus.py
python genera_veus.py --text "La seva gerra sembla molt antiga." --output_dir proves
python genera_veus.py --veus 6 7 8 9 # només les valencianes
python genera_veus.py --length_scale 1.0 # una mica més lent
python genera_veus.py --text "La seva gerra sembla molt antiga." --output_dir /home/joan/projectes