In diesem Artikel lernst du, wie du ein Text-To-Speech mit deiner eigenen Stimme erstellen kannst. Dazu nutzen wir das Programm Coqui. Im Folgendem werde ich auf die sogenannte Zero Shot Methode mit dem YourTTS Modell eingehen.

Damit kannst du mit nur einem einzigen Sprachsample zu einem TTS mit deiner eigenen Stimme kommen. Ziemlich schnell und einfach, wenn man bedenkt, dass man dafür früher mehrere Stunden Audiomaterial aufnehmen musste! Bei dieser Technik wird der Stimmklang eines Samples mit einem bereits existierenden TTS Modell verschmolzen. Manchmal klingt das sofort schon ganz ordentlich. Oft wirst du allerdings etwas herumprobieren müssen.

Falls das Ergebnis mit dieser Zero Shot Methode nicht zufriedenstellend ist, hast du nur noch die Möglichkeit dir ein eigenes Modell mit deiner Stimme anzutrainieren. Dazu müsstest du mehrere Stunden Audiosamples aufnehmen und diese transkribieren. Auch wenn das deutlich aufwendiger ist, ist es dann noch die einzige Möglichkeit auf ein perfektes Ergebnis. Der Aufwand beim Antrainieren würde allerdings etwas den Rahmen dieses Beitrags sprengen. Deswegen gehe ich am Ende dieses Beitrags nur kurz darauf ein. Schau dir dazu am besten direkt die offizielle Dokumentation von Coqui TTS an.

Doch zunächst zeige ich die einfache Methode mit YourTTS. Wenn du es einfach zur mal online testen willst wie es sich anhört bevor du irgendwas installierst, dann kannst du das hier tun.

Was ist Coqui

Coqui ist ein Softwareprojekt, das von Mozilla Entwicklern ins Leben gerufen wurde. Der Code wird auf GitHub veröffentlicht und aktiv weiterentwickelt. Der Name kommt vom spanischen Coquí Frosch, den man “ko-kee” ausspricht.

Das Projekt hat sich zum Ziel gemacht, Voice Technologien für die Allgemeinheit zur Verfügung zu stellen. Die umfangreichsten Unterprojekte sind die beiden Projekte Speech-To-Text und Text-To-Speech.

Mit letzterem kannst du Texte mit unterschiedlichen Stimmmodellen vorlesen lassen. Das Modell, das wir benutzen werden, nennt sich YourTTS Multispeaker.

YourTTS Multispeaker

YourTTS ist ein Text-To-Speech Modell von Edresson Casanova, Julian Weber, Christopher Shulby, Arnaldo Candido Junior, Eren Gölge und Moacir Antonelli Ponti. Es ist im Rahmen eines Projekts an der Cornell Universität entstanden.

Normalerweise brauchst du mehrere Stunden an Audiomaterial, um ein neues TTS Modell zu erzeugen. YourTTS löst dieses Problem, indem es ein bestehendes Modell nimmt und dabei die Klangfarbe so verändert, dass die Stimme wie ein Audiosample klingt, das du beim Generieren mitgibst. Das bedeutet, dass du kein eigenes Modell trainieren musst.

Aktuell lassen sich nur englische, portugiesische und französische Stimmen mit YourTTS erzeugen. Falls du weitere Sprachen brauchst, müsstest du etwas tiefer in den Quellcode einsteigen. Für Englisch gibt es zwei Modelle. Eines für männliche und eines für weibliche Stimmen.

Coqui TTS installieren

Folgendes habe ich bisher nur auf Linux bzw. in der Ubuntuapp unter Windows getestet.

Zunächst muss Python mit Pip installiert sein. Anschließend kannst du das Coqui TTS Projekt aus dem Pip Repository installieren.

sudo apt update
sudo apt install python3-pip
sudo pip install TTS

Jetzt solltest du tts als Shellbefehl zur Verfügung haben. Das kannst du testen, indem du ein kurzes Audiofile mit Standardeinstellungen erzeugst.

tts --text "This is only a test"

Danach müsste sich eine Audiodatei mit dem Namen “tts_output.wav” in deinem aktuellen Verzeichnis befinden.

TTS mit YourTTS erzeugen

Um das YourTTS Modell zu verwenden, reicht es aus, die Modell-ID anzugeben, da es bereits Teil des Coqui Projektes ist. TTS wird das Modell automatisch herunterladen und installieren.

Jetzt brauchst du nur noch ein Audiosample mit Sprachaufnahmen, die du als Input verwenden willst. Speichere diese Aufnahmen im Wave Format als “example.wav” ab.

Der folgende Befehl erzeugt die Audiodatei mit YourTTS.

tts --text "This is only a test" --model_name "tts_models/multilingual/multi-dataset/your_tts" --speaker_wav "example.wav" --language_idx "en" --speaker_idx "male-en-2" --out_path "output.wav"

Mit etwas Glück hört sich das schon sehr gut an. Spiel am besten mit unterschiedlichen Audiosamples desselben Sprechers herum. Idealerweise sollten diese Aufnahmen um die 20 Sekunden lang sein. Es funktioniert aber auch mit kürzeren Samples.

Um die weibliche speaker_idx zu verwenden, musst du “male-en-2” auf “female-en-5” ändern. Auch hier ist herumprobieren angesagt.

Und schon hast du deine custom TTS Stimme.

Hinweis

Zum Schluss noch ein Hinweis: Bitte beachte, dass du Sprachaufnahmen von anderen Personen nur mit deren Einwilligung verwenden solltest. Diese Technologie sollte nicht für Fälschungen, Betrug oder Mobbing eingesetzt werden.

Eigenes TTS Modell trainieren

Wenn sich deine YourTTS Soundfiles nicht gut genug anhören, musst du wohl oder übel dein eigenes Modell bauen. Im Folgenden mal kurz angeschnitten, was du dafür tun müsstest. Am besten schaust du dir aber noch ein spezielleres Tutorial dazu an.

ACHTUNG: du brauchst mehrere Stunden Audiosamples, damit dein Modell überhaupt annähernd menschlich klingt. Mindestens 4, besser wären 10-20 Stunden!

Coqui selbst bauen

Zunächst musst du das komplette Projekt auf deinem Linux Computer bauen. Die oben gezeigte Variante mit Pip ist nicht ausreichend. Meines Wissens gibt es das Projekt noch nicht in einer Softwareverteilung.

git clone https://github.com/coqui-ai/TTS
pip install -e .[all,dev,notebooks]

Aufnahme mit mycroft

Anschließend musst du deine Audiosamples aufnehmen und im LJSpeech Format abspeichern. Zum Aufnehmen kannst du Mycroft verwenden. Dazu musst du Texte haben, die du einsprichst. Diese müssen Satz für Satz transkribiert sein. Beachte, dass du geeignete Texte verwendest. Vor allem Zahlen und Sonderzeichen wollen oft auch gelernt sein.

LJSpeech Format

Das LJSpeech Format sieht wie folgt aus.

Projektordner
* transcripts.csv
* samples
** sample1.wav
** sample2.wav
** sample3.wav
...

Die transcripts.csv braucht Zeilen mit folgenden drei Spalten, die jeweils mit einem Pipe symbol ( | ):

Spalte Beschreibung
ID Dateiname der Wav
Transcription Text, den der Leser eingesprochen hat
Normalized Transcription Wie Transcription, nur Zahlen und Symbole (wie $ oder €) als Wörter

Alles sollte in UTF-8 geschrieben werden.

Hier die Grundlegenden Dinge zu Datasets.

Training starten

Hier die offizielle Anleitung.

Du benötigst eine config.json Datei, in der alle Informationen über das Modell stehen. Hier ein Beispiel:

{
    "model": "glow_tts",
    "batch_size": 32,
    "eval_batch_size": 16,
    "eval_split_size": 0.0625,
    "num_loader_workers": 4,
    "audio": {
        // stft parameters
        "fft_size": 1024, // number of stft frequency levels. Size of the linear spectogram frame.
        "win_length": 1024, // stft window length in ms.
        "hop_length": 256, // stft window hop-lengh in ms.
        "frame_length_ms": null, // stft window length in ms.If null, 'win_length' is used.
        "frame_shift_ms": null, // stft window hop-lengh in ms. If null, 'hop_length' is used.
        // Audio processing parameters
        "sample_rate": 22050, // DATASET-RELATED: wav sample-rate. If different than the original data, it is resampled.
        "preemphasis": 0.0, // pre-emphasis to reduce spec noise and make it more structured. If 0.0, no -pre-emphasis.
        "ref_level_db": 20, // reference level db, theoretically 20db is the sound of air.
        // Silence trimming
        "do_trim_silence": true, // enable trimming of slience of audio as you load it. LJspeech (false), TWEB (false), Nancy (true)
        "trim_db": 60, // threshold for timming silence. Set this according to your dataset.
        // Griffin-Lim
        "power": 1.5, // value to sharpen wav signals after GL algorithm.
        "griffin_lim_iters": 60, // #griffin-lim iterations. 30-60 is a good range. Larger the value, slower the generation.
        // MelSpectrogram parameters
        "num_mels": 80, // size of the mel spec frame.
        "mel_fmin": 0.0, // minimum freq level for mel-spec. ~50 for male and ~95 for female voices. Tune for dataset!!
        "mel_fmax": 8000.0, // maximum freq level for mel-spec. Tune for dataset!!
        "spec_gain": 1, // scaler value appplied after log transform of spectrogram.
        // Normalization parameters
        "signal_norm": true, // normalize spec values. Mean-Var normalization if 'stats_path' is defined otherwise range normalization defined by the other params.
        "min_level_db": -100, // lower bound for normalization
        "symmetric_norm": true, // move normalization to range [-1, 1]
        "max_norm": 4.0, // scale normalization to range [-max_norm, max_norm] or [0, max_norm]
        "clip_norm": true // clip normalized values into the range.
    },
    "num_eval_loader_workers": 4,
    "run_eval": true,
    "test_delay_epochs": -1,
    "epochs": 1000,
    "text_cleaner": "english_cleaners",
    "use_phonemes": false,
    "phoneme_language": "en-us",
    "phoneme_cache_path": "phoneme_cache",
    "print_step": 25,
    "print_eval": true,
    "mixed_precision": false,
    "output_path": "output/glow_tts/",
    "test_sentences": [
        "Test this sentence.",
        "This test sentence.",
        "Sentence this test."
    ],
    "datasets": [
        {
            "name": "ljspeech",
            "meta_file_train": "transcripts.csv",
            "path": "/mnt/d/voice/testordner/"
        }
    ]
}

Vor allem die Pfade solltest du vor dem Training anpassen. Da das Training sehr lange dauern kann, lohnt es sich CUDA zu installieren und das Training mit deiner Grafikkarte auszuführen. Theoretisch geht es aber auch mit der CPU in endlicher Zeit.

Das Training kannst du so starten:

python train_tts.py --config_path config.json

Samples mit neuem Modell erstellen

Am Ende sollte Coqui eine .pht Datei für dich erzeugt haben. Dies ist deine Modelldatei. Mit der Datei und deiner config.json lässt sich daraus eine Audiodatei generieren.

tts --text "This is only a test" --model_path output/glow_tts/run-April-12-2022_01+12AM-0000000/best_model.pth --config_path config.json --out_path output.wav


Konnte ich helfen? Ich freue mich über einen Drink! 💙