Data: 12 de setembre de 2026 — Estat actual del projecte
🎯 Objectiu
Aconseguir que Firefox pugui llegir pàgines web en català amb la veu Ona (UPC) mitjançant la cadena:
Firefox → Speech Dispatcher → mòdul genèric (sd_generic) → script pont → Piper (Docker) → Veu Ona
El repte: Speech Dispatcher no detecta cap veu per defecte (0 veus), perquè Piper no és un motor TTS natiu de Speech Dispatcher.
🏗️ Arquitectura de la solució
| Component | Paper |
|---|---|
| Firefox | Client que demana síntesi de veu a Speech Dispatcher |
| Speech Dispatcher | Daemon intermediari (0.11.5) |
sd_generic | Mòdul genèric de Speech Dispatcher que executa ordres externes |
piper-spd | Script pont: rep text, truca a Docker, retorna WAV |
| Piper (Docker) | Motor TTS al port 10200 (protocol Wyoming) |
Veu ca_ES-upc_ona-medium | Veu catalana d’Ona, desenvolupada a la UPC |
📂 Fitxers creats
1. Script pont /usr/local/bin/piper-spd
Rep el text de Speech Dispatcher, el passa al contenidor Piper i genera el fitxer WAV:
#!/bin/bash
# piper-spd: pont entre Speech Dispatcher i Piper TTS (veus UPC)
MODEL="/config/ca_ES-upc_ona-medium.onnx"
OUTPUT=""
TEXT=""
VOICE="${VOICE:-ona}"
while [ $# -gt 0 ]; do
case "$1" in
-o) OUTPUT="$2"; shift 2;;
-l|--list)
echo "ona ca_ES medium"
echo "pau ca_ES medium"
exit 0;;
-*) shift;;
*) TEXT="$TEXT $1"; shift;;
esac
done
[ -z "$OUTPUT" ] && { echo "Error: falta -o FITXER" >&2; exit 1; }
case "$VOICE" in
pau) MODEL="/config/ca_ES-upc_pau-medium.onnx";;
*) MODEL="/config/ca_ES-upc_ona-medium.onnx";;
esac
if ! docker ps --format '{{.Names}}' | grep -q '^piper$'; then
echo "Error: el contenidor piper no està en marxa" >&2
exit 1
fi
docker exec piper bash -c "printf '%s' \"$TEXT\" | piper --model $MODEL --output_file /tmp/piper_spd.wav" 2>/dev/null
if ! docker cp piper:/tmp/piper_spd.wav "$OUTPUT" 2>/dev/null; then
echo "Error: no s'ha pogut generar l'àudio" >&2
exit 1
fi
docker exec piper rm -f /tmp/piper_spd.wav 2>/dev/null
exit 0
2. Configuració del mòdul /etc/speech-dispatcher/modules/piper-generic.conf
GenericExecuteSynth "VOICE=$VOICE /usr/local/bin/piper-spd -o $FILE $TEXT" GenericSsmlMode "off" GenericLanguage "ca" "ca" AddVoice "ca" "FEMALE1" "ona" defaultVoice "ona"
3. Registre a /etc/speech-dispatcher/speechd.conf
AddModule "piper" "sd_generic" "/etc/speech-dispatcher/modules/piper-generic.conf"
🧗 Obstacles superats (i com es van resoldre)
- Mòdul
sd_genericno localitzable → Resulta que es troba a/usr/lib/speech-dispatcher-modules/(sense subdirectori intermedi). - Speech Dispatcher es negava a arrencar → El directori de depuració
/tmp/speechd-debugbloquejava l’inici; cal esborrar-lo abans d’arrencar. - Error
--voice is required for the piper backend(Docker) → Calia especificarPIPER_VOICE=ca_ES-upc_ona-mediumen crear el contenidor. aplaydins del contenidor no funcionava → La síntesi es fa al contenidor i la reproducció a l’amfitrió.- Error «The module does not have any voice configured» → Faltava la secció
AddVoicea la configuració del mòdul genèric. Aquest era el pas definitiu! ✅
✅ Estat actual
- Docker instal·lat i operatiu a Deepin
- Piper TTS funcionant al port 10200 amb la veu Ona
- Speech Dispatcher arrenca amb el mòdul piper registrat
- Script pont validat (genera WAV de ~90 kB correctament)
- Veus definides al mòdul (
AddVoice "ca" "FEMALE1" "ona") - Prova final d’àudio pendent en un equip amb sortida de so
- Prova a Firefox pendent (mode lectura → «Llegir en veu alta»)
🔧 Proves de verificació
# 1. Mòduls de sortida (ha d'aparèixer "piper") spd-say -O # 2. Veus disponibles spd-say -o piper -L # 3. Síntesi amb l'Ona spd-say -o piper "Hola, soc l'Ona, la meva veu s'ha desenvolupat a la UPC de Barcelona"
🔄 Guia de reproducció (en un altre punt de treball)
- Instal·lar Docker i engegar el contenidor Piper: podem primer eliminar piper
docker rm -f piper
docker run -d --name piper -p 10200:10200 -e PIPER_VOICE=ca_ES-upc_ona-medium --restart unless-stopped linuxserver/piper
- Instal·lar Speech Dispatcher:
sudo apt install speech-dispatcher -y - Crear els 2 fitxers i modificar linia de /etc/speech-dispatcher/speechd.conf.
# el fitxers estan descrits més amunt
# Acció Fitxer
1 Crear script sudo nano /usr/local/bin/piper-spd
2 Crear config del mòdul sudo nano /etc/speech-dispatcher/modules/piper.conf
3 Afegir línia AddModule "piper" "sd_generic" "piper-spd" /etc/speech-dispatcher/speechd.conf ⬅️ (no al piper.conf)
- Reiniciar:
rm -rf /tmp/speechd-debug
pkill -9 -f speech-dispatcher
sleep 1
speech-dispatcher
- Provar amb les ordres de verificació.
spd-say -o piper -y ca_ES-upc_ona-medium "Hola, sóc l'Ona, la veu del Piper."
🚀 Properes passes
- Baixar la veu
pau(masculina, UPC) i afegirAddVoice "ca" "MALE1" "pau"al mòdul. - Prova final a un equip amb àudio i validació a Firefox (mode lectura).
- Automatització de l’arrencada de Speech Dispatcher a l’inici de sessió.
- Portabilitat al Synology (192.168.1.49) replicant el contenidor Piper.
🎓 Conclusions
- La integració de Piper amb Speech Dispatcher és possible mitjançant el mòdul genèric (
sd_generic) amb un script pont, sense necessitat de compilar cap extensió nativa. - El punt crític va ser la definició de veus (
AddVoice) — sense ella, el mòdul no pot inicialitzar-se. - El resultat permetrà que qualsevol aplicació que parli amb Speech Dispatcher (Firefox, ORCA, etc.) faci servir la veu Ona en català.
- L’ús de Docker garanteix la portabilitat entre equips i plataformes (inclòs Synology).
Crèdits: projecte realitzat amb assistència de UOS AI sobre Deepin Desktop Environment.
Espero que et sigui útil al blog! Si quan el reprodueixis al punt de treball amb so veus algun detall a afinar (qualitat, volum, etc.), ho ajustem. Bona sort amb la reproducció! 🎙️😊