Naar de hoofdinhoud
SubtitleMatrix

JSON naar TTML

Of plak ondertiteltekst

Wat deze conversie verandert

1 ding vervalt of vraagt om een beslissing

  • Karaoke

    karaoke-timing (markering per lettergreep)

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 JSON om naar TTML. Je sleept een bestand naar het vak of plakt de tekst erin, en je krijgt de TTML-versie terug. De conversie draait volledig in je browser: er wordt niets geüpload en je hebt geen account nodig.

De twee formaten bewaren niet hetzelfde, en dat verschil is niet cosmetisch: karaoketiming heeft in TTML geen plek. De lijst hierboven komt uit wat beide formaten elk kunnen uitdrukken, niet uit jouw bestand, dus het antwoord is hetzelfde vóór je iets laadt.

TTML is XML: elke ondertitel is een p-element met begin en end, genest in een body. Eén bestand kan, een heel seizoen ook: de wachtrij werkt ze in volgorde af en levert één ZIP op.

Voorbeelden

Een typisch JSON-bestand, omgezet naar TTML

Invoer

{
  "version": 1,
  "title": "Fixture: typical",
  "fps": 25,
  "styles": {
    "Default": {
      "name": "Default",
      "fontFamily": "Arial",
      "fontSize": 20,
      "primaryColor": "#FFFFFF",
      "bold": false,
      "italic": false
    }
  },
  "generator": "subtitlematrix fixtures",
  "cues": [
    {
      "id": "1",
      "start": 0,
      "end": 2000,
      "lines": [
        "Hello world.",
        "Second line."
      ],
      "style": "Default",
      "position": {
        "x": 100,
        "y": 200,
        "align": "center"
      }
    },
    {
      "id": "2",
      "start": 2500,
      "end": 4000,
      "lines": [
        "Plain line.",
        {
          "text": "Styled line.",
          "tags": [
            {
              "kind": "italic",
              "start": 0,
              "end": 6
            }
          ]
        }
      ]
    },
    {
      "id": "3",
      "start": 4500,
      "end": 6000,
      "lines": [
        "Roger: I am here."
      ],
      "speaker": "Roger"
    }
  ]
}

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:00.000" end="00:00:02.000">Hello world.<br/>Second line.</p>
<p begin="00:00:02.500" end="00:00:04.000">Plain line.<br/><span tts:fontStyle="italic">Styled</span> line.</p>
<p begin="00:00:04.500" end="00:00:06.000">Roger: I am here.</p>  </body>
</tt>

In deze uitvoer gaat karaoke verloren. Al het andere komt regel voor regel overeen.

Dezelfde conversie op een rommelige invoer

Invoer

[
    { "start": 0, "end": 1000, "lines": ["First."] },
    { "start": 1000, "end": 2000, "text": "Second." },
    "not an object",
    { "start": 2000, "end": 3000, "lines": ["Third."], "class": "top" }
]

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:00.000" end="00:00:01.000">First.</p>
<p begin="00:00:01.000" end="00:00:02.000">Second.</p>
<p begin="00:00:02.000" end="00:00:03.000">Third.</p>  </body>
</tt>

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

Veelgestelde vragen

Wat gebeurt er met karaoketiming van JSON naar TTML?

De timing verdwijnt, de woorden blijven. Karaoke zit in de spans die een JSON-blok meedraagt en die markeren wanneer elke lettergreep oplicht; TTML kan geen moment binnen een regel vastleggen, dus de markeringen gaan eraf en de lettergrepen komen als gewone TTML-tekst binnen.

Hoe ziet de uitvoer eruit als JSON TTML wordt?

Als TTML: zonder bloknummers, maar elk blok is een p-element met begin en end, genest in een body (meestal met een div eromheen) en met een XML-declaratie boven het hele document. Elk JSON-blok wordt één TTML-blok, in dezelfde volgorde en met dezelfde tekst.

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

Ja, tot op de milliseconde, en fijner gaat geen van beide formaten. JSON schrijft een moment als 4126, TTML schrijft hetzelfde moment als 00:00:04.126; er wordt niets afgerond of verschoven, en een blok dat 2,9 seconden in beeld stond, staat dat nog steeds.

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

Als twee regels met een <br/> ertussen, want zo schrijft TTML een harde regelbreuk. Het verband blijft: de twee JSON-regels horen in de TTML-uitvoer nog steeds bij één ondertitel, en een speler toont ze samen.

Blijft de volgorde van JSON-blokken in de TTML-uitvoer behouden?

Ja, en ze worden onderweg op starttijd gesorteerd: vroegste eerst. Stond jouw JSON-bestand niet in volgorde, dan zet de TTML-uitvoer de blokken weer netjes achter elkaar. Dat is een verandering in de bestandsstructuur, niet in de inhoud, en ze is bewust.

Kan ik de TTML terug naar JSON omzetten?

Ja, en die richting heeft een eigen lijst: TTML naar JSON verliest formaatspecifieke inhoud. Die lijst verschilt van de lijst hierboven, omdat beide formaten andere dingen bewaren.

Blijft de tekencodering van het JSON-bestand behouden in de TTML-uitvoer?

Nee. De uitvoer is UTF-8 met Unix-regeleinden en zonder BOM, wat het JSON-bestand ook gebruikte. Een bestand in UTF-16 of in een Windows-codering met één byte wordt bij het inlezen gedecodeerd (het resultaatpaneel zegt het als dat gebeurt); wat eruit komt is altijd dezelfde UTF-8-TTML.

Gerelateerde hulpmiddelen