Saltar al contenido principal
SubtitleMatrix

Convertir ASS a TTML

Conversión de formatosAdvanced SubStation Alpha (ASS)
O pega el texto de los subtítulos

Qué cambia esta conversión

2 cosas se descartan o requieren una decisión

  • Karaoke

    la sincronización karaoke (resaltado por sílaba)

  • 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 ASS a TTML. Suelta un archivo o pega el texto y recuperas la versión TTML. La conversión se ejecuta por completo en tu navegador, así que no se sube nada y no hace falta cuenta.

Estos dos formatos no guardan las mismas cosas, y la diferencia no es cosmética: el karaoke y el contenido propio del formato no tienen dónde ir en TTML. El listado que aparece arriba sale de lo que cada formato puede expresar, no de tu archivo, así que la respuesta es la misma antes de cargar nada.

Un archivo está bien, y una temporada entera también: la cola los procesa en orden y los resultados se descargan juntos en un único ZIP.

Ejemplos

Un archivo ASS típico convertido a TTML

Entrada

[Script Info]
Title: Example
ScriptType: v4.00+
WrapStyle: 0

[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
Style: Title,Arial,36,&H0000FFFF,&H000000FF,&H00000000,&H00000000,-1,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:04.00,Default,,0,0,0,,Hello there.
Dialogue: 0,0:00:05.00,0:00:08.50,Default,,0,0,0,,{\i1}Italic{\i0} and {\b1}bold{\b0} text.
Dialogue: 0,0:00:09.00,0:00:12.00,Title,,0,0,0,,{\pos(320,240)}Positioned
Dialogue: 0,0:00:13.00,0:00:16.00,Default,,0,0,0,,{\k50}ka{\k30}ra{\k20}o{\k10}ke
Dialogue: 0,0:00:17.00,0:00:20.00,Default,,0,0,0,,Line one\NLine two
Dialogue: 1,0:00:21.00,0:00:24.00,Default,,0,0,0,,{\an7}Top left

Resultado

<?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:01.000" end="00:00:04.000">Hello there.</p>
<p begin="00:00:05.000" end="00:00:08.500"><span tts:fontStyle="italic">Italic</span> and <span tts:fontWeight="bold">bold</span> text.</p>
<p begin="00:00:09.000" end="00:00:12.000">Positioned</p>
<p begin="00:00:13.000" end="00:00:16.000">karaoke</p>
<p begin="00:00:17.000" end="00:00:20.000">Line one<br/>Line two</p>
<p begin="00:00:21.000" end="00:00:24.000">Top left</p>  </body>
</tt>

En esta salida se pierden: karaoke y contenido propio del formato. Todo lo demás coincide línea por línea.

La misma conversión con una entrada difícil

Entrada

[Script Info]
; 一份真实的脏文件:BOM + CRLF + 认不出的覆写码 + Comment + 坏时间码
Title: Dirty sample
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,1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Fonts]
fontname: Arial
!!!!!!!!!!!!!!!!!!!!!!!!!!!!

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Comment: 0,0:00:00.00,0:00:01.00,Default,,0,0,0,,这是一条注释,不该变成字幕
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello, world
Dialogue: 0,0:00:05.00,0:00:08.00,Default,,0,0,0,,{\fad(300,300)}Unmodelled override
Dialogue: 0,0:00:09.00,0:00:12.00,Default,,0,0,0,,{\an7\pos(320,240)}Both, wrong order
Dialogue: 0,0:00:13.00,0:00:16.5,Default,,0,0,0,,One decimal centisecond
Dialogue: 0,0:00:17.00,0:00:20.00,Default,,0,0,0,,Soft\nbreak
Dialogue: 0,0:00:xx.00,0:00:24.00,Default,,0,0,0,,Broken timecode

Resultado

<?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:01.000" end="00:00:04.000">Hello, world</p>
<p begin="00:00:05.000" end="00:00:08.000">{\fad(300,300)}Unmodelled override</p>
<p begin="00:00:09.000" end="00:00:12.000">Both, wrong order</p>
<p begin="00:00:13.000" end="00:00:16.500">One decimal centisecond</p>
<p begin="00:00:17.000" end="00:00:20.000">Soft<br/>break</p>  </body>
</tt>

Este es el tipo de daño 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é ocurre con el karaoke al convertir ASS a TTML?

El tiempo se va; las palabras quedan. El karaoke vive en los códigos \k, \kf y \ko que lleva un evento ASS, que marcan cuándo se enciende cada sílaba, y TTML no tiene forma de registrar un instante dentro de una línea, así que las marcas desaparecen y las sílabas llegan como texto TTML normal.

¿Dónde quedan el bloque [Script Info] y el resto del script en el TTML?

Solo las líneas Dialogue se convierten en subtítulos. El bloque [Script Info] (con el título incluido, porque TTML no tiene dónde ponerlo), la tabla de estilos, las líneas Comment y lo que esté incrustado en [Fonts] o [Graphics] se descartan por completo. En un ASS cuyo estilo se escribió a mano, esta es la pérdida que más se nota.

¿Cómo es el TTML que sale de un archivo ASS?

Como TTML: sin números de subtítulo, cada subtítulo es un elemento <p> con atributos begin y end, anidado en un <body> (y normalmente en un <div>), con una declaración XML sobre el documento entero. Cada subtítulo ASS se convierte en un subtítulo TTML, en el mismo orden y con el mismo texto.

¿Los tiempos de ASS son exactos en el TTML?

Sí, al milisegundo, que es la precisión máxima de ambos formatos. ASS escribe un instante como 0:00:04.13 y TTML escribe ese mismo instante como 00:00:04.126; nada se redondea ni se desplaza entre los dos, y un subtítulo que estaba en pantalla 2,9 segundos sigue estándolo.

¿Cómo sale en TTML un subtítulo ASS de dos líneas?

Como dos líneas con un <br/> entre ellas, que es como TTML escribe un salto de línea duro. El emparejamiento sobrevive: las dos líneas ASS siguen perteneciendo a un mismo subtítulo en la salida TTML y un reproductor las muestra juntas.

¿Se conserva el orden de los subtítulos ASS en el TTML?

Sí, y de paso se ordenan por tiempo de inicio: primero el más temprano, que es lo que espera cada formato de este sitio y cómo los leen los reproductores. Si tu ASS listaba los subtítulos fuera de orden, la salida TTML los pone en orden; eso cambia la estructura del archivo, no su contenido, y es deliberado.

¿Puedo convertir el TTML de vuelta a ASS?

Sí, y tiene su propia lista: convertir TTML a ASS pierde precisión y contenido propio del formato. Esa lista es distinta de la de arriba porque los dos formatos guardan cosas distintas.

¿El TTML conserva la codificación del archivo ASS?

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

Herramientas relacionadas