Andare al contenuto principale
SubtitleMatrix

Convertire TTML in ASS

Oppure incollare il testo dei sottotitoli

Cosa cambia questa conversione

2 elementi vengono scartati o richiedono una decisione

  • Precisione

    la precisione della temporizzazione — l’orologio dell’uscita è più grossolano, quindi ogni timestamp è arrotondato al 10 ms più vicino

  • Contenuto specifico del formato

    il contenuto che il formato di partenza tiene fuori dai suoi blocchi (blocchi non-cue, testo di intestazione, impostazioni per blocco, eventi commentati) — il formato di destinazione non ha un posto per esso

Questo elenco deriva dalla matrice delle capacità di questi due formati, non dal particolare file caricato. Un file specifico può perdere di più se usa caratteristiche che il formato consente ma la matrice non modella.

Un documento TTML porta i sottotitoli in elementi `<p>` con `begin` ed `end`, e porta anche un’intestazione: `<styling>` con colori e pesi del carattere, `<layout>` con origine ed estensione delle regioni, `<metadata>` con informazioni che nessun lettore mostra. L’ASS ha un posto per quasi tutto questo, ma non per tutto.

Il punto in cui la conversione smette di essere esatta è la precisione. Il TTML scrive `00:00:04.126`, l’ASS scrive `0:00:04.13`: i millisecondi vengono arrotondati ai centesimi di secondo, quindi ogni cue si può spostare di 5 ms. Lo stile e la posizione sopravvivono, tradotti nei campi che l’ASS conosce.

Si perdono precisione e contenuti specifici del formato. Il `[Script Info]` e la tabella degli stili vengono costruiti ex novo, e ciò che l’intestazione TTML diceva senza corrispondenza nel modello ASS non viene inventato. Più file si elaborano in coda nel browser, senza caricare nulla.

Esempi

Un file TTML tipico, convertito in ASS

Ingresso

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling" xml:lang="en">
  <head>
    <styling>
      <style xml:id="s1" tts:color="#FFFF00" tts:fontWeight="bold"/>
    </styling>
    <layout>
      <region xml:id="bottom" tts:origin="10% 80%" tts:extent="80% 20%"/>
    </layout>
  </head>
  <body>
    <div>
      <p begin="00:00:01.000" end="00:00:03.500" region="bottom" style="s1">Hello <span tts:fontStyle="italic">there</span>.</p>
      <p begin="00:00:03.500" end="00:00:06.000" region="bottom">How are you?<br/>Fine, thanks.</p>
    </div>
  </body>
</tt>

Uscita

[Script Info]
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,0,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:03.50,Default,,0,0,0,,Hello {\i1}there{\i0}.
Dialogue: 0,0:00:03.50,0:00:06.00,Default,,0,0,0,,How are you?\NFine, thanks.

In questa conversione si perdono la precisione e i contenuti specifici del formato. Tutto il resto resta identico, riga per riga.

La stessa conversione su un input difficile

Ingresso

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling"
    xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
    ttp:frameRate="25" xml:lang="en">
  <body>
    <div>
      <p begin="1.5s" dur="2s">Loaded from an offset and a duration.</p>
      <p begin="4s" end="00:00:06.50">A coarser clock spelling.</p>
      <p begin="00:00:07:00" end="00:00:08:12">Frames, at 25fps.</p>
      <p begin="9s"><span tts:color="#FF0000">Half-open</span> and Tom &amp; Jerry.</p>
    </div>
  </body>
</tt>

Uscita

[Script Info]
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,0,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.50,0:00:03.50,Default,,0,0,0,,Loaded from an offset and a duration.
Dialogue: 0,0:00:04.00,0:00:06.50,Default,,0,0,0,,A coarser clock spelling.
Dialogue: 0,0:00:07.00,0:00:08.48,Default,,0,0,0,,Frames, at 25fps.
Dialogue: 0,0:00:09.00,0:00:11.00,Default,,0,0,0,,{\c&H000000FF&}Half-open{\c} and Tom &amp; Jerry.

È il tipo di danno che i file reali hanno davvero: namespace fuori posto, entità non dichiarate, elementi vuoti. Confrontandolo con l’esempio ordinato qui sopra si vede che cosa il parser perdona.

Domande frequenti

Che ne è dello stile TTML quando il file diventa ASS?

Gli stili dichiarati in `<styling>` diventano stili ASS: colore, peso e famiglia del carattere passano nei campi `[V4+ Styles]` e ogni `Dialogue:` punta allo stile giusto. È il motivo per cui una conversione verso ASS conserva più di una verso SRT.

Che ne è delle regioni di layout TTML?

Le regioni definite in `<layout>` con `tts:origin` ed `tts:extent` diventano il posizionamento del cue ASS. Un `<p>` che punta a una regione esce con la posizione che quella regione descriveva, invece che con il valore predefinito del lettore.

Perché i timecode si sono spostati passando da TTML ad ASS?

Il TTML arriva al millisecondo (`00:00:04.126`) e l’ASS scrive i centesimi (`0:00:04.13`), quindi ogni tempo viene arrotondato ai 10 ms più vicini. Nulla viene allungato o riordinato e nessun cue si muove di più di 5 ms, ma è l’unico punto in cui la conversione perde esattezza.

Che aspetto ha l’output quando TTML diventa ASS?

Ha l’aspetto dell’ASS: nessun numero di cue, ogni sottotitolo è una riga `Dialogue:` nella sezione `[Events]`, con un campo di livello dove l’SRT tiene il numero, e sopra le sezioni `[Script Info]` e `[V4+ Styles]`.

Come esce in ASS un paragrafo TTML con una parola in corsivo?

Come testo con un marcatore di corsivo attorno a quella parola: il `<span tts:fontStyle="italic">` interno al `<p>` viene sciolto nella forma che l’ASS conosce. Il corsivo resta, la forma in cui era scritto no.

I cue mantengono l’ordine nell’output ASS?

Sì, e lungo la strada vengono ordinati per tempo di inizio: prima i più antichi, come si aspetta ogni formato di questo sito. Se il documento TTML elencava i paragrafi fuori sequenza, l’ASS li rimette in ordine: cambia la struttura, non il contenuto.

Che cosa non sopravvive dell’intestazione TTML?

Il `<metadata>` e gli attributi che l’ASS non sa rappresentare: un’informazione come il titolo del documento o il tempo di scorrimento non ha un campo corrispondente e non viene inventata. È il contenuto specifico del formato che compare nell’elenco delle perdite.

Strumenti correlati