ASS/SSA-Untertitel übersetzen, ohne Stile, Positionen oder Karaoke zu zerstören
Übersetze nur den sichtbaren Dialog in einer .ass-Datei und prüfe dann Timing, Tags, Karaoke und Schriftarten. Mit einer Beispieldatei, einem kostenlosen Prüfprogramm und einem lokalen LLM-Test mit 9 Durchläufen.

Eine ASS- oder SSA-Untertiteldatei ist ein kleines Programm: ein Header, eine Tabelle mit Stilen und eine Liste zeitgesteuerter Ereignisse, deren letztes Feld Dialog mit Formatierungscode vermischt. Um sie zu übersetzen, ändere nur die lesbaren Wörter in diesem letzten Feld, lass alles andere Byte für Byte unangetastet und prüfe dann drei Dinge, die kein Übersetzungstool für dich erledigt: die Schriftarten, die Abstandscodes und die Karaoke-Zeilen.
Wir haben ein Beispiel mit 14 Ereignissen neunmal mit einem lokalen Modell ins vereinfachte Chinesisch übersetzt, dabei drei verschiedene Prompts verwendet und jedes Ergebnis mit einem selbst geschriebenen Skript geprüft. Timing, Positionen, Farben, Kommentare und Zeichnungen blieben in allen neun Durchläufen erhalten. Kaputt gingen die Teile der Datei, die Englisch voraussetzen: In allen neun hatten die Stil-Schriftarten keine chinesischen Zeichen, sodass die Datei darauf angewiesen wäre, dass der Player eine Schriftart ersetzt, und ein hartes Leerzeichen aus der englischen Zeile wurde im Chinesischen zu einer sichtbaren Lücke. Die Karaoke-Zeile kam in jedem Durchlauf mit ihrem Timing auf die falschen Wörter zurück, und in vier Durchläufen hoben einige Silben gar nichts hervor.
Kurzantwort: Was übersetzen und was unangetastet lassen
| Teil der Datei | Beispiel aus unserer Vorlage | Übersetzen? |
|---|---|---|
[Script Info]-Header | PlayResX: 1920, WrapStyle: 0 | Nein. Positionen werden aus diesen Werten berechnet. |
[V4+ Styles] | Style: Default,Trebuchet MS,64,... | Nein, außer dem Schriftartnamen, den du möglicherweise bewusst ändern musst |
| Ereignisfelder 1–9 | 0,0:00:01.00,0:00:03.20,Default,Jun,0,0,0, | Nein. Das sind Ebene, Timing, Stil, Sprecher, Ränder und Effekt. |
| Override-Blöcke | {\i1}, {\an8\pos(960,120)}, {\k25} | Nein |
| Zeichnungen | {\p1}m 0 0 l 200 0 200 60 0 60{\p0} | Nein. Das ist eine Vektorform, kein Text. |
Comment:-Ereignisse | Comment: ...,Earlier draft: Try the stacks. | Optional. Kommentare erscheinen nie auf dem Bildschirm. |
| Notizen in geschweiften Klammern | {TL note: "stacks" means the closed shelves} | Optional. Player ignorieren sie. |
| Sichtbarer Dialog | Did you find the second volume? | Ja |
| Zeilen-Codes | \N, \n, \h | Behalte \N bei. Entscheide im Einzelfall über \n und \h. |
Der Rest dieser Anleitung erklärt, warum jede Zeile wichtig ist und wie du das Ergebnis überprüfst.
Wie eine ASS-Zeile aufgebaut ist
Jede Zeile im Abschnitt [Events] folgt dem Format, das direkt darüber deklariert wird:
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:03.40,0:00:06.10,Default,Mara,0,0,0,,{\i1}I thought it was{\i0} sold out.
Nur das zehnte Feld, Text, enthält etwas, das ein Zuschauer liest. Der ASS-Dateiformat-Leitfaden des libass-Projekts merkt an, dass dieses letzte Feld „Kommata enthalten darf“, weshalb ein unvorsichtiges Aufteilen an jedem Komma eine Zeile wie Well, if it's there, then, we go now. zerstört. Ein sicheres Werkzeug teilt nur an den ersten neun Kommata.
Innerhalb von Text ist alles in geschweiften Klammern ein Override-Block. Die Override-Tag-Referenz von Aegisub definiert die Codes, die dir am häufigsten begegnen werden:
\Nerzwingt einen Zeilenumbruch in jedem Umbruchmodus.\nbricht die Zeile nur im Umbruchmodus 2 und ist ansonsten ein Leerzeichen.\hist ein geschütztes Leerzeichen.\an8legt die Ausrichtung mithilfe des numerischen Tastenfeld-Layouts fest, sodass 8 oben mittig bedeutet.\pos(960,120)platziert die Zeile an Skriptkoordinaten.\k25ist eine Karaoke-Silbe; Dauern werden in Hundertstelsekunden angegeben, sodass 25 eine Viertelsekunde bedeutet.- Nach
\p1wird der Text „als Zeichenanweisung interpretiert“, weshalb ein Übersetzer, derm 0 0 l 200 0„übersetzt“, eine Form zerstört. - Nicht erkannter Text in geschweiften Klammern „wird stillschweigend ignoriert“, weshalb Fansub-Dateien oft Übersetzeranmerkungen in geschweiften Klammern enthalten.
Zeilen, die mit Comment: beginnen, verwenden dieselben Felder, aber laut dem libass-Leitfaden „wird nichts auf dem Bildschirm angezeigt.“
Was wir getestet haben
Wir haben sample-source.ass geschrieben, eine Szene mit 14 Ereignissen in einer Buchhandlung, mit je einem Beispiel für jedes der oben genannten Merkmale: Kursivschrift, ein harter Umbruch, Kommata im Dialog, eine Klammeranmerkung, eine Kommentarzeile, ein positioniertes Schild, eine Vektorbegrenzung, eine Überblendung, ein geschütztes Leerzeichen, eine Farbänderung mit \r, ein weicher Umbruch, einen scrollenden Banner-Effekt und eine Karaoke-Zeile mit sechs Silben.
Dann baten wir ein lokales Modell, es auf drei Arten ins vereinfachte Chinesisch zu übersetzen:
- Ganze Datei. Die gesamte
.ass-Datei einfügen und um die übersetzte Datei zurückbitten. - Nur Text. Nur das Feld
Textjeder Dialogzeile als JSON senden, mit den Tags inline und der Anweisung, jeden{...}-Block und jedes\N,\nund\hbeizubehalten. - Geschützt. Dasselbe, aber zuerst jeden Klammerblock und Zeilencode durch einen nummerierten Platzhalter ersetzen und die Originale anschließend wieder einsetzen.
In der zweiten und dritten Bedingung sendet das Skript nie die Vektorzeichnung oder die Kommentarzeile an das Modell, sodass diese Zeilen nur in der Bedingung mit der ganzen Datei beschädigt werden konnten.
Das Modell war Qwen 3.6 27B (Q4_K_M) in LM Studio 0.4.8 auf einem Apple M4 Max mit 64 GB Arbeitsspeicher, mit deaktiviertem Denken und Temperatur 0,3. Wir führten jede Bedingung dreimal aus, insgesamt neun Läufe. Der erste Versuch des dritten Laufs endete, als der lokale Server die Verbindung trennte, also starteten wir ihn neu und führten die dritte Runde erneut aus. Das Skript ist run_llm_ass_test.py, und alle neun Ausgaben sind unverändert daneben veröffentlicht; die README listet jede Datei auf. Wenn du noch nie ein lokales Modell eingerichtet hast, deckt unser Leitfaden zur lokalen LLM-Übersetzung die Einstellungen ab.
Dies war ein kleiner Test mit einem Modell, einem Sprachpaar und einem Beispiel. Er zeigt, welche Probleme auftreten und wie man sie erkennt. Er bewertet keine Werkzeuge oder Prompts.
Ergebnis: Die Mechanik überlebte; die englischen Annahmen nicht
Wir haben jede Ausgabe mit check_ass_translation.py überprüft. Die vollständige Ausgabe steht in check-results.txt, und results.csv enthält eine Zeile pro Lauf, einschließlich Problemen, die das Skript nicht sehen kann.
| Prüfung | Gesamte Datei | Nur Text | Geschützt |
|---|---|---|---|
| Timing, Stile und Felder 1–9 unverändert | 3 von 3 | 3 von 3 | 3 von 3 |
| Override-Tags unverändert | 3 von 3 | 2 von 3 | 3 von 3 |
| Zeichnungs- und Kommentarzeilen unberührt | 3 von 3 | 3 von 3 | 3 von 3 |
| Stil-Schriftarten können die Übersetzung darstellen | 0 von 3 | 0 von 3 | 0 von 3 |
\h und \n bleiben als Lücken im chinesischen Text erhalten | 3 von 3 | 3 von 3 | 3 von 3 |
| Alle Karaoke-Tags beibehalten, jeweils mit Text | 3 von 3 | 0 von 3 | 1 von 3 |
Zwei Ergebnisse haben uns überrascht. Das Einfügen der gesamten Datei hat die Struktur in allen drei Durchläufen intakt gehalten, obwohl in zwei davon auch die Title-Zeile im Header übersetzt wurde. Und der reine Text-Prompt, der sicherer klingt, produzierte die einzigen kaputten Tags. In einem Durchlauf gab er {\k25}翻{\k30}页,{\k45}开{\k60}灯 für eine Zeile mit sechs Karaoke-Tags zurück. Die letzten beiden Tags und 1,20 Sekunden Hervorhebungszeit waren verschwunden, sodass die Hervorhebung lange vor der Zeile enden würde. Derselbe Durchlauf machte aus Room\h12 is upstairs. die Zeile 12\h12号房间在楼上。, wobei die Zimmernummer doppelt vorkam.
Die nützliche Lehre ist also nicht „Verwende Prompt X“. Sie lautet vielmehr, dass der strukturelle Schaden, den man befürchtet, leicht zu erkennen ist, und dass der Schaden, der in allen neun Durchläufen tatsächlich durchkam, an drei Stellen sitzt, die die Tool-Seiten zur ASS-Übersetzung nicht behandeln.
1. Die Schriften können die neue Sprache nicht darstellen
Die Stile des Beispiels verwenden Trebuchet MS für Dialoge und Georgia für Schilder, was für eine englische Veröffentlichung normal ist. Keine der beiden Schriften enthält chinesische Zeichen. Als wir den Glyphentest des Prüfers auf die beiden Schriftdateien anwendeten, schlugen alle 12 übersetzten Text-Events in jedem Durchlauf fehl:
ERROR event 1: font 'Trebuchet MS' has no glyph for 9 characters, e.g. 了二你到卷吗找第?
ERROR event 7: font 'Georgia' has no glyph for 10 characters, e.g. 书人仅作员工库架闭限
Ein Player kann eine andere installierte Schrift ersetzen, sodass der Untertitel möglicherweise trotzdem erscheint, aber die Veröffentlichung kontrolliert dann nicht mehr, wie er aussieht, und ein Zuschauer, dessen System keine geeignete Schrift hat, sieht möglicherweise leere Kästchen. Die Lösung ist eine bewusste Änderung des Feldes Fontname jedes Stils. Als wir alle drei Stile in einer Ausgabe auf Hiragino Sans GB änderten, eine chinesische Schrift, die mit macOS ausgeliefert wird, und den Glyphentest gegen diese Schrift laufen ließen, gingen die Glyphenfehler auf null zurück.
Wähle eine Schrift, die deine Zuschauer tatsächlich haben, oder liefere sie mit dem Video aus. Der libass-Leitfaden empfiehlt, dass Veröffentlichungen jede verwendete Schrift beifügen, vorzugsweise im MKV-Container. Da die Schrift der Zielsprache neu ist, gehört das Beifügen nun zur Übersetzungsarbeit.
2. Abstandscodes tragen englische Gewohnheiten
Room\h12 klebt „Room“ an „12“, damit sie nie über Zeilen hinweg getrennt werden. Im Chinesischen werden Wörter nicht durch Leerzeichen getrennt, aber jeder Durchlauf behielt das \h irgendwo: Fünf Durchläufe platzierten es zwischen 12号房间 und 在楼上, drei setzten es vor die Zahl, und einer setzte es zwischen zwei Kopien der Zahl. So oder so sieht der Zuschauer ein überflüssiges Leerzeichen. Wait\nhere. hatte dasselbe Problem. Mit WrapStyle: 0 wird das \n als Leerzeichen dargestellt, sodass 在\n这里等 eine Lücke in der Mitte eines Satzes aus drei Wörtern zeigt.
Die Struktur ist hier in Ordnung; die Sprache nicht. Für eine Zielsprache ohne Leerzeichen zwischen Wörtern entferne \h und \n aus dem übersetzten Text. Behalte \N nur dort, wo du einen erzwungenen Zeilenumbruch willst, und platziere ihn an einer natürlichen Stelle im Ziel-Satz. Der Prüfer meldet geänderte \h- und \n-Anzahlen aus diesem Grund als Warnungen statt als Fehler, und er warnt, wenn eines davon in chinesischem, japanischem oder koreanischem Text überlebt.
3. Karaoke-Timing gehört zu den Originalwörtern
Die Karaoke-Zeile {\k25}Turn {\k30}the {\k45}page, {\k60}turn {\k40}the {\k80}light taktet jede englische Silbe auf das Lied. Eine Übersetzung kann dieses Timing nicht sinnvoll beibehalten, weil die chinesischen Wörter nicht auf dieselben Beats fallen. Unsere Durchläufe zeigen die verschiedenen Arten, wie es schiefgeht:
- In vier Durchläufen wurden alle sechs Tags beibehalten, jedes auf einem anderen Wort als zuvor. Einer davon endete mit
{\k40}打{\k80}开, „öffnen“, und ließ „light“ ganz aus der Zeile weg. - In vier Durchläufen hob eine Silbe nichts hervor, wie bei
打开{\k40}{\k80}灯(0,40 Sekunden Hervorhebung auf einer leeren Silbe). In zwei davon hob eine 0,45-Sekunden-Silbe nur ein Komma hervor. - In einem Durchlauf verschwanden zwei Tags, wie oben beschrieben.
Der Prüfer markiert eine an Ort und Stelle übersetzte Karaoke-Zeile und jede Silbe, die ohne Text bleibt. Die bessere Lösung ist redaktionell: Übersetze Karaoke nicht an Ort und Stelle. Behalte die originale getaktete Zeile zum Mitsingen und füge die Übersetzung als separates Event hinzu: Kopiere das Karaoke-Event, gib ihm einen eigenen Stil (zum Beispiel kleiner und unten platziert), entferne die \k-Tags und übersetze den Text. Takte es nur dann Silbe für Silbe neu, wenn du bereit bist, es selbst auf das Audio abzustimmen.
Ein Workflow, der Bestand hat
-
Mache zuerst die Quelle lesbar. Wenn die Datei fehlerhafte Zeichen zeigt, behebe die Kodierung, bevor du etwas anderes tust. Unser Kodierungs-Leitfaden verwendet SRT-Beispiele, aber dieselben Schritte auf Byte-Ebene funktionieren auch für eine
.ass-Datei und bewahren die Originalbytes. Der Prüfer liest nur UTF-8 und UTF-16. -
Lege den Umfang fest. Liste die Stile auf und entscheide, welche Dialoge, welche Bildschirmschilder und welche Karaoke sind. Schilder müssen meist übersetzt werden; Karaoke braucht meist eine separate Zeile; Kommentare und Klammernotizen liegen in deinem Ermessen.
-
Übersetze nur das Feld
Text. Verwende ein Tool, das ASS parst, statt es als reinen Text zu behandeln, oder schütze die Tags selbst wie in unserer dritten Bedingung. Bewahre die Quelldatei neben der Ausgabe auf. -
Führe die Strukturprüfung aus.
python3 check_ass_translation.py source.ass translated.assSie vergleicht Event-Anzahl, Event-Typen, Felder 1–9, Stilwerte, Override-Blöcke, Zeichnungen, Kommentarzeilen,
\N, Karaoke-Silben und -Dauern sowie Zeilen, die leer oder unverändert zurückkamen. Die Übersetzungsqualität beurteilt sie nicht. -
Schriften bewusst anpassen. Ändere
Fontnamein jedem Stil, der nun Text in der Zielsprache enthält, und führe dann den Glyphentest mit der Schriftdatei durch, die du ausliefern wirst:pip install fonttools python3 check_ass_translation.py source.ass translated.ass --font "Noto Sans SC=/path/to/NotoSansSC-Regular.otf"Ein geänderter Schriftname erscheint als Warnung, sodass du bestätigen kannst, dass jede Änderung beabsichtigt war.
-
Bereinige Abstandscodes und Karaoke wie oben beschrieben.
-
Prüfe es mit dem Video. Öffne die Datei in Aegisub oder deinem Player. Stelle sicher, dass Schilder noch in die dahinter gezeichneten Formen passen, denn eine
\p-Box behält ihre englische Größe, während ein übersetztes Schild viel länger oder kürzer sein kann. Prüfe, ob Zeilen für ihre Anzeigedauer nicht zu lang sind. Keines der beiden Probleme ist in der Datei selbst sichtbar.
Wo BookTranslator ins Spiel kommt
BookTranslators Untertitel-Übersetzer akzeptiert SRT-, VTT-, ASS- und SSA-Dateien. Laut Produktseite bleiben Zeitstempel und Reihenfolge der Cues erhalten, und die unterstützten ASS- und SSA-Formatierungen bleiben an jedem Untertitel-Eintrag haften, sodass du den Text nicht selbst extrahieren und wieder einfügen musst. Dialoge werden mit den umgebenden Zeilen als Kontext übersetzt, was bei Namen und wiederkehrenden Witzen über eine ganze Episode hinweg hilft.
Wir haben dieses Beispiel für diesen Artikel nicht durch BookTranslator laufen lassen. Welches Tool du auch verwendest, führe die Schritte 4 bis 7 mit dem Ergebnis durch. Ein Stil, der seine englische Schrift behält, ist immer noch ein Stil, der kein Chinesisch darstellen kann, und an Ort und Stelle übersetzte Karaoke erfordert weiterhin eine redaktionelle Entscheidung. Für den Rest des Untertitel-Workflows siehe unseren Leitfaden zur KI-Untertitelübersetzung, unseren Vergleich von Untertitel-Übersetzungssoftware und, falls deine Übersetzung zu YouTube geht, den YouTube-Untertitel-Workflow.
Wann du stattdessen zu SRT konvertieren solltest
Die Konvertierung von ASS zu SRT vor der Übersetzung entfernt Stile, Positionen, Zeichnungen und Karaoke, was auch die meisten der oben genannten Probleme beseitigt. Das ist ein vernünftiger Kompromiss, wenn dein Ziel nur einfache Untertitel anzeigt oder wenn das Styling für die Veröffentlichung nie wichtig war. Es ist der falsche Kompromiss für Anime- und Musikveröffentlichungen, bei denen Schilder und Karaoke Teil des Werks sind. Entscheide danach, wo die Datei gezeigt wird, nicht danach, welches Format leichter zu übersetzen ist.
Lade die Testdateien herunter
Alles aus diesem Test darf frei wiederverwendet werden:
- sample-source.ass: das englische Beispiel mit 14 Events;
- check_ass_translation.py: der Checker (Python-Standardbibliothek; der
--font-Test benötigt fontTools); - run_llm_ass_test.py: die drei Prompt-Bedingungen für jeden OpenAI-kompatiblen lokalen Server;
- results.csv und check-results.txt: Ergebnisse pro Durchlauf;
- README.txt: die Dateiliste und Testeinstellungen, mit den neun unveränderten Ausgaben im Ordner
outputs.
Verwandte Beiträge




