Voiceover und TTS
Voiceover treibt die Zeitleiste an. Erzeuge es, bevor du die visuellen Elemente erstellst.
Wähle eine Engine
| Engine | Ort | Stärke | Achtung |
|---|---|---|---|
| ElevenLabs | Cloud-API | Beste Natürlichkeit, Stimmenklonen | Kostenpflichtig; klone nur Stimmen, für die du eine Einwilligung hast |
| OpenAI TTS | Cloud-API | Einfach, konsistent | Begrenzte Auswahl an Stimmen |
| Kokoro | Lokal | Kostenlos, gute Qualität, offline | Benötigt Python-Setup |
| Piper | Lokal | Schnell, läuft auf CPU | Weniger ausdrucksstark |
| Aufgenommene echte Stimme | Mikrofon | Authentischste Wirkung | Benötigt Bereinigung |
Halte API-Schlüssel in Umgebungsvariablen oder einer .env-Datei, die in .gitignore aufgeführt ist. Gib sie niemals aus oder committe sie.
Bereite das Skript für die Sprachausgabe vor
- Schreibe Zahlen, Einheiten und Akronyme so, wie sie gesprochen werden: „zwanzig sechsundzwanzig“, „A P I“ wenn es buchstabiert werden soll, „Gigabyte“.
- Füge Kommas für Atempausen ein; verwende einen Punkt für einen Stopp; vermeide Klammern.
- Setze schwierige Namen in eine Ausspracheliste und teste sie zuerst in einem kurzen Beispiel.
- Teile in eine Datei pro Szene (
audio/szene-01.mp3). Szenenweise Dateien ermöglichen es, eine einzelne Zeile neu aufzunehmen und die Timing-Flexibilität zu bewahren.
Erzeugen (Beispiel, ElevenLabs REST)
import os, requests, pathlib
def tts(text: str, voice_id: str, out: pathlib.Path) -> None:
r = requests.post(
f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}",
headers={"xi-api-key": os.environ["ELEVENLABS_API_KEY"], "Accept": "audio/mpeg"},
json={"text": text, "model_id": "eleven_multilingual_v2",
"voice_settings": {"stability": 0.5, "similarity_boost": 0.75}},
timeout=120,
)
r.raise_for_status()
out.write_bytes(r.content)
Modellnamen und Endpunkte ändern sich. Bestätige vor der Verwendung die aktuellen Dokumente des Anbieters.
Messen und Tempo
ffprobe -v error -show_entries format=duration -of default=nw=1:nk=1 audio/szene-01.mp3
- Ziele auf 140 bis 160 Wörter pro Minute (Wörter / Sekunden * 60). Erzeuge mit einer leicht anderen Sprechweise neu oder kürze den Text, wenn eine Szene über 180 Wörter pro Minute liegt; es klingt dann gehetzt.
- Dehne Sprache nicht um mehr als etwa 10 Prozent, da sie sonst synthetisch klingt. Schreibe stattdessen um.
Aufgenommene Stimme bereinigen
# Hochpass, sanfte Rauschunterdrückung, Kompression, Lautheit
ffmpeg -i roh.wav -af "hochpass=f=80,afftdn=nf=-25,acompressor=threshold=-18dB:ratio=3:attack=5:release=80,loudnorm=I=-16:TP=-1.5:LRA=11" -ar 48000 sauber.wav
Führende und nachfolgende Stille entfernen:
ffmpeg -i eingabe.wav -af "silenceremove=start_periods=1:start_threshold=-45dB,areverse,silenceremove=start_periods=1:start_threshold=-45dB,areverse" ausgabe.wav
Zusammenfügen
# Szenendateien mit 0,4 s Lücken zusammenfügen
python - <<'PY'
import subprocess, pathlib
dateien = sorted(pathlib.Path("audio").glob("szene-*.mp3"))
teile = []
for i, d in enumerate(dateien):
teile += ["-i", str(d)]
n = len(dateien)
filt = "".join(f"[{i}:a]apad=pad_dur=0.4[a{i}];" for i in range(n)) + "".join(f"[a{i}]" for i in range(n)) + f"concat=n={n}:v=0:a=1[out]"
subprocess.run(["ffmpeg", "-y", *teile, "-filter_complex", filt, "-map", "[out]", "voiceover.mp3"], check=True)
PY
Anschließend mit Musik in audio-mixing mischen und mit captions-subtitles untertiteln.
Ethik und Rechte
- Klone eine Stimme nur mit ausdrücklicher Erlaubnis des Sprechers.
- Gib synthetische Stimmen an, wo Plattformregeln oder Gesetze dies verlangen.
- Prüfe die Lizenz des TTS-Anbieters für die kommerzielle Nutzung.