Saltar al contenido principal
SubtitleMatrix

Convertir TTML a JSON

O pega el texto de los subtítulos

Qué cambia esta conversión

1 cosa se descarta o requiere una decisión

  • Contenido específico del formato

    contenido que el formato de origen guarda fuera de sus bloques (bloques que no son cue, texto de cabecera, ajustes por bloque, eventos comentados): el formato de destino no tiene sitio para él

Esta lista proviene de la matriz de capacidades de estos dos formatos, no del archivo concreto que has cargado. Un archivo específico puede perder más si usa características que el formato permite pero que la matriz no modela.

Esta página convierte TTML en JSON. Arrastra un archivo —o pega el texto— y obtienes la versión JSON. La conversión se ejecuta entera en el navegador, de modo que nada se sube y no hace falta ninguna cuenta.

Los dos formatos no guardan lo mismo, y la diferencia no es cosmética: el contenido propio del formato no tiene dónde ir en JSON. La lista de arriba nace de lo que cada formato puede expresar, no de tu archivo, así que es idéntica antes de cargar nada.

Un archivo va bien, y una temporada entera también: la cola los recorre en orden y los resultados bajan juntos dentro de un solo ZIP.

Ejemplos

Un archivo TTML típico, convertido a 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>

Resultado

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

Se pierde el contenido propio del formato. El resto coincide línea por línea.

La misma conversión con una entrada difícil

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>

Resultado

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

Estos son los daños que traen los archivos reales: finales de línea mezclados, espacios sueltos, campos vacíos. Compáralo con el ejemplo limpio de arriba para ver qué perdona el analizador.

Preguntas frecuentes

¿Qué pasa con el prólogo TTML y sus tablas <styling> y <layout> al pasar a JSON?

Se descartan, con una excepción precisa. Un archivo TTML guarda su aspecto y su disposición en la cabecera, no en las palabras: la declaración XML y sus espacios de nombres, la tabla `<styling>` de estilos con nombre (`tts:color`, `tts:fontWeight`), la tabla `<layout>` de regiones con nombre (`tts:origin`, `tts:extent`), cualquier `<metadata>` y los atributos `style` / `region` con los que un `<p>` apunta a ellas. La salida JSON sí tiene un objeto `styles` y unas `tags` por línea, y el estilo escrito dentro de un párrafo (`<span tts:fontStyle="italic">`) forma parte de la línea, así que sí llega, en el arreglo de `tags`. Nada de la cabecera se traduce al objeto `styles`, así que este sale vacío.

¿Qué aspecto tiene la salida cuando TTML se convierte en JSON?

Como JSON: un arreglo de objetos de bloque, cada uno con su `id`, su `start` y su `end`. Cada bloque TTML se convierte en un bloque JSON, en el mismo orden y con el mismo texto.

¿Son exactos los tiempos TTML en el archivo JSON?

Sí, al milisegundo, que es lo más fino que llega cualquiera de los dos formatos. TTML escribe un instante como `00:00:04.126` y JSON escribe el mismo instante como `4126`; nada se redondea ni se desplaza entre los dos, y un bloque que estaba en pantalla 2,9 segundos lo sigue estando.

¿Cómo sale en JSON un bloque TTML de dos líneas?

Como dos entradas en el arreglo `lines` del bloque. La pareja se mantiene: las dos líneas TTML siguen perteneciendo a un mismo subtítulo en la salida JSON, y el reproductor las muestra juntas.

¿Conservan los bloques TTML su orden en la salida JSON?

Sí, y de paso se ordenan por hora de inicio: primero los más tempranos, que es lo que esperan todos los formatos de este sitio y cómo los leen los reproductores. Si tu archivo TTML traía los bloques desordenados, la salida JSON los devuelve a su orden; eso cambia la estructura del archivo, no su contenido, y es deliberado.

¿Puedo convertir el JSON de vuelta a TTML?

Sí, y esa dirección tiene su propia lista: convertir JSON en TTML pierde el karaoke. La lista es distinta de la de arriba porque los dos formatos guardan cosas distintas.

¿Respeta la salida JSON la codificación del archivo TTML?

No: la salida es UTF-8, con finales de línea Unix y sin marca de orden de bytes, sea cual sea la que usara el archivo TTML. Un archivo que llega en UTF-16 o en una codificación Windows de un solo byte se decodifica a la entrada (el panel de resultados lo indica cuando ocurre); lo que sale es siempre el mismo JSON en UTF-8.

Herramientas relacionadas