Sprachsynthese auf Mikrocomputern: Von eSpeak NG zu Piper TTS
Sprachsynthese hat sich von mechanischen Geräten zu neuronalen Netzwerken entwickelt. Ende des 18. Jahrhunderts simulierte man mit mechanischen Kehlkopfanaloga aus Membranen und Blasen die Stimmtöne – exemplarisch dafür steht die Euphonia aus dem Jahr 1846 mit Tasten und akustischen Komponenten.
Das elektronische Zeitalter begann mit dem Voder von Bell Labs (1930), bei dem Tonquellen, Rauschquellen und Filter über eine Tastatur gesteuert wurden. Pattern Playback (1940er–1950er Jahre) reproduzierte Spektrogramme. 1961 modellierte IBM 704 einen Kehlkopf, um "Daisy Bell" zu singen. Japans erste formantenbasierte Sprachsynthese entstand 1968. MUSA (1975–1978) lieferte Echtzeit-Italienisch.
Ab den 1980er Jahren: Formant-Synthese mit Phonemen. Ab den 1990er Jahren: statistische Methoden. Ab den 2010er Jahren: End-to-End-Neuralnetze wie VITS.
Leichte eSpeak NG Sprachsynthese
eSpeak NG ist eine Open-Source-Formant-Sprachsynthese ohne echte Stimmaufnahmen. Der Output klingt roboterhaft, verbraucht aber minimal Ressourcen – ideal für Repka-Pi 4 mit 2 GB RAM. Perfekt für Alarme und Prototypen.
Installation und CLI-Nutzung
Pakete aktualisieren und installieren:
apt update
apt install espeak-ng
Verfügbare Stimmen prüfen:
espeak-ng --voices | grep Russian
Text synthetisieren:
espeak-ng "Hello Repka Pi" -v ru
Mehrzeiligen Text per heredoc:
espeak-ng -v ru -s 150 << EOF
Hello world!
This very long text,
that takes several lines.
EOF
Aus Datei mit weiblicher Stimme:
espeak-ng -v ru+f5 -s 150 -f hello-repka-pi.txt
Stimmen: ru, ru+m1..m7, ru+f1..f5.
Integration mit Python
Funktion zur Ausführung über Subprozess:
import subprocess
def say(text, voice="ru", speed=150, pitch=50):
"""
voice — Sprache/Stimme (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 nicht gefunden. Installieren: sudo apt install espeak-ng")
except subprocess.CalledProcessError as e:
print("Fehler:", 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)
Ausführen mit: python3 espeak-ng-test.py.
Neuronale Netzwerk-basierte Piper TTS
Piper TTS nutzt VITS (Variational Inference with adversarial learning for end-to-end TTS) und ONNX-Modelle, um natürliche, Echtzeit-Sprache auf Mikrocomputern zu erzeugen. Die Performance übertrifft eSpeak NG deutlich, mit akzeptabler Latenz sogar auf Repka-Pi 4.
Installation und Modellkonfiguration
Virtuelle Umgebung:
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
Russisches Modell herunterladen (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
CLI und Python-Ausführung
Synthese in WAV:
piper --model ~/piper-voices/ru/ru_RU-irina-medium.onnx --output_file großes_text.wav <<EOF
Hello world!
This very long text...
EOF
aplay großes_text.wav
Aus Datei: piper --model model.onnx --output_file output.wav -f input.txt.
Python-Integration entspricht eSpeak NG – Nutzung von piper über Subprozess oder native API.
FastAPI-TTS-Server
Erstellen eines asynchronen Servers zur Verwaltung von Anfragen. Als systemd-Dienst auf Repka-Pi 4 laufen lassen.
- Vorteile: Clients senden HTTP-POST-Anfragen ohne Wartezeit; Server pufferiert Aufgaben.
- Technologie: FastAPI, Piper TTS, Task-Queue.
Beispielservercode:
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)
# Speichern oder streamen
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"}
systemd-Einheit:
[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'.
Wichtige Erkenntnisse
- eSpeak NG: geringer Ressourcenverbrauch, Formant-Synthese, ideal für schwache Hardware.
- Piper TTS: VITS/ONNX für natürliche Sprache, Echtzeit auf SBCs.
- FastAPI-Server: asynchrone Warteschlange, automatischer Start via systemd.
- Einsatzfälle: Sprachassistenten, IoT, Roboter auf Repka-Pi 4/5.
- Repka-Pi 5: bis zu 32 GB RAM, doppelt so leistungsfähig wie Raspberry Pi 5 für TTS+ASR.
— Editorial Team
Noch keine Kommentare.