Piper TTS (voix neuronales de haute qualité)

Piper est un moteur de synthèse vocal 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

Automatique

Vous pouvez installer le snap Pied, qui devrait installer automatiquement Piper pour vous avec les voix de votre choix et le paramétrer pour être votre moteur par défaut.

Semi-automatique

Ce script va installer Piper, et le paramétrer pour qu’il soit votre lecteur par défaut:

#!/bin/sh
set -e
 
# --- Configuration des voix cibles ---
VOICE_FEMME="fr_FR-siwis-low"
VOICE_HOMME="fr_FR-upmc-medium"
DEFAULT_VOICE=$VOICE_FEMME
 
INSTALL_DIR=${INSTALL_DIR:-~/.local/share/speech-dispatcher-piper}
CONFIG_DIR=${CONFIG_DIR:-~/.config/speech-dispatcher}
MODULES_DIR="$CONFIG_DIR/modules"
SPEECHD_CONF="$CONFIG_DIR/speechd.conf"
CONFIG_PATH="$MODULES_DIR/piper-generic.conf"
PIPER_BIN_GZ_URL="https://github.com/rhasspy/piper/releases/latest/download/piper_linux_$(uname -m).tar.gz"
 
echo "\033[1;36m0. Nettoyage des anciens processus...\033[0m"
killall speech-dispatcher piper sox paplay 2>/dev/null || true
 
echo "\033[1;36m1. Installation des dépendances...\033[0m"
sudo apt -qq update && sudo apt -qq install jq sox curl speech-dispatcher python3-speechd pulseaudio-utils -y
 
mkdir -p "$INSTALL_DIR/voices"
mkdir -p "$MODULES_DIR"
 
echo "\033[1;36m2. Création du script de lecture (Wrapper)...\033[0m"
# Ce script permet de stopper proprement le son si on change de phrase
cat << 'EOF' > "$INSTALL_DIR/play_piper.sh"
#!/bin/bash
DATA="$1"
VOICE="$2"
VOLUME="$3"
RATE="$4"
PITCH="$5"
 
# On récupère automatiquement le dossier du script
BASE_DIR="$(dirname "$0")"
TMP_WAV=$(mktemp /tmp/piper_XXXXXX.wav)
PAP_PID=""
 
# Si la lecture est annulée, on coupe paplay et on nettoie le fichier
trap 'rm -f "$TMP_WAV"; [ -n "$PAP_PID" ] && kill $PAP_PID 2>/dev/null; exit' EXIT TERM INT HUP
 
SAMPLE_RATE=$(jq -r .audio.sample_rate < "$BASE_DIR/voices/$VOICE.onnx.json")
 
# Génération de l'audio
printf "%s" "$DATA" | "$BASE_DIR/piper/piper" --model "$BASE_DIR/voices/$VOICE.onnx" --output_raw 2>/dev/null \
| sox -v "$VOLUME" -r "$SAMPLE_RATE" -c 1 -b 16 -e signed-integer -t raw - -t wav "$TMP_WAV" tempo "$RATE" pitch "$PITCH" norm 2>/dev/null
 
# Lecture
paplay "$TMP_WAV" &
PAP_PID=$!
wait $PAP_PID
EOF
chmod +x "$INSTALL_DIR/play_piper.sh"
 
echo "\033[1;36m3. Configuration de Speech-Dispatcher...\033[0m"
# Déclaration des voix (incluant le français de Belgique 'fr-BE')
echo "DefaultVoice \"$DEFAULT_VOICE\"" > "$CONFIG_PATH"
echo "AddVoice \"fr\" \"FEMALE1\" \"$VOICE_FEMME\"" >> "$CONFIG_PATH"
echo "AddVoice \"fr\" \"MALE1\" \"$VOICE_HOMME\"" >> "$CONFIG_PATH"
echo "AddVoice \"fr-FR\" \"FEMALE1\" \"$VOICE_FEMME\"" >> "$CONFIG_PATH"
 
# Déclaration des commandes
cat << EOF >> "$CONFIG_PATH"
 
GenericCmdDependency "sox"
GenericCmdDependency "jq"
GenericCmdDependency "paplay"
 
GenericExecuteSynth "$INSTALL_DIR/play_piper.sh '\$DATA' '\$VOICE' '\$VOLUME' '\$RATE' '\$PITCH'"
 
GenericRateAdd 1
GenericPitchAdd 1
GenericVolumeAdd 1
GenericRateMultiply 1
GenericPitchMultiply 750
GenericVolumeMultiply 1
EOF
 
# Activation du module dans speechd.conf
if ! [ -f "$SPEECHD_CONF" ]; then spd-conf -n; fi
if ! grep -q "piper-generic" "$SPEECHD_CONF"; then
    echo "\nAddModule \"piper-generic\" \"sd_generic\" \"piper-generic.conf\"" >> "$SPEECHD_CONF"
fi
sed -i 's/^DefaultModule.*/DefaultModule piper-generic/' "$SPEECHD_CONF"
 
echo "\033[1;36m4. Vérification/Téléchargement de Piper (binaires)...\033[0m"
if [ -x "$INSTALL_DIR/piper/piper" ]; then
    echo " > Piper est déjà présent. Téléchargement ignoré."
else
    echo " > Piper introuvable. Téléchargement en cours..."
    PIPER_BIN_GZ=$(mktemp)
    curl -L -o "$PIPER_BIN_GZ" "$PIPER_BIN_GZ_URL"
    tar -xzf "$PIPER_BIN_GZ" -C "$INSTALL_DIR"
    rm "$PIPER_BIN_GZ"
    echo " > Piper installé avec succès."
fi
 
# Ré-écriture du script de téléchargement des voix
cat <<'EOF' > "$INSTALL_DIR/check_piper_voice.sh"
#!/bin/sh
VOICE=$1
BASE_URL="https://huggingface.co/rhasspy/piper-voices/resolve/main"
cd "$(dirname "$0")"
 
if ! [ -f "voices/$VOICE.onnx" ]; then
    echo " > Téléchargement de la voix $VOICE..."
    LANG_F=$(echo "$VOICE" | cut -d '-' -f 1)
    LANG_S=$(echo "$LANG_F" | cut -d '_' -f 1)
    NAME=$(echo "$VOICE" | cut -d '-' -f 2)
    QUAL=$(echo "$VOICE" | cut -d '-' -f 3)
 
    curl -L -o "voices/$VOICE.onnx" "$BASE_URL/$LANG_S/$LANG_F/$NAME/$QUAL/$VOICE.onnx?download=true"
    curl -L -o "voices/$VOICE.onnx.json" "$BASE_URL/$LANG_S/$LANG_F/$NAME/$QUAL/$VOICE.onnx.json?download=true"
else
    echo " > La voix $VOICE est déjà présente. Téléchargement ignoré."
fi
EOF
chmod +x "$INSTALL_DIR/check_piper_voice.sh"
 
echo "\033[1;36m5. Vérification/Téléchargement des voix sélectionnées...\033[0m"
"$INSTALL_DIR/check_piper_voice.sh" "$VOICE_FEMME"
"$INSTALL_DIR/check_piper_voice.sh" "$VOICE_HOMME"
 
echo "\033[1;36m6. Lancement de Speech-Dispatcher...\033[0m"
speech-dispatcher -d
sleep 1
 
echo "\n\033[1;32mInstallation terminée avec succès !\033[0m"
echo "Test audio en cours..."
 
spd-say "Votre script de synthèse vocale est maintenant parfait."

Manuellement

Installation

1. Téléchargez l'exécutable depuis GitHub releases (fichier piper_amd64.tar.gz pour Linux 64-bit)

# Télécharger et extraire
wget https://github.com/rhasspy/piper/releases/download/v1.2.0/piper_amd64.tar.gz
tar -xzf piper_amd64.tar.gz
sudo mv piper /usr/local/bin/

2. Téléchargez une voix française (par exemple "fr_FR-siwis-medium")

# Créez un dossier pour les voix
sudo mkdir -p /usr/share/piper-voices/
cd /usr/share/piper-voices/
 
# Téléchargez la voix française
sudo wget https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/siwis/medium/fr_FR-siwis-medium.onnx
sudo wget https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/siwis/medium/fr_FR-siwis-medium.onnx.json

Test direct avec Piper :

echo "Bonjour, ceci est une voix neuronale de haute qualité" | \
  piper --model /usr/share/piper-voices/fr_FR-siwis-medium.onnx --output_file /tmp/speech.wav
aplay /tmp/speech.wav

Configuration avec Speech Dispatcher

Créez le fichier de configuration pour le module générique avec les droits d’administration /etc/speech-dispatcher/modules/piper-generic.conf avec le contenu :

# Piper TTS generic module configuration
 
GenericExecuteSynth "piper --model /usr/share/piper-voices/fr_FR-siwis-medium.onnx --output_raw"
 
AddVoice "fr_FR-siwis-medium" "French (Medium)"
 
DefaultLanguage "fr"
 
GenericAddLanguage "fr" "fr_FR-siwis-medium"

Ajoutez le module à Speech Dispatcher en éditant le fichier avec les droits d’administration /etc/speech-dispatcher/speechd.conf et ajoutez la ligne :

AddModule "piper-generic" "sd_generic" "piper-generic.conf"

Puis activez-le par défaut :

echo 'DefaultModule piper-generic' >> ~/.config/speech-dispatcher/speechd.conf

Redémarrez Speech Dispatcher :

sudo systemctl restart speech-dispatcher

Voix françaises disponibles pour Piper :

Voix Qualité Taille
fr_FR-siwis-medium Bonne ~50 Mo
fr_FR-siwis-high Excellente ~150 Mo
fr_FR-gilles-low Rapide (embarqué) ~15 Mo

Liens utiles :