Naar de hoofdinhoud
SubtitleMatrix

ASS naar TTML

FormaatconversieAdvanced SubStation Alpha (ASS)
Of plak ondertiteltekst

Wat deze conversie verandert

2 dingen vervallen of vragen om een beslissing

  • Karaoke

    karaoke-timing (markering per lettergreep)

  • Formaatspecifieke inhoud

    inhoud die het bronformaat buiten zijn blokken bewaart (blokken die geen ondertitel zijn, koptekst, instellingen per blok, uitgecommentarieerde gebeurtenissen) — het doelformaat heeft er geen plek voor

Deze lijst komt uit de capaciteitenmatrix voor deze twee formaten, niet uit het bestand dat je hebt geladen. Een specifiek bestand kan meer verliezen wanneer het kenmerken gebruikt die het formaat toestaat maar de matrix niet modelleert.

Deze pagina zet een ASS-script om naar TTML, het XML-formaat achter veel uitzend- en streamingpijplijnen. De vorm is anders: een XML-declaratie, een tt-element met de TTML-namespaces, en daarin een body met per cue een p-element dat zijn begin en eind als attributen draagt. Elke Dialogue-regel wordt zo’n p, in dezelfde volgorde, met dezelfde tekst.

Tijden en woorden komen heel over, en opmaak die bij een stuk tekst hoort ook: cursief en vet worden spans met een TTML-attribuut, en een regeleinde binnen een cue wordt een br-element. Karaoketiming kan niet mee — TTML heeft geen manier om een moment binnen een regel vast te leggen — en het script als geheel valt weg: het Script Info-blok, de stijltabel, de Comment-regels en de ingebedde lettertypen en afbeeldingen.

TTML heeft eigen middelen voor styling en regio’s, maar de blokken van ASS hebben geen één-op-één-vertaling daarnaartoe, en de omzetter verzint er geen. Het verliesoverzicht noemt het, en de omzetting draait in je browser.

Voorbeelden

Een typisch ASS-bestand, omgezet naar TTML

Invoer

[Script Info]
Title: Example
ScriptType: v4.00+
WrapStyle: 0

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
Style: Title,Arial,36,&H0000FFFF,&H000000FF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello there.
Dialogue: 0,0:00:05.00,0:00:08.50,Default,,0,0,0,,{\i1}Italic{\i0} and {\b1}bold{\b0} text.
Dialogue: 0,0:00:09.00,0:00:12.00,Title,,0,0,0,,{\pos(320,240)}Positioned
Dialogue: 0,0:00:13.00,0:00:16.00,Default,,0,0,0,,{\k50}ka{\k30}ra{\k20}o{\k10}ke
Dialogue: 0,0:00:17.00,0:00:20.00,Default,,0,0,0,,Line one\NLine two
Dialogue: 1,0:00:21.00,0:00:24.00,Default,,0,0,0,,{\an7}Top left

Uitvoer

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling">
  <body>
<p begin="00:00:01.000" end="00:00:04.000">Hello there.</p>
<p begin="00:00:05.000" end="00:00:08.500"><span tts:fontStyle="italic">Italic</span> and <span tts:fontWeight="bold">bold</span> text.</p>
<p begin="00:00:09.000" end="00:00:12.000">Positioned</p>
<p begin="00:00:13.000" end="00:00:16.000">karaoke</p>
<p begin="00:00:17.000" end="00:00:20.000">Line one<br/>Line two</p>
<p begin="00:00:21.000" end="00:00:24.000">Top left</p>  </body>
</tt>

In deze uitvoer verloren: karaoke en formaateigen inhoud. Al het andere komt regel voor regel overeen.

Dezelfde omzetting op een rommelige invoer

Invoer

[Script Info]
; 一份真实的脏文件:BOM + CRLF + 认不出的覆写码 + Comment + 坏时间码
Title: Dirty sample
ScriptType: v4.00+

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Fonts]
fontname: Arial
!!!!!!!!!!!!!!!!!!!!!!!!!!!!

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Comment: 0,0:00:00.00,0:00:01.00,Default,,0,0,0,,这是一条注释,不该变成字幕
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello, world
Dialogue: 0,0:00:05.00,0:00:08.00,Default,,0,0,0,,{\fad(300,300)}Unmodelled override
Dialogue: 0,0:00:09.00,0:00:12.00,Default,,0,0,0,,{\an7\pos(320,240)}Both, wrong order
Dialogue: 0,0:00:13.00,0:00:16.5,Default,,0,0,0,,One decimal centisecond
Dialogue: 0,0:00:17.00,0:00:20.00,Default,,0,0,0,,Soft\nbreak
Dialogue: 0,0:00:xx.00,0:00:24.00,Default,,0,0,0,,Broken timecode

Uitvoer

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling">
  <body>
<p begin="00:00:01.000" end="00:00:04.000">Hello, world</p>
<p begin="00:00:05.000" end="00:00:08.000">{\fad(300,300)}Unmodelled override</p>
<p begin="00:00:09.000" end="00:00:12.000">Both, wrong order</p>
<p begin="00:00:13.000" end="00:00:16.500">One decimal centisecond</p>
<p begin="00:00:17.000" end="00:00:20.000">Soft<br/>break</p>  </body>
</tt>

Zo zien echte bestanden eruit — gemengde regeleinden, losse spaties, lege velden. Vergelijk met het nette voorbeeld hierboven om te zien wat de parser vergeeft.

Veelgestelde vragen

Wat gebeurt er met karaoketiming van ASS naar TTML?

De timing gaat weg, de woorden blijven. Karaoke zit in de codes die een ASS-event draagt en die markeren wanneer elke lettergreep oplicht; TTML kan geen moment binnen een regel vastleggen, dus de markeringen verdwijnen en de lettergrepen komen als gewone TTML-tekst aan.

Wat gebeurt er met het Script Info-blok en de rest van het script in TTML?

Alleen de Dialogue-regels worden ondertitels. Het Script Info-blok (de titel inbegrepen — TTML heeft er geen plek voor), de stijltabel, eventuele Comment-regels en alles wat in Fonts of Graphics is ingebed, vallen weg. Voor een script waarvan de styling met de hand is geschreven, is dat het verlies dat het meest opvalt.

Hoe ziet de TTML-uitvoer eruit als ASS wordt omgezet?

Als TTML: een XML-declaratie, een tt-element met de TTML-namespaces en daarin een body met één p-element per cue. Elk p draagt zijn begin en eind als attributen; er zijn geen cue-nummers en geen Dialogue-regels zoals in ASS.

Zijn de ASS-tijden exact in het TTML-bestand?

Ja, tot op de milliseconde — fijner gaat geen van beide formaten. ASS schrijft een moment als 0:00:04.13 en TTML schrijft hetzelfde moment als 00:00:04.130; niets wordt afgerond of verschoven, en een cue die 2,9 seconden in beeld was, blijft dat.

Hoe komt een ASS-blok van twee regels in TTML terecht?

Als twee regels met een br-element ertussen, de manier waarop TTML een harde regeleinde schrijft. Het paar blijft bij elkaar: de twee ASS-regels horen in de TTML-uitvoer nog steeds bij één ondertitel, en een speler toont ze samen.

Blijft de volgorde van ASS-blokken bewaard in TTML?

Ja, en ze worden onderweg op begintijd gesorteerd — vroegste eerst, zoals een speler ze leest. Stond je ASS-bestand niet in tijdsorde, dan zet de TTML-uitvoer de p-elementen terug in de juiste; dat is een structurele wijziging, geen inhoudelijke.

Kan ik de TTML daarna weer naar ASS omzetten?

Ja, en die richting heeft zijn eigen lijst: TTML naar ASS verliest precisie en formaateigen inhoud, waaronder de styling- en regiosecties van TTML. Die lijst verschilt van de lijst hierboven omdat de twee formaten verschillende dingen bewaren.

Behoudt de TTML-uitvoer de tekencodering van het ASS-bestand?

Nee — de uitvoer is UTF-8, met Unix-regeleinden en zonder byte-order mark, wat het ASS-bestand ook gebruikte. Een bestand in UTF-16 of een Windows-eenbytecodering wordt bij het inlezen gedecodeerd; wat eruit komt is altijd dezelfde UTF-8-TTML.

Gerelateerde hulpmiddelen