Raspberry Pi als Offline-TTS-Modul mit eSpeak NG für Mikrocontroller
Mit Raspberry Pi OS Bookworm und Trixie geprüft.

Im folgenden Projekt wird ein Raspberry Pi als TTS-Modul eingerichtet, dass per UART von jedem Mikrocontroller angesteuert werden kann. In dem der Mikrocontroller dem Raspberry Pi den in Sprache auszugebenden Text im Klartext überträgt.
Die Umwandlung von Text in Sprache erfolgt mit eSpeak NG. Das ist ein Open-Source-Sprach-Synthesizer, der Ausgaben in vielen Sprachen erzeugen kann. Die Spracherzeugung erfolgt vollständig synthetisch (Formantsynthese), was sich dann auch genauso anhört. Die Sprachausgabe von eSpeak NG klingt mechanisch und nach einem Roboter. Auf einem alten Raspberry Pi (2 und darunter) wird eSpeak NG ausreichend schnell ausgeführt.
Für dieses Projekt wird ein Raspberry Pi benötigt, eventuell ein USB-Audio-Adapter und ein Lautsprecher.
Der Raspberry Pi ist ein Einplatinen-Computer, der vor allem für Lernzwecke, Bastelprojekte und Automatisierungsaufgaben eingesetzt wird. Je nach Modell ist er günstig, stromsparend und eignet sich gut für DIY-Projekte.
Die Anforderungen an die Hardware und die Software sind so gering, dass sich auch ein alter Raspberry Pi A (1) für dieses TTS-Projekt nutzen lässt. Und die Umwandlung von Text nach Sprache ist ausreichend schnell. Da findet keine nennenswerte Verzögerung statt.
Ein USB-Audio-Adapter ist optional und nur dann notwendig, wenn der verwendete Raspberry Pi keinen Klinken-Anschluss hat.
Aber Achtung, der Klinken-Anschluss am Raspberry Pi ist oft kleiner als die üblichen Klinken-Anschlüsse von Kopfhörern und Headsets. Es hat sich als praktikabel erwiesen, in jedem Fall einen externen USB-Audio-Adapter zu verwenden.
Im Prinzip reichen einfache Lautsprecher zum Anschliessen an der Klinken-Buchse am Raspberry Pi oder an einem USB-Audio-Adapter. Nur in lauten Umgebungen, auch im Außenbereich, benötigt man aktive Lautsprecher oder einen separaten Verstärker.
Anleitung für den Raspberry Pi als TTS-Modul mit eSpeak NG
- Betriebssystem aktualisieren und vorbereiten
- Systemkonfiguration
- eSpeak NG installieren
- Audio-Gerät als Standard festlegen
- Lautstärke einstellen
- Sprachqualität verbessern (optional)
- Mehr Sprachen (optional)
- Python-Programm für eSpeak NG
- Verkabelung: Raspberry Pi Pico und Raspberry Pi
- Programm für den Raspberry Pi Pico (Beispiel)
- Optional: System-Autostart-Service für eSpeak NG auf dem Raspberry Pi einrichten
- Optional: Read-Only Mode auf dem Raspberry Pi
Betriebssystem aktualisieren und vorbereiten
Nach dem Erzeugen einer frischen MicroSD-Karte mit Raspberry Pi OS, sollte man das Betriebssystem und die Software aktualisieren. Danach wird man das System vermutlich nie wieder aktualisieren.
sudo apt update sudo apt upgrade
Wir ergänzen noch die Unterstützung der seriellen Schnittstelle und zusätzliche Pakete für Python.
sudo apt install python3-serial
Systemkonfiguration
Im Konfigurationstool für den Raspberry Pi müssen wir noch ein paar Einstellungen vornehmen. Jetzt wäre es an der Zeit, das zur Audio-Ausgabe vorgesehene Gerät anzuschließen.
sudo raspi-config
Zuerst muss die serielle Schnittstelle eingeschaltet werden. Im Menü hangelt man sich durch folgende Einstellungen:
Interface Options / Serial Port
- Login shell over serial? NO
- Enable serial port hardware? YES
Hinweis: Der Login über die serielle Schnittstelle MUSS abgeschaltet (NO) sein, weil diese Schnittstelle sonst nicht genutzt werden kann.
Dann müssen wir noch festlegen auf welcher Schnittstelle die Audio-Ausgabe erfolgen soll. Wenn man einen USB-Adapter verwendet, dann sollte der jetzt eingesteckt werden, damit die Einstellung dauerhaft festgelegt werden kann.
System Options / Audio
Hier wählt man das Audio-Gerät aus, auf dem die Audio-Ausgabe erfolgen soll:
- bcm2835 Headphones: Klinken-Anschluss auf dem Board
- USB Audio Device: externen USB-Audio-Adapter
- vc4-hdmi: Lautsprecher im HDMI-Display
Wenn man das Konfigurationstool beendet, dann wird normalerweise ein Reboot angeboten. Das ist sinnvoll.
eSpeak NG installieren
eSpeak NG ist jetzt vergleichsweise schnell installiert:
sudo apt install espeak-ng
Wenn man einen Lautsprecher anschließt, dann kann man mit folgenden Kommandos verschiedene Stimmen testen:
espeak-ng "Hello World" espeak-ng -v de "Hallo, ich spreche Deutsch." espeak-ng -v en-us "Hello, I speak English."
Wenn man nichts hört, dann muss man vielleicht ein anderes Audio-Gerät oder die Lautstärke einstellen.
Audio-Gerät als Standard festlegen
Im Konfigurationstool von Raspberry Pi OS gibt es die Möglichkeit das bevorzugte Audio-Gerät festzulegen. Man findet die Einstellung unter „System Options / Audio“.
sudo raspi-config
Lautstärke einstellen
Unter Umständen ist die Audio-Ausgabe zu leise. Dann kann man die Lautstärke lauter einstellen.
alsamixer
Mit F6 kann man das Audio-Gerät auswählen. Und anschließend mit den Pfeiltasten rauf und runter die Lautstärke einstellen. Ein Wert zwischen 80 und 100 ist sicherlich angebracht.
Sprachqualität verbessern (optional)
An der Sprachqualität kann man nicht viel verbessern. Allerdings kann man bei der Geschwindigkeit (-s) und der Tonhöhe (-p) noch etwas optimieren.
espeak-ng -v de "Hallo, ich spreche Deutsch." espeak-ng -v de -s 150 -p 55 "Hallo, ich spreche Deutsch."
Mehr Sprachen (optional)
eSpeak NG bringt ein ganzes Set an Sprachen mit. Die Auswahl wird mit folgendem Kommando angezeigt.
espeak-ng --voices
Python-Programm für eSpeak NG
Das folgende Python-Programm macht 2 Dinge:
- Text-Empfang auf der seriellen Schnittstelle
- Sprachausgabe mit eSpeak NG
Dazu erstellen wir eine neue Datei:
nano uart_tts.py
In dem sich öffnenden Editor fügen wir folgenden Programmcode ein:
# Bibliotheken laden
import serial
import subprocess
# Serielle Schnittstelle initialisieren
ser = serial.Serial("/dev/serial0", 115200, timeout=1)
# Funktion: Sprachausgabe
def speak(text):
print(text)
subprocess.run(["espeak-ng", "-v", "de", "-s", "150", "-p", "55", text])
# Sprachausgabe
speak("TTS über UART gestartet")
# Hauptprogramm
try:
while True:
line = ser.readline().decode("utf-8").strip()
if line:
print("Daten empfangen:", end=" ")
speak(line)
except KeyboardInterrupt:
pass
except Exception as e:
print("Fehler:", e)
Mit Strg + O, Return und Strg + X speichern und beenden.
Dann kannst du das Programm testweise starten:
python3 uart_tts.py
Mit Strg + C kann man das Programm beenden.
Wenn das Programm „uart_tts.py“ bei einem Neustart automatisch gestartet werden soll, dann muss man einen systemd-Service einrichten.
Verkabelung: Raspberry Pi Pico und Raspberry Pi

Die Darstellung sieht die Verkabelung von einen Raspberry Pi 3 und einem Raspberry Pi Pico vor. Das soll aber nur ein Beispiel sein. Es kann im Prinzip jeder Raspberry Pi und jeder Mikrocontroller sein.
- - In diesem Beispiel wird der Raspberry Pi Pico über die GPIO-Pinleiste des Raspberry Pi mit Strom versorgt.
- Der ganze Aufbau funktioniert nur dann zuverlässig, wenn beide über eine gemeinsame Masse-Verbindung (GND) verbunden sind.
- Als einzige wirkliche Datenverbindung dient die Verbindung vom GPIO15 (Raspberry Pi UART-RX) nach GPIO0 (Raspberry Pi Pico UART-TX). Die Verbindung für den Rückweg brauchen wir nicht.
- Bei Mikrocontrollern, die 5-Volt-Pegel haben, muss man einen Pegelwandler (Logic Level Shifter) dazwischenschalten. Der Raspberry Pi verträgt nur einen 3,3-Volt-Pegel.
- Die Geschwindigkeit der Schnittstelle ist beim Raspberry Pi auf 115200 Baud eingestellt.
Programm für den Raspberry Pi Pico (Beispiel)
Der folgende Programmcode initialisiert die serielle Schnittstelle (UART) des Raspberry Pi Pico und sendet anschließend in einer Endlosschleife alle 10 Sekunden die Nachricht „Hallo vom Pico“ über diese Schnittstelle.
# Bibliotheken laden
from machine import Pin, UART
import time
# UART initialisieren
TTS = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))
# Funktion: Text über UART senden
def speak(text):
print(text)
TTS.write(text)
# Hauptprogramm
while True:
speak("Hallo vom Pico!")
time.sleep(10)
Wenn man diesen Programmcode mit dem Dateinamen „main.py“ speichert, dann wird sie automatisch beim Neustart ausgeführt.
Optional: System-Autostart-Service für eSpeak NG auf dem Raspberry Pi einrichten
Das Programm „uart_tts.py“ startet nicht automatisch bei einem Neustart. Dazu muss man einen systemd-Service einrichten.
Hinweis: Den Service sollte man nur dann einrichten, wenn das Programm fehlerfrei funktioniert.
Dazu erstellen wir eine neue Datei:
sudo nano /etc/systemd/system/uart_tts.service
Und tragen in diese Datei folgende Zeilen ein:
[Unit] Description=UART Text To Speech Service After=multi-user.target sound.target [Service] User=pi WorkingDirectory=/home/pi/tts/ ExecStart=/home/pi/tts/.venv/bin/python3 uart_tts.py Restart=on-failure RestartSec=5s StartLimitIntervalSec=60 StartLimitBurst=5 [Install] WantedBy=multi-user.target
Mit Strg + O, Return und Strg + X speichern und beenden.
Den neu eingerichteten Service einlesen:
sudo systemctl daemon-reload
Danach kann man das Python-Programm als Service manuell starten und stoppen. Außerdem kann man den automatischen Start bei einem System-Neustart aktivieren.
Wichtige Kommandos zum Steuern
Service-Status anzeigen:
sudo systemctl status uart_tts.service
Service starten:
sudo systemctl start uart_tts.service
Service stoppen:
sudo systemctl stop uart_tts.service
Service bei einem Neustart automatisch starten:
sudo systemctl enable uart_tts.service
Automatischer Start abschalten:
sudo systemctl disable uart_tts.service
Mit einem Reboot kann man testen, ob der automatische Start funktioniert.
sudo systemctl enable uart_tts.service sudo reboot
Hinweis: Bevor man den Programmcode ändert, sollte man den Service immer stoppen und deaktivieren. Wenn man im Programmcode Mist baut und es deshalb zum Neustart kommt, dann kann das zu einer Reboot-Schleife führen, die sich nicht unterbrechen lässt.
Optional: Read-Only Mode auf dem Raspberry Pi
In dieser Betriebsart läuft der Raspberry Pi als Embedded System ohne Display, Tastatur und Maus. Das hat leider den Nachteil, dass man das System nicht sauber herunterfahren kann und deshalb einfach vom Strom getrennt wird, wenn es nicht mehr gebraucht wird. Das hat leider den Nachteil, dass wenn beim Ausschalten gleichzeitig ein Schreibvorgang auf die Speicherkarte erfolgt, dass dann die Daten auf der Speicherkarte beschädigt werden können. Um das zu vermeiden, sollte man das Raspberry Pi OS in den Read-Only Mode schalten und die Speicherkarte damit praktisch schreibgeschützt ist.
Erweiterung: Natürliche und menschlich klingende Sprachausgabe
Text-to-Speech (TTS) hat sich in den letzten Jahren von robotischen Stimmen zu fast menschlich klingenden Sprachmodellen entwickelt. Mit Piper-TTS ist es möglich, eine menschlich klingende Sprachausgabe zu erreichen. Dafür braucht man aber auch mehr Rechenleistung.
Weitere verwandte Themen:
- Raspberry Pi: Text-To-Speech (TTS)
- Raspberry Pi als Offline-TTS-Modul für Mikrocontroller
- Raspberry Pi: Audio-Ausgabe einstellen
- Raspberry Pi: Audio-Erweiterungen
- Raspberry Pi Pico: Text-To-Speech (TTS)
Hardware-nahes Programmieren mit dem Raspberry Pi, Python und GPIO Zero
Das "Elektronik-Set Raspberry Pi Edition" ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit Python und GPIO Zero.
- LED: Einschalten, ausschalten, blinken und Helligkeit steuern
- Taster: Verschiedene Zustände auswerten und anzeigen lassen
- LED mit Taster einschalten und ausschalten
- Relais-Board steuern
- LED, Relais-Board und Motor über ULN2003A steuern
- Ampel- und Lauflicht-Steuerung
- Herunterfahren per Taster
- Reaktionsspiel mit Tastern und LEDs
- Eigene Steuerungen programmieren
Frag Elektronik-Kompendium.de
Elektronik-Set Raspberry Pi Edition
Elektronik erleben mit dem Raspberry Pi mit Python und GPIO Zero
- Leichter Einstieg ins Hardware-nahe Programmieren mit Python und GPIO Zero
- Experimentieren und Programmieren ohne Vorkenntnisse
- Sofort Loslegen mit All-in-one-Set
Elektronik-Fibel
Elektronik einfach und leicht verständlich
Die Elektronik-Fibel ist ein Buch über die Grundlagen der Elektronik, Bauelemente, Schaltungstechnik und Digitaltechnik.


