Synthèse vocale sur micro-ordinateurs : d'eSpeak NG à Piper TTS
La synthèse vocale a évolué des dispositifs mécaniques aux modèles basés sur les réseaux de neurones. À la fin du XVIIIe siècle, des analogues mécaniques du tractus vocal avec diaphragmes et soufflets imitaient les tons vocaux — exemplifiés par l’Euphonia de 1846, dotée de touches et de composants acoustiques.
L’ère électronique débute avec le Voder de Bell Labs (1930), où des générateurs de ton, sources de bruit et filtres étaient contrôlés via clavier. Le Pattern Playback (années 1940–1950) reproduisait des spectrogrammes. En 1961, l’IBM 704 modélisait un tractus vocal pour chanter « Daisy Bell ». Le premier système de synthèse formantiste japonais apparaît en 1968. MUSA (1975–1978) produit une parole italienne en temps réel.
À partir des années 1980 : synthèse formantiste avec phonèmes. Des années 1990 : méthodes statistiques. Depuis les années 2010 : réseaux neuronaux end-to-end comme VITS.
Synthèse vocale légère avec eSpeak NG
eSpeak NG est un système open source de synthèse vocale basé sur les formants, sans échantillons vocaux réels. Son rendu sonne robotisé mais nécessite très peu de ressources — idéal pour Repka-Pi 4 avec 2 Go de RAM. Parfait pour les alertes ou les prototypes.
Installation et utilisation en ligne de commande
Mettez à jour les paquets et installez :
apt update
apt install espeak-ng
Vérifiez les voix disponibles :
espeak-ng --voices | grep Russian
Synthétisez du texte :
espeak-ng "Hello Repka Pi" -v ru
Texte multiligne via heredoc :
espeak-ng -v ru -s 150 << EOF
Hello world!
This very long text,
that takes several lines.
EOF
Depuis un fichier avec voix féminine :
espeak-ng -v ru+f5 -s 150 -f hello-repka-pi.txt
Voix disponibles : ru, ru+m1..m7, ru+f1..f5.
Intégration avec Python
Fonction d’exécution via subprocess :
import subprocess
def say(text, voice="ru", speed=150, pitch=50):
"""
voice — langue/voix (ru, en, de).
speed — 80–200.
pitch — 0–99.
"""
try:
subprocess.run([
"espeak-ng",
"-v", voice,
"-s", str(speed),
"-p", str(pitch),
text
], check=True, capture_output=True)
except FileNotFoundError:
print("espeak-ng non trouvé. Installez : sudo apt install espeak-ng")
except subprocess.CalledProcessError as e:
print("Erreur :", e.stderr.decode())
if __name__ == "__main__":
say("Hello! This test of a Russian voice.", voice="ru", speed=140)
say("Hello, this is a test in English", voice="en-us", speed=160, pitch=60)
say("Testing another Russian voice", voice="ru+f3", speed=135)
Exécutez avec : python3 espeak-ng-test.py.
Synthèse vocale basée sur réseau de neurones : Piper TTS
Piper TTS utilise VITS (Inférence variationnelle avec apprentissage adversarial pour TTS end-to-end) et des modèles ONNX pour produire une parole naturelle en temps réel sur les micro-ordinateurs. Les performances dépassent celles d’eSpeak NG, avec une latence acceptable sur Repka-Pi 4.
Installation et configuration du modèle
Environnement virtuel :
sudo apt update
sudo apt install python3-pip
python3 -m venv ~/piper_env
source ~/piper_env/bin/activate
pip install --upgrade pip
pip install piper-tts sounddevice numpy
Téléchargez le modèle russe (denis-medium) :
mkdir -p ~/piper-voices/ru
cd ~/piper-voices/ru
wget https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx?download=true -O ru_RU-denis-medium.onnx
wget https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx.json?download=true -O ru_RU-denis-medium.onnx.json
Exécution en ligne de commande et en Python
Synthétisez vers WAV :
piper --model ~/piper-voices/ru/ru_RU-irina-medium.onnx --output_file grand_texte.wav <<EOF
Hello world!
This very long text...
EOF
aplay grand_texte.wav
Depuis un fichier : piper --model model.onnx --output_file output.wav -f input.txt.
L’intégration en Python suit le même schéma qu’eSpeak NG — utilisez piper via subprocess ou API native.
Serveur TTS avec FastAPI
Construisez un serveur asynchrone pour gérer les files d’attente de requêtes. Exécutez-le comme service systemd sur Repka-Pi 4.
- Avantages : les clients envoient des requêtes HTTP POST sans attendre ; le serveur met en file les tâches.
- Stack : FastAPI, Piper TTS, file de tâches.
Exemple de code serveur :
from fastapi import FastAPI
import queue
import threading
from piper import PiperVoice
app = FastAPI()
voice = PiperVoice.load("~/piper-voices/ru/ru_RU-denis-medium.onnx")
task_queue = queue.Queue()
def process_queue():
while True:
text = task_queue.get()
wav = voice.synthesize(text)
# Sauvegarde ou diffusion
task_queue.task_done()
threading.Thread(target=process_queue, daemon=True).start()
@app.post("/synthesize")
async def synthesize(text: str):
task_queue.put(text)
return {"status": "queued"}
Fichier unit systemd :
[Unit]
Description=Piper TTS Server
After=network.target
[Service]
ExecStart=/path/to/server.py
Restart=always
[Install]
WantedBy=multi-user.target
Client : curl -X POST http://repka-pi:8000/synthesize -d 'Text for synthesis'.
Points clés
- eSpeak NG : faible empreinte, synthèse formantiste, idéal pour matériel faible.
- Piper TTS : VITS/ONNX pour une parole naturelle, temps réel sur SBC.
- Serveur FastAPI : file asynchrone, démarrage automatique avec systemd.
- Cas d’usage : assistants vocaux, IoT, robots sur Repka-Pi 4/5.
- Repka-Pi 5 : jusqu’à 32 Go de RAM, performance doublée par rapport au Raspberry Pi 5 pour TTS+ASR.
— Editorial Team
Aucun commentaire pour le moment.