Integració de Speech Dispatcher amb Piper TTS (veu Ona, UPC) a Deepin

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ó

ComponentPaper
FirefoxClient que demana síntesi de veu a Speech Dispatcher
Speech DispatcherDaemon intermediari (0.11.5)
sd_genericMòdul genèric de Speech Dispatcher que executa ordres externes
piper-spdScript pont: rep text, truca a Docker, retorna WAV
Piper (Docker)Motor TTS al port 10200 (protocol Wyoming)
Veu ca_ES-upc_ona-mediumVeu 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)

  1. Mòdul sd_generic no localitzable → Resulta que es troba a /usr/lib/speech-dispatcher-modules/ (sense subdirectori intermedi).
  2. Speech Dispatcher es negava a arrencar → El directori de depuració /tmp/speechd-debug bloquejava l’inici; cal esborrar-lo abans d’arrencar.
  3. Error --voice is required for the piper backend (Docker) → Calia especificar PIPER_VOICE=ca_ES-upc_ona-medium en crear el contenidor.
  4. aplay dins del contenidor no funcionava → La síntesi es fa al contenidor i la reproducció a l’amfitrió.
  5. Error «The module does not have any voice configured» → Faltava la secció AddVoice a 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)

  1. 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
  1. Instal·lar Speech Dispatcher:sudo apt install speech-dispatcher -y
  2. 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)

  1. Reiniciar:
rm -rf /tmp/speechd-debug
pkill -9 -f speech-dispatcher
sleep 1
speech-dispatcher
  1. 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 afegir AddVoice "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ó! 🎙️😊