Piper TTS (voix neuronales de haute qualité)

Piper est un moteur de synthèse vocale moderne utilisant des réseaux de neurones pour produire des voix très naturelles, proches de l'humain. Il est totalement hors-ligne et rapide.

Installation

Script automatique (recommandé)

Ce script installe Piper, télécharge les voix françaises et configure Speech Dispatcher pour qu'il utilise Piper par défaut. Il fonctionne sur Ubuntu 24.04 avec Speech Dispatcher 0.12.

#!/bin/bash
# Installation de Piper TTS avec Speech-Dispatcher sur Ubuntu 24.04
 
set -e
 
# --- Configuration ---
PIPER_VERSION="2023.11.14-2"
INSTALL_DIR="$HOME/.local/share/speech-dispatcher-piper"
VOICES_DIR="$INSTALL_DIR/voices"
PIPER_BIN="$INSTALL_DIR/piper/piper"
VOICE_BASE_URL="https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR"
DEFAULT_VOICE="fr_FR-siwis-medium"
 
echo "[1/6] Installation des dépendances..."
sudo apt-get update -qq
sudo apt-get install -y -qq alsa-utils pulseaudio-utils curl wget speech-dispatcher
 
echo "[2/6] Téléchargement de Piper..."
mkdir -p "$INSTALL_DIR"
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
PIPER_ARCHIVE="piper_linux_${ARCH}.tar.gz"
PIPER_URL="https://github.com/rhasspy/piper/releases/download/${PIPER_VERSION}/${PIPER_ARCHIVE}"
 
if [ ! -f "$PIPER_BIN" ]; then
    wget -q --show-progress "$PIPER_URL" -O "/tmp/$PIPER_ARCHIVE"
    tar -xzf "/tmp/$PIPER_ARCHIVE" -C "$INSTALL_DIR"
    rm "/tmp/$PIPER_ARCHIVE"
fi
 
echo "[3/6] Création du lien symbolique..."
sudo ln -sf "$PIPER_BIN" /usr/local/bin/piper
 
echo "[4/6] Téléchargement des voix françaises..."
mkdir -p "$VOICES_DIR"
 
for VOICE in "fr_FR-siwis-medium siwis/medium" "fr_FR-upmc-medium upmc/medium"; do
    NAME=$(echo $VOICE | cut -d' ' -f1)
    PATH_HF=$(echo $VOICE | cut -d' ' -f2)
    if [ ! -f "$VOICES_DIR/${NAME}.onnx" ]; then
        wget -q --show-progress \
            "${VOICE_BASE_URL}/${PATH_HF}/${NAME}.onnx" -O "$VOICES_DIR/${NAME}.onnx"
        wget -q --show-progress \
            "${VOICE_BASE_URL}/${PATH_HF}/${NAME}.onnx.json" -O "$VOICES_DIR/${NAME}.onnx.json"
    fi
done
 
SAMPLE_RATE=$(grep -o '"sample_rate": *[0-9]*' "$VOICES_DIR/${DEFAULT_VOICE}.onnx.json" | grep -o '[0-9]*')
 
echo "[5/6] Configuration de Speech-Dispatcher..."
 
sudo tee /etc/speech-dispatcher/modules/piper.conf > /dev/null << PIPER_CONF
# Module Piper pour Speech-Dispatcher — généré automatiquement
# Utilise paplay (PulseAudio) pour compatibilité avec Firefox et autres applications
 
GenericExecuteSynth "printf '%s' '\$DATA' | /usr/local/bin/piper --model ${VOICES_DIR}/\$VOICE.onnx --output-raw | paplay --raw --rate=${SAMPLE_RATE} --format=s16le --channels=1"
 
# Les deux formes sont nécessaires : speech-dispatcher envoie parfois "fr", parfois "fr-fr"
# selon l'application appelante (ex: spd-say envoie "fr", Firefox envoie "fr-fr")
AddVoice "fr"    "FEMALE1" "fr_FR-siwis-medium"
AddVoice "fr-fr" "FEMALE1" "fr_FR-siwis-medium"
AddVoice "fr"    "MALE1"   "fr_FR-upmc-medium"
AddVoice "fr-fr" "MALE1"   "fr_FR-upmc-medium"
 
GenericDefaultVoice "fr_FR-siwis-medium"
 
GenericRateAdd 0
GenericPitchAdd 0
GenericVolumeAdd 0
GenericRateMultiply 1
GenericPitchMultiply 1
GenericVolumeMultiply 1
PIPER_CONF
 
# Activer piper dans speechd.conf
if ! grep -q '^AddModule "piper"' /etc/speech-dispatcher/speechd.conf; then
    sudo sed -i 's|^#AddModule "espeak-ng".*|&\nAddModule "piper"                    "sd_generic"   "piper.conf"|' \
        /etc/speech-dispatcher/speechd.conf
fi
sudo sed -i 's|^DefaultModule .*|DefaultModule piper|' /etc/speech-dispatcher/speechd.conf
sudo sed -i 's|^#*DefaultLanguage.*|DefaultLanguage "fr"|' /etc/speech-dispatcher/speechd.conf
sudo sed -i 's|^#* *DefaultVoiceType.*|DefaultVoiceType "FEMALE1"|' /etc/speech-dispatcher/speechd.conf
 
# Supprimer la config utilisateur qui pourrait interférer
if [ -d "$HOME/.config/speech-dispatcher" ]; then
    mv "$HOME/.config/speech-dispatcher" "$HOME/.config/speech-dispatcher.bak"
    echo "  → Config utilisateur sauvegardée dans ~/.config/speech-dispatcher.bak"
fi
 
echo "[6/6] Test..."
pkill -f speech-dispatcher 2>/dev/null; sleep 1
speech-dispatcher
sleep 1
spd-say "Bonjour, Piper est maintenant configuré comme moteur de synthèse vocale par défaut."
 
echo ""
echo "Installation terminée !"
echo "  Voix installées dans : $VOICES_DIR"
echo "  Voix par défaut      : $DEFAULT_VOICE"
echo "  Binaire piper        : /usr/local/bin/piper"

Rendez le script exécutable et lancez-le :

chmod +x install-piper.sh
./install-piper.sh

Installation manuelle

1. Télécharger le binaire Piper

# Détecter l'architecture
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
 
# Télécharger et extraire dans le dossier utilisateur
mkdir -p ~/.local/share/speech-dispatcher-piper
wget https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_${ARCH}.tar.gz \
     -O /tmp/piper.tar.gz
tar -xzf /tmp/piper.tar.gz -C ~/.local/share/speech-dispatcher-piper/
 
# Créer un lien symbolique accessible globalement
sudo ln -sf ~/.local/share/speech-dispatcher-piper/piper/piper /usr/local/bin/piper

2. Télécharger les voix françaises

VOICES_DIR=~/.local/share/speech-dispatcher-piper/voices
mkdir -p "$VOICES_DIR"
BASE=https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR
 
# Voix féminine siwis (medium, recommandée)
wget "${BASE}/siwis/medium/fr_FR-siwis-medium.onnx"      -O "$VOICES_DIR/fr_FR-siwis-medium.onnx"
wget "${BASE}/siwis/medium/fr_FR-siwis-medium.onnx.json" -O "$VOICES_DIR/fr_FR-siwis-medium.onnx.json"
 
# Voix masculine upmc (medium)
wget "${BASE}/upmc/medium/fr_FR-upmc-medium.onnx"        -O "$VOICES_DIR/fr_FR-upmc-medium.onnx"
wget "${BASE}/upmc/medium/fr_FR-upmc-medium.onnx.json"   -O "$VOICES_DIR/fr_FR-upmc-medium.onnx.json"

Test direct de Piper :

printf '%s' "Bonjour, ceci est une voix neuronale de haute qualité" | \
  piper --model ~/.local/share/speech-dispatcher-piper/voices/fr_FR-siwis-medium.onnx \
        --output-raw | paplay --raw --rate=22050 --format=s16le --channels=1

3. Configurer Speech Dispatcher

Éditez /etc/speech-dispatcher/modules/piper.conf avec les droits d'administration :

/etc/speech-dispatcher/modules/piper.conf
# Module Piper pour Speech-Dispatcher (sd_generic)
# Utilise paplay (PulseAudio) — compatible Firefox et autres applications
 
GenericExecuteSynth "printf '%s' '$DATA' | /usr/local/bin/piper --model /home/VOTRE_USER/.local/share/speech-dispatcher-piper/voices/$VOICE.onnx --output-raw | paplay --raw --rate=22050 --format=s16le --channels=1"
 
# IMPORTANT : déclarer les voix avec "fr" ET "fr-fr"
# speech-dispatcher envoie l'un ou l'autre selon l'application appelante
AddVoice "fr"    "FEMALE1" "fr_FR-siwis-medium"
AddVoice "fr-fr" "FEMALE1" "fr_FR-siwis-medium"
AddVoice "fr"    "MALE1"   "fr_FR-upmc-medium"
AddVoice "fr-fr" "MALE1"   "fr_FR-upmc-medium"
 
GenericDefaultVoice "fr_FR-siwis-medium"
 
GenericRateAdd 0
GenericPitchAdd 0
GenericVolumeAdd 0
GenericRateMultiply 1
GenericPitchMultiply 1
GenericVolumeMultiply 1

Puis dans /etc/speech-dispatcher/speechd.conf, ajoutez ou décommentez :

AddModule "piper"      "sd_generic"   "piper.conf"
DefaultModule piper
DefaultLanguage "fr"
DefaultVoiceType "FEMALE1"

Redémarrez Speech Dispatcher :

pkill -f speech-dispatcher; sleep 1; speech-dispatcher

Testez :

spd-say "Bonjour, ceci est un test de synthèse vocale avec Piper"

Voix françaises disponibles

Identifiant Genre Qualité Taille approximative
fr_FR-siwis-medium Féminine Bonne (recommandée) ~50 Mo
fr_FR-siwis-low Féminine Rapide (embarqué) ~15 Mo
fr_FR-upmc-medium Masculine Bonne ~50 Mo
fr_FR-gilles-low Masculin Rapide (embarqué) ~15 Mo

Toutes les voix disponibles : HuggingFace rhasspy/piper-voices

Points importants

Bug fréquent : voix "fr" vs "fr-fr"
Speech Dispatcher envoie parfois le code langue fr et parfois fr-fr selon l'application appelante (spd-say envoie fr, Firefox envoie fr-fr). Il est indispensable de déclarer les voix avec les deux formes dans piper.conf, sinon $VOICE reste à no_voice et piper ne produit aucun son.
Conflit audio avec Firefox (et autres navigateurs)
aplay accède directement à ALSA et échoue si Firefox tient déjà le périphérique audio. Utilisez toujours paplay (PulseAudio) qui permet le mixage entre plusieurs applications simultanées.
Config utilisateur vs config système
Si le dossier ~/.config/speech-dispatcher/ existe, il est prioritaire sur /etc/speech-dispatcher/. Une ancienne configuration utilisateur peut interférer et écraser les bons paramètres. En cas de problème, supprimez ou renommez ce dossier :
mv ~/.config/speech-dispatcher ~/.config/speech-dispatcher.bak

Intégration avec Firefox

Firefox utilise Speech Dispatcher pour son mode lecture. Une fois Piper configuré :

  1. Vérifiez dans about:config que media.webspeech.synth.enabled est à true
  2. Ouvrez une page d'article et activez le Mode Lecture (icône dans la barre d'adresse)
  3. Cliquez sur l'icône Lecture à voix haute dans la barre latérale gauche

Firefox devrait lire avec la voix Piper configurée.

Dépannage

Aucun son avec spd-say :

# Lancer en mode debug pour voir les erreurs
sudo rm -rf /tmp/speechd-debug
pkill -f speech-dispatcher; sleep 1
speech-dispatcher -s -l 5 -D &
sleep 2
spd-say "test"
sleep 3
pkill -f speech-dispatcher
# Chercher la commande réellement exécutée
grep "synth command\|no_voice" /tmp/speechd-debug/piper.log

Si vous voyez no_voice dans les logs, c'est que la voix n'est pas trouvée pour le code langue envoyé. Vérifiez que les deux formes fr et fr-fr sont bien déclarées dans piper.conf.

Tester Piper directement :

printf '%s' 'Bonjour' | /usr/local/bin/piper \
  --model ~/.local/share/speech-dispatcher-piper/voices/fr_FR-siwis-medium.onnx \
  --output-raw | paplay --raw --rate=22050 --format=s16le --channels=1

Si cette commande fonctionne mais pas spd-say, le problème est dans la configuration Speech Dispatcher.

Voir aussi