Ich habe meine TTS-Engine ausgetauscht. Der API-Call war der einfachste Teil.
Google Chirp 3 HD in Katto: Warum Timing schwieriger war als der API-Wechsel. Ein technischer Blick auf 19 Sprachen und 12 Stimmen.
13. September 2026
Katto hatte bereits AI-Dubbing. Du konntest einen kurzen Clip nehmen, eine Sprache wählen und eine übersetzte Version zurückbekommen. Die erste Version nutzte Kokoro und deckte acht Sprachen ab.
Vor Kurzem habe ich die primäre Speech-Engine auf Google Cloud Text-to-Speech mit Chirp 3 HD umgestellt. Das Ziel sah simpel aus: bessere Stimmen, mehr Sprachen. Katto bietet jetzt 19 Dubbing-Sprachen und 12 kuratierte Stimmen im Editor an.
Ich dachte, die Migration wäre hauptsächlich ein API-Swap.
War sie nicht.
Einen natürlichen Satz zu generieren ist einfach. Diesen Satz so zu platzieren, dass er exakt in den Raum passt, den ein anderer Sprecher hinterlassen hat – das ist das eigentliche Dubbing-Problem.
Wenn der Original-Sprecher etwas in 2,4 Sekunden sagt und die Übersetzung 3,2 Sekunden braucht, rettet dich auch das beste TTS-Modell nicht. Die Stimme läuft in den nächsten Satz, die Untertitel driften auseinander, oder die Sprache muss so stark beschleunigt werden, dass sie gehetzt klingt.
Der TTS-Request war am Ende der kleinste Teil des Systems.
Die Pipeline, bei der ich gelandet bin
gecachte Wort-Timings
|
v
Phrasen-Segmente mit festen Zeitslots
|
v
längen-bewusste Übersetzung
|
v
Google Chirp 3 HD, eine Phrase nach der anderen
|
v
begrenzte Audio-Ausrichtung mit FFmpeg
|
+----> übersetzte Captions aus denselben Segmenten
|
v
finaler MP4-RemuxJede Stufe existiert, weil eine einfachere Version auf andere Weise gescheitert ist.
1. Das Original-Timing als Daten behalten
Katto hat bereits Wort-Timestamps aus seiner Transkriptions-Pipeline. Ich schicke nicht das komplette Transkript als einen Block zur Übersetzung und TTS. Ich gruppiere Wörter in Phrasen.
Eine Phrase endet bei Satzzeichen, nach einer Pause länger als 0,6 Sekunden oder wenn sie sechs Sekunden überschreiten würde. Jedes Segment behält seinen ursprünglichen Start und sein Ende. Diese Zahlen werden zum Vertrag für alle späteren Stufen.
Das komplette Transkript zu synthetisieren mag glatter klingen, aber es entfernt die Anker, die nötig sind, um Sprache zurück auf die Video-Timeline zu setzen. Phrasen-basierte Synthese bewahrt genug Kontext für eine natürliche Stimme und behält gleichzeitig nützliche Timing-Grenzen.
2. Für gesprochene Dauer übersetzen, nicht nur für Bedeutung
Eine korrekte schriftliche Übersetzung kann eine schlechte Dubbing-Übersetzung sein. Manche Sprachen brauchen mehr Silben, um dieselbe Idee auszudrücken. Eine wörtliche Version kann jede Nuance bewahren und trotzdem unbrauchbar sein, weil sie nicht in ihren Slot passt.
Für jede Gruppe von Phrasen frage ich Claude Haiku nach einer natürlichen gesprochenen Übersetzung, die kürzere Formulierungen und weniger Silben bevorzugt. Die Antwort bewahrt jeden Quell-Segment-Index.
Der Prompt ist Teil des Audio-Systems. Seine Aufgabe ist nicht nur linguistische Genauigkeit. Er reduziert auch das später nötige Time-Stretching.
Das bleibt eine Heuristik. Ein LLM kann keine Dauer garantieren, weil die gewählte Stimme auch das Tempo verändert. Die Audio-Schicht misst trotzdem die generierte WAV. Ein In-Process-Cache mit Zielsprache und Quell-Segmenten als Schlüssel lässt weitere Renderings die Übersetzung wiederverwenden, solange der Worker läuft.
3. Eine Phrase nach der anderen synthetisieren
Jede übersetzte Phrase geht als 24 kHz LINEAR16-Audio zur Google Cloud Text-to-Speech REST API. Voice-Namen folgen dem Format locale-Chirp3-HD-speaker, wie von Google dokumentiert.
Google unterstützt mehr Chirp 3 HD Locales als Katto aktuell anbietet. Ich habe das Produkt bewusst auf 19 Sprachen begrenzt, die durch den kompletten Pfad verdrahtet sind: UI, Locale-Mapping, Fonts, Captions und Fallback-Verhalten. Dass eine API eine Sprache behauptet, heißt nicht, dass das umgebende Produkt sie korrekt unterstützt.
4. Sprache in den Slot einpassen, ohne sie zu zerstören
Nach der Synthese vergleiche ich die generierte Dauer mit dem Original-Slot.
target_duration = segment["end"] - segment["start"]
ratio = generated_duration / target_duration
Wenn die Sprache etwas zu lang ist, beschleunigt FFmpegs atempo-Filter sie unter Beibehaltung der Tonhöhe. Ich begrenze die Beschleunigung auf 1,3x.
Diese Grenze ist wichtig. Ein früheres 1,6x-Limit ließ mehr Phrasen passen, aber manche Stimmen klangen unnatürlich gehetzt. Perfekte Ausrichtung ist nicht nützlich, wenn das Ergebnis unangenehm klingt.
Jede angepasste Phrase wird an ihrem ursprünglichen Offset in einer Master-Spur platziert. Kurze Phrasen hinterlassen eine natürliche Pause. Längere Phrasen bekommen eine begrenzte Korrektur. Das löst nicht jede pathologische Übersetzung. Es erzwingt eine nützlichere Regel: Verständlichkeit bewahren, bevor man mathematisch perfektem Timing nachjagt.
5. Sprache und Captions dieselbe Uhr geben
Die Synthese-Antwort gibt mir Audio, aber keine verlässlichen Wort-Timestamps für den neu gesprochenen Text. Wort-Level-Timing zu erfinden würde die Captions präzise aussehen lassen, während sie falsch sind.
Gedubte Clips nutzen daher Phrasen-Level-Captions, die aus denselben übersetzten Segmenten generiert werden, die für Sprache genutzt wurden. Ihre Start- und Endzeiten passen bereits zur Audio-Platzierung.
Der Renderer wählt auch Fonts, die das Ziel-Skript abdecken. Lateinische Fonts reichen nicht für Japanisch, Chinesisch, Hindi oder Arabisch. Intro-Titel und AI-Hooks folgen demselben Lokalisierungs-Pfad, sodass der Bildschirm nicht eine Sprache spricht und eine andere anzeigt.
Die gewöhnlichen Produktions-Probleme waren auch wichtig
Nicht jeder kuratierte Speaker funktionierte in jedem Locale, das ich getestet habe. Wenn eine gewählte Stimme nicht verfügbar ist, versucht Katto es einmal mit einem bekannten Default für das gewählte Geschlecht. Die Live-Vorschau des Editors ruft dieselbe Google-Engine auf. Ein Sample von einem anderen Modell würde den User eine Stimme wählen lassen, die er nie bekommt.
Der Produktions-API-Key ist auf die VPS-IPv4-Adresse beschränkt, aber der VPS bevorzugte IPv6 beim Erreichen von Google. Valide Requests wurden abgelehnt, bis der TTS-Call durch IPv4 gezwungen wurde. Die API, der Key und der Code waren korrekt. Der Netzwerk-Pfad war es nicht.
Dubbing produziert eine separate Video-Variante. Wenn Übersetzung, Synthese, Caption-Rendering oder Remuxing fehlschlägt, bleibt der Original-Clip intakt. Für die ursprünglichen acht Sprachen bleibt Kokoro verfügbar, wenn der Google-Pfad deaktiviert oder nicht konfiguriert ist.
Was sich geändert hat und was nicht
Das sichtbare Ergebnis war eine Erweiterung von 8 auf 19 Dubbing-Sprachen, plus wählbare Stimmen und Live-Vorschauen.
Die tiefere Verbesserung war architektonisch. Übersetzung, Sprache, Captions, Overlays und Video-Rendering teilen jetzt eine zeitliche Einheit: das Phrasen-Segment.
Das System klont nicht den Original-Sprecher, führt kein Lip-Sync durch und erfindet keine generierten Wort-Timestamps. Sehr lange Übersetzungen können immer noch ihren idealen Slot überschreiten. Diese Limits sind besser, als Präzision zu behaupten, die die Pipeline nicht liefern kann.
Ich dachte, ich würde eine Speech-Engine ersetzen. Ich habe am Ende den Vertrag zwischen fast jeder Stufe der Media-Pipeline verschärft.
Der API-Call war der einfache Teil. Das Ergebnis so zu gestalten, dass es auf die Original-Timeline gehört, war die Arbeit.
Katto verwandelt lange Videos in kurze vertikale Clips und kann diese Clips jetzt in 19 Sprachen dubben. Wenn du multilinguales Video baust, würde mich interessieren, wie du Timing handhabst, ohne dass die Stimme gehetzt klingt.
Referenzen
Ähnliche Artikel
Bereit, deine Videos in virale Clips zu verwandeln?
Katto schneidet, untertitelt und rahmt deine langen Videos automatisch zu Kurzform-Content um.
Katto kostenlos testen →