Ir para o conteúdo principal
SubtitleMatrix

Converter TTML para JSON

Ou cole o texto da legenda

O que esta conversão altera

1 coisa é descartada ou precisa de uma decisão

  • Conteúdo específico do formato

    conteúdo que o formato de origem guarda fora de seus blocos (blocos que não são cue, texto de cabeçalho, configurações por bloco, eventos comentados) — o formato de destino não tem lugar para ele

Esta lista vem da matriz de capacidades destes dois formatos, não do arquivo específico que você carregou. Um arquivo específico pode perder mais se usar recursos que o formato permite mas a matriz não modela.

Esta página converte TTML em JSON. Arraste um arquivo ou cole o texto e receba a versão JSON de volta. A conversão roda inteiramente no navegador, então nada é enviado e não há cadastro.

O JSON gerado tem version e um array cues, cada um com start e end em milissegundos inteiros. Um cue de duas linhas vira duas entradas no array lines. A ênfase dentro do parágrafo é preservada com posição: um span em itálico gera uma entrada com kind italic e os índices start e end dentro do texto, e uma cor carrega também o valor hexadecimal.

O objeto styles existe, mas sai vazio: nada do <head> do TTML é traduzido para ele. Declaração XML, namespaces, tabelas <styling> e <layout>, metadados e referências style e region se perdem. O processamento é local e o lote baixa em um ZIP.

Exemplos

Um arquivo TTML típico, convertido para JSON

Entrada

<?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>

Saída

{
  "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."
      ]
    }
  ]
}

Perdido nesta saída: conteúdo específico do formato. O resto corresponde linha a linha.

A mesma conversão em uma entrada problemática

Entrada

<?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>

Saída

{
  "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"
            }
          ]
        }
      ]
    }
  ]
}

É o tipo de dano que arquivos reais trazem — fins de linha misturados, espaços soltos, campos vazios. Compare com o exemplo organizado acima para ver o que o leitor tolera.

Perguntas frequentes

Como o JSON descreve o itálico embutido no TTML?

Como uma tag dentro da linha: a entrada tem kind italic e os índices start e end que apontam para o trecho no texto. Uma cor acrescenta o campo value com o hexadecimal, como #FF0000.

O objeto styles do JSON recebe os estilos do TTML?

Não: ele existe e sai vazio. Os estilos nomeados ficam em <styling>, no <head>, e nenhum deles é traduzido para styles; só a formatação escrita dentro do parágrafo chega, via tags da linha.

Os tempos do JSON são exatos em relação ao TTML?

São, ao milissegundo. O TTML escreve 00:00:04.126 e o JSON grava 4126, com inteiros; nada é arredondado nem deslocado, e a duração de cada cue se conserva.

O que acontece com as regiões e com os metadados do cabeçalho TTML?

Ficam de fora. O JSON não tem campo para a tabela <layout> nem para <metadata>, e os atributos region e style que um <p> carregava não são copiados para o cue.

O JSON resultante serve para alimentar um script ou um banco?

Serve: é JSON válido, com inteiros em milissegundos, arrays de linhas e tags posicionadas. Nenhum byte sai do navegador, então legendas confidenciais chegam ao seu código sem passar por servidor.

Ferramentas relacionadas