Andare al contenuto principale
SubtitleMatrix

Convertire TTML in JSON

Oppure incollare il testo dei sottotitoli

Cosa cambia questa conversione

1 elemento viene scartato o richiede una decisione

  • 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.

Fra i formati di questo sito il JSON è l’unico che conserva quasi tutto ciò che un documento TTML porta: ogni cue diventa un oggetto con `id`, `start`, `end`, `lines` e i tag in linea, e gli stili e le posizioni trovano un campo dove stare. Per questo l’elenco delle perdite è corto.

Gli orari arrivano al millisecondo, senza arrotondamenti, perché entrambi i formati li contano così. Ciò che non passa è l’involucro XML: la dichiarazione in testa, i namespace, l’intestazione con `<styling>`, `<layout>` e `<metadata>`, e gli attributi che il modello del JSON non prevede.

Si perdono soltanto i contenuti specifici del formato. La conversione avviene nel browser, senza caricare file e senza registrazione; più file si elaborano in coda e arrivano in un unico ZIP.

Esempi

Un file TTML tipico, convertito in JSON

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

{
  "version": 1,
  "cues": [
    {
      "start": 1000,
      "end": 3500,
      "lines": [
        {
          "text": "Hello there.",
          "tags": [
            {
              "kind": "italic",
              "start": 6,
              "end": 11
            }
          ]
        }
      ]
    },
    {
      "start": 3500,
      "end": 6000,
      "lines": [
        "How are you?",
        "Fine, thanks."
      ]
    }
  ]
}

In questa conversione si perde 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

{
  "version": 1,
  "cues": [
    {
      "start": 1500,
      "end": 3500,
      "lines": [
        "Loaded from an offset and a duration."
      ]
    },
    {
      "start": 4000,
      "end": 6500,
      "lines": [
        "A coarser clock spelling."
      ]
    },
    {
      "start": 7000,
      "end": 8480,
      "lines": [
        "Frames, at 25fps."
      ]
    },
    {
      "start": 9000,
      "end": 11000,
      "lines": [
        {
          "text": "Half-open and Tom &amp; Jerry.",
          "tags": [
            {
              "kind": "color",
              "start": 0,
              "end": 9,
              "value": "#FF0000"
            }
          ]
        }
      ]
    }
  ]
}

Questo è un file reale, non un esempio pulito: prefissi di namespace diversi, fine riga di Windows e riferimenti a stili mancanti. Il confronto con l’esempio qui sopra dice che cosa viene corretto e che cosa viene solo segnalato.

Domande frequenti

Che aspetto ha l’output quando TTML diventa JSON?

Ha l’aspetto del JSON: un array di oggetti cue, ciascuno con `id`, `start`, `end`, `lines` e i tag in linea. Ogni elemento `<p>` diventa un cue, nello stesso ordine e con lo stesso testo.

Che ne è dello stile TTML in JSON?

Il colore, il peso e la famiglia del carattere dichiarati in `<styling>` finiscono nella tabella degli stili dell’oggetto e restano leggibili; ogni cue punta al proprio. È una delle poche direzioni in cui la formattazione non compare fra le perdite.

Che ne è delle regioni e della posizione del TTML?

La regione a cui un `<p>` punta con `region=` viene risolta e la sua posizione conservata nel campo del cue. Il JSON la porta con sé, quindi non compare fra le cose perse.

I millisecondi del TTML arrivano intatti nel JSON?

Sì: entrambi i formati contano il tempo in millisecondi, quindi `00:00:04.126` diventa il numero `4126` senza arrotondamenti e senza spostamenti.

Che cosa si perde davvero convertendo TTML in JSON?

L’involucro XML: la dichiarazione in testa, i namespace, gli elementi `<styling>`, `<layout>` e `<metadata>` come strutture, e gli attributi che il modello del JSON non prevede. Il contenuto dei cue e i loro riferimenti sopravvivono; è la cornice del documento a non passare.

I cue mantengono l’ordine nell’output JSON?

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

L’output JSON conserva la codifica del documento TTML?

No: l’output è UTF-8, con fine riga Unix e senza BOM, qualunque codifica dichiarasse il documento TTML. Ciò che esce è sempre lo stesso JSON in UTF-8.

Strumenti correlati