TTS mit eigener Stimme
Stimmen klonen mit lokaler Open-Source-Software: Eigenen KI-Sprachassistenten mit individueller Stimme erstellen.
In diesem Artikel habe ich meine Erfahrungen beim Klonen meiner Stimme mit lokal installierter Open-Source-Software zusammengefasst. Dazu habe ich verschiedene Tools wie das Piper Recording Studio und Hyper TTS verwendet, um meine Stimme zu trainieren und in ein Standardformat namens ONNX zu exportieren. Im Folgenden versuche ich meine Schritte zu dokumentieren, die bei mir zum Erfolg geführt haben.
Datensammlung und Aufbereitung mit dem Piper Recording Studio
Für jedes KI-Projekt ist eine gute und saubere Datengrundlage essenziell. Um eine Stimme zu klonen, benötigt man viele Stimmbeispiele. Für das Klonen der eigenen Stimme gibt es eine praktische Lösung namens Piper Recording Studio.
Auf meinem Test-Ubuntu habe ich zuerst ein Systemupdate durchgeführt:
sudo apt update
Anschließend habe ich das Piper Recording Studio-Repository mit folgendem Befehl geklont:
git clone https://github.com/rhasspy/piper-recording-studio
Dann habe ich in das neue Verzeichnis gewechselt:
cd piper-recording-studio
Ich habe eine virtuelle Python-Umgebung erstellt, um meine Installationen sauber und getrennt zu halten:
python3 -m venv .venv
Falls venv
noch nicht installiert ist, kann es mit folgendem Befehl nachinstalliert werden:
sudo apt install python3-venv
Dann habe ich die virtuelle Umgebung aktiviert:
source .venv/bin/activate
Um sicherzugehen, dass pip
aktuell ist, habe ich es aktualisiert:
python3 -m pip install --upgrade pip
Dann habe ich alle benötigten Abhängigkeiten installiert:
pip install -r requirements.txt
Anschließend konnte ich das Piper Recording Studio starten:
python3 -m piper_recording_studio
Das Piper Recording Studio läuft in einem Webinterface auf Port 8000. Im Browser habe ich tubuntu:8000
aufgerufen (Hostname meines Test-Ubuntu Containers 🙃), die Sprache auf Deutsch gestellt und mit der Aufnahme begonnen. Es müssen verschiedene Sätze nachgesprochen werden. Für eine präzise Stimmenerkennung sollten viele Sätze aufgenommen werden, was jedoch gleichzeitig die Trainingszeit verlängert.
Nach den Aufnahmen habe ich den Prozess mit Strg + C
im Terminal gestoppt. Die Aufnahmen befinden sich im Ordner output
. Mit folgendem Befehl wird in den entsprechenden Ordner gewechselt:
cd output/de-de/
Dort habe ich mir die Dateien mit ls
angezeigt und bin noch tiefer in den entsprechenden Unterordner gewechselt, zum Beispiel:
cd 3000
Dort sind alle Aufnahmen mit dem entsprechenden Text zu finden.
Um die Daten für das Training vorzubereiten, habe ich ffmpeg
installiert, ein Tool zur Bearbeitung von Videos und Audios:
sudo apt install ffmpeg
Anschließend habe ich die Daten mit folgendem Befehl in ein Format exportiert, das Piper für das Training benötigt (Achtung: Dieser Befehl muss im Hauptverzeichnis des piper-recording-studio
ausgeführt werden):
python3 -m piper_recording_studio.export_dataset --language de-de --output_dir ../my-voice-dataset
Im Ordner my-voice-dataset
befinden sich nun eine metadata.csv
-Datei und ein wavs
-Ordner mit den Audiodateien. Die metadata.csv
enthält die Dateinamen und die zugehörigen Transkriptionen.
Training des Stimmmodells mit Piper
Für das Training des Stimmmodells habe ich das Piper-Repository verwendet. Zuerst habe ich ein neues Verzeichnis erstellt und bin dorthin gewechselt:
mkdir training
cd training
Dort habe ich das Piper-Repository geklont:
git clone https://github.com/rhasspy/piper
Ich habe eine neue virtuelle Python-Umgebung erstellt und aktiviert:
python3 -m venv .venv
source .venv/bin/activate
Piper verwendet ältere Bibliotheken, die zu Kompatibilitätsproblemen führen können. Daher musste ich spezifische Versionen von pip
, numpy
und torchmetrics
installieren. Diese Versionen können sich in Zukunft ändern, weshalb stets ein Blick in die requirements.txt
des piper-Repositorys zu empfehlen ist:
pip install pip==23.3.1
pip install numpy==1.24.4
pip install torchmetrics==0.11.4
Ich habe in das Piper-Verzeichnis gewechselt:
cd piper/src/python
Dort habe ich die setup.py
und die requirements.txt
angepasst.
Danach die Abhängigkeiten installiert und ein Build-Skript ausgeführt:
pip install -e .
./build_monotonic_align.sh
Vor dem Training musste ich die Daten mit folgendem Befehl vorbereiten (Dieser Befehl muss im src/python
-Unterordner des piper
-Repositorys ausgeführt werden):
python3 -m piper_train.preprocess --input_dir ../../../data-prep/ --output_dir ../../../train-me --language de-de --dataset-format csv
Der Befehl verarbeitet die Daten aus dem data-prep
-Verzeichnis und erstellt ein neues Verzeichnis train-me
, das die für das Training benötigten Dateien enthält.
Um das Training zu starten, habe ich ein vortrainiertes Modell von der Piper-Webseite heruntergeladen (https://github.com/rhasspy/piper/blob/master/TRAINING.md). Ich habe das Modell de_DE-lessac-medium
heruntergeladen und in das training
-Verzeichnis kopiert.
Dann habe ich das Training mit folgendem Befehl gestartet:
python3 -m piper_train --dataset-dir ../../../train-me --accelerator gpu --devices 1 --checkpoint ../../../de_DE-lessac-medium.pt --quality medium --max_epochs 6000
Dieser Befehl startet das Training mit den angegebenen Parametern. --dataset-dir
gibt das Verzeichnis mit den Trainingsdaten an, --accelerator gpu
verwendet die GPU, --devices 1
spezifiziert die Anzahl der zu verwendenden GPUs, --checkpoint
gibt das vortrainierte Modell an, --quality
setzt die Qualität auf medium
und --max_epochs
legt die maximale Anzahl der Trainingsepochen fest. Leider funktionierte meine Coral-TPU nicht als Beschleuniger, obwohl dies möglich scheint. Andere User haben Erfolge gehabt, als sie eine Google-Cloud Instanz damit beauftragt hatten.
Das Training kann mit Strg + C
unterbrochen und später fortgesetzt werden. Dazu muss der Pfad zum letzten Checkpoint angegeben werden, der sich im lightning_logs
-Ordner befindet.
Exportieren des trainierten Modells
Nachdem das Training abgeschlossen war, habe ich das Modell in das ONNX-Format exportiert. ONNX ist ein offenes Format für Machine-Learning-Modelle, das die Interoperabilität zwischen verschiedenen Frameworks ermöglicht.
Um das Modell zu exportieren, habe ich folgenden Befehl verwendet (Dieser Befehl muss im src/python
-Unterordner des piper
-Repositorys ausgeführt werden):
python3 -m piper_train.export_onnx --checkpoint ../../../train-me/lightning_logs/version_0/checkpoints/ --output_file ../../../model.onnx
Dieser Befehl exportiert das Modell aus dem angegebenen Checkpoint in eine ONNX-Datei. Die config.json
aus dem train-me
-Verzeichnis habe ich ebenfalls in das Verzeichnis der ONNX-Datei kopiert und in model.onnx.json
umbenannt.
Verwendung des trainierten Modells mit Piper TTS
Hier beginnt nun endlich der coole Teil, für den wir uns durch diese Odyssee von Befehlen gequält haben.
Um das trainierte Modell zu verwenden, habe ich Piper TTS installiert:
pip install piper-tts
Mit folgendem Befehl kann man eine Text-to-Speech-Ausgabe mit dem trainierten Modell erzeugen:
echo "Hallo, mein Name ist Michael. Meine Stimme wurde soeben trainiert." | piper-tts --model model.onnx --output-file michael.wav
Dieser Befehl nimmt den Text "Hallo, mein Name ist Michael. Meine Stimme wurde soeben trainiert.", wandelt ihn mit dem angegebenen Modell in Sprache um und speichert die Ausgabe in der Datei michael.wav
.
Integration des Modells in meine Telefonanlage
Damit meine Stimme am Telefon genutzt wird, habe ich in Asterisk in meinem Telefonmenü die Stimme ausgetauscht. Vorher habe ich Texte, wie: "Drücken Sie die Eins, wenn ein kritischer Dienst vom Ausfall betroffen ist..." aus dem Internet geholt:
Jetzt kann ich diese Sprachausgaben mit piper-tts
erzeugen lassen, und sie hören sich immer an, als hätte ich es selbst gesprochen:
echo "Drücken Sie die Eins, wenn ein kritischer Dienst vom Ausfall betroffen ist..." | piper-tts --model model.onnx --output-file michael.wav
Denkbar wäre auch eine Integration in meinen Signal-Bot, der nun auf eine Sprachnachrich ebenfalls mit einer Sprachnachricht antworten könnte...
Aber soweit bin ich noch nicht...
Fazit
Das Klonen von Stimmen mit lokaler und kostenloser Open-Source-Software ist möglich, erfordert aber einige technische Kenntnisse und Geduld. Die Qualität des geklonten Stimmmodells hängt stark von der Qualität der Trainingsdaten ab. Mit den richtigen Tools und etwas Aufwand ist es jedoch möglich, eine eigene, personalisierte Stimme für die entsprechende Anwendung zu erstellen. Die Ergebnisse sind beeindruckend und eröffnen viele Möglichkeiten für die Personalisierung von KI-Assistenten.