⭐Muntatge d’un servidor TTS local amb veu catalana (Ona, UPC) a Deepin

🎯 Objectius

L’objectiu del projecte es doble:

  1. Instal·lar un servidor local de síntesi de veu (TTS) accessible a http://127.0.0.1:8765/, amb capacitat de conversa (STT + LLM + TTS).
  2. Disposar d’una veu en català d’alta qualitat per a proves i integració, de manera que el sistema es pugui reproduir en altres punts de treball amb audio.

El resultat final combina dues eines complementàries:

  • speech-to-speech (servidor conversacional complet, port 8765)
  • Piper TTS amb la veu Ona de la UPC (port 10200)

 docker exec piper bash -c "echo \"Hola, soc l'Ona, la meva veu s'ha desenvolupat a la UPC de Barcelona.\" | piper --model /config/ca_ES-upc_ona-medium.onnx --output_file -" | aplay -f S16_LE -r 22050 -c 1
Playing WAVE 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono

📦 Fase 1 — Preparació de l’entorn

Sistema: Deepin (basat en Debian)

sudo apt update
sudo apt install python3 python3-pip python3-venv git docker.io -y

Creació de l’entorn virtual i instal·lació del paquet conversacional:

mkdir -p ~/tts-server && cd ~/tts-server
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install speech-to-speech

🚀 Fase 2 — Primer arrencada del servidor speech-to-speech

speech-to-speech

Resultats de la primera execució:

  • ✅ Descarrega automàtica de dependències (NLTK, Silero VAD)
  • ✅ Descarrega del model de reconeixement de veu Parakeet TDT (nvidia/parakeet-tdt-0.6b-v3, ~230 MB)
  • ✅ Model desat en memòria cau (~/.cache/huggingface)

Incidents detectats:

  • ⚠️ Mòdul opcional DeepFilterNet no disponible (millora d’àudio, no crític)
  • ⚠️ Avís de HF_TOKEN (només per a límits de descàrrega, no impedeix el funcionament)

Observació important: el servidor escolta en protocol WebSocket a ws://127.0.0.1:8765/v1/realtime, no és un endpoint HTTP clàssic, per tant curl no és el client adequat per provar-lo.


🐳 Fase 3 — Instal·lació de Docker a Deepin

Per al desplegament lleuger del TTS, vam instal·lar Docker:

sudo systemctl enable --now docker
sudo usermod -aG docker $USER
newgrp docker   # activa el grup a la sessió actual

Prova de verificació:

docker run hello-world

✅ Resposta: «Hello from Docker!» → instal·lació correcta.


🗣️ Fase 4 — Piper TTS amb veu catalana (Ona, UPC)

Creació del contenidor amb la veu catalana:

docker run -d \
  --name piper \
  -p 10200:10200 \
  -e PIPER_VOICE=ca_ES-upc_ona-medium \
  --restart unless-stopped \
  linuxserver/piper

Incident resolt: a la primera creació sense PIPER_VOICE, el contenidor fallava amb l’error --voice is required for the piper backend. Calia especificar la veu mitjançant la variable d’entorn.

Logs d’èxit:

INFO:wyoming_piper.download:Downloaded /config/ca_ES-upc_ona-medium.onnx
INFO:__main__:Ready
Connection to localhost (127.0.0.1) 10200 port [tcp/*] succeeded!

✅ Veu Ona (ca_ES-upc_ona-medium, desenvolupada a la UPC de Barcelona) descarregada i carregada.


🔊 Fase 5 — Prova de síntesi de veu

Síntesi directa dins del contenidor:

docker exec piper bash -c "echo 'Hola, soc l'Ona, la meva veu s'ha desenvolupat a la UPC de Barcelona.' | piper --model /config/ca_ES-upc_ona-medium.onnx --output_file /config/prova.wav"

Extracció i reproducció:

docker cp piper:/config/prova.wav ~/prova.wav
aplay ~/prova.wav

Per fer que l’àudio soni directament pels altaveus en lloc de guardar-lo en un fitxer,

docker exec piper bash -c "echo \"Hola, soc l'Ona, la meva veu s'ha desenvolupat a la UPC de Barcelona.\" | piper --model /config/ca_ES-upc_ona-medium.onnx --output_file -" | aplay -f S16_LE -r 22050 -c 1

Despres d’un canvi de sessió o inicialització pot arrancar així:

Aquí tens la comanda modificada utilitzant aplay (el reproductor estàndard d’ALSA a Linux):


✅ Fitxer WAV generat correctament: 220 kB, 22.050 Hz, 16 bits, mono
⚠️ La reproducció d’àudio no es va poder verificar en aquest equip per manca de sortida d’àudio.


📊 Resultats finals

ServeiPortProtocolEstat
speech-to-speech (STT+LLM+TTS)8765WebSocket (/v1/realtime)✅ Instal·lat (models en cau)
Piper TTS (veu Ona, català)10200Wyoming✅ Funcionant
Docker✅ Operatiu

Arxius i ubicacions clau:

  • Entorn virtual: ~/tts-server/venv
  • Cau de models HuggingFace: ~/.cache/huggingface
  • Model de veu: /config/ca_ES-upc_ona-medium.onnx (dins del contenidor)
  • Àudio de prova: ~/prova.wav

🔄 Fases de reproducció en un altre punt de treball

  1. Instal·lar dependències: python3-venv, git, docker.io
  2. Crear l’entorn virtual i instal·lar speech-to-speech
  3. Arrencar el servidor conversacional: speech-to-speech (port 8765)
  4. Instal·lar Docker i afegir l’usuari al grup
  5. Crear el contenidor Piper amb PIPER_VOICE=ca_ES-upc_ona-medium (port 10200)
  6. Verificar amb els logs: missatge Ready i connexió al port 10200
  7. Prova de síntesi: docker exec piper ... | piper --model ... --output_file ...

🚀 Properes passes (ampliació prevista)

  • Desplegament al Synology (192.168.1.49) mitjançant el Centre de paquets → Container Manager, replicant el contenidor Piper al port 10200.
  • Integració amb Home Assistant (protocol Wyoming compatible).
  • Prova d’àudio a un equip amb sortida d’àudio per validar la qualitat de la veu.
  • Exploració d’altres veus del catàleg de Piper (ca_ES-upc_pau-medium, masculina).

Depèn de què vulguis fer exactament:

🔁 Opció 1: Tancar sessió gràficament (Deepin)

  1. Fes clic a la icona d’engegada/apagada (a la safata del sistema, a la part inferior dreta de la pantalla, o a l’extrem superior dret).
  2. Selecciona «Tanca la sessió» (o Log Out).
  3. A la pantalla d’inici de sessió, selecciona el teu usuari i escriu la contrasenya.

💡 També pots fer servir la drecera de teclat Ctrl + Alt + Del (en algunes versions obre el menú amb l’opció de tancar sessió).


🔄 Opció 2: Simplement reiniciar l’ordinador

Si et surt més a compte:

sudo reboot

✅ Què passa quan tornis a entrar?

ServeiEs reinicia sol?
Docker✅ Sí (servei del sistema)
Contenidor Piper✅ Sí (té --restart unless-stopped)
Servidor speech-to-speech (port 8765)❌ No — l’has d’engegar manualment

Per engegar el servidor conversacional després de reiniciar:

cd ~/tts-server && source venv/bin/activate && speech-to-speech

🧪 Verifica que tot va bé després d’entrar

# Docker i el teu grup
groups | grep docker

# El contenidor Piper en marxa
docker ps | grep piper

Si surt docker a la primera comanda i el contenidor piper apareix com a Up, tot està correcte! ✅

Vols que et creï un script d’inici automàtic perquè el servidor de 8765 també s’engegui sol en entrar a la sessió? 😊


🎓 Conclusions

  • La instal·lació d’un TTS en català és viable amb eines de codi obert (Piper + veus de la UPC), sense necessitat de serveis externs.
  • La combinació speech-to-speech + Piper cobreix tant el cas d’ús conversacional complet (WebSocket 8765) com el de síntesi lleugera i fiable (Wyoming 10200).
  • L’ús de Docker garanteix la portabilitat i la reproductibilitat entre equips i fins i tot en NAS com el Synology.
  • La veu Ona de la UPC ofereix una síntesi en català de bona qualitat i és la candidata principal per al desplegament final.

Crèdits: projecte realitzat amb assistència de UOS AI sobre Deepin Desktop Environment.


Espero que et vagi molt bé al blog! 📖 Si vols, també et puc preparar una versió en Markdown més curta per a xarxes socials, o una guia PDF amb captures. Gràcies a tu per la paciència i bona feina! 😊