Converter TTML para ASS
Ou cole o texto da legenda
O que esta conversão altera
2 coisas são descartadas ou precisam de uma decisão
- Precisão
a precisão dos tempos — o relógio da saída é mais grosseiro, então cada marca de tempo é arredondada para o 10 ms mais próximo
- 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 ASS. Arraste um arquivo ou cole o texto e receba a versão ASS de volta. A conversão roda inteiramente no navegador, então nada é enviado e não há cadastro.
O TTML mede em milissegundos; o ASS, em centésimos de segundo. Cada tempo é arredondado para os 10 ms mais próximos, então 4,126 s sai como 4,13 s, sem nenhum cue andar mais de 5 ms. A ênfase que está dentro do parágrafo sobrevive como código de override do ASS: um span em itálico vira {\i1}…{\i0} e uma cor vira {\c&H000000FF&}…{\c}, no formato BGR que o ASS usa.
O que fica para trás é o cabeçalho do documento: a declaração XML, os namespaces, a tabela <styling> com fontes e contornos, a tabela <layout> com as regiões, os metadados e os atributos style e region que cada <p> aponta. O ASS guarda cues, não um documento, então nada disso tem onde cair. O processamento é local e o lote baixa em ZIP.
Exemplos
Um arquivo TTML típico, convertido para ASS
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
[Script Info]
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,0,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:03.50,Default,,0,0,0,,Hello {\i1}there{\i0}.
Dialogue: 0,0:00:03.50,0:00:06.00,Default,,0,0,0,,How are you?\NFine, thanks.
Perdido nesta saída: precisão e 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 & Jerry.</p>
</div>
</body>
</tt>
Saída
[Script Info]
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,0,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.50,0:00:03.50,Default,,0,0,0,,Loaded from an offset and a duration.
Dialogue: 0,0:00:04.00,0:00:06.50,Default,,0,0,0,,A coarser clock spelling.
Dialogue: 0,0:00:07.00,0:00:08.48,Default,,0,0,0,,Frames, at 25fps.
Dialogue: 0,0:00:09.00,0:00:11.00,Default,,0,0,0,,{\c&H000000FF&}Half-open{\c} and Tom & Jerry.
É 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
Por que os tempos mudam de TTML para ASS?
Porque o ASS grava 0:00:04.13 e o TTML grava 00:00:04.126: centésimos contra milésimos. Todo tempo é arredondado para os 10 ms mais próximos, e nenhum cue se desloca mais de 5 ms do original.
O que acontece com o itálico e a cor escritos dentro de um parágrafo TTML?
Eles viram códigos de override do ASS. Um span em itálico sai como {\i1}texto{\i0}, e uma cor #FF0000 sai como {\c&H000000FF&}texto{\c}, porque o ASS guarda canais em ordem BGR e fecha o trecho com o código sem parâmetro.
As tabelas <styling> e <layout> do TTML chegam ao ASS?
Não. O estilo nomeado s1 e a região bottom existem só no <head> do documento; o ASS não tem onde recebê-los, então cada Dialogue usa o estilo Default e o posicionamento padrão do player.
Como um cue TTML de duas linhas aparece no ASS?
Como duas linhas na mesma Dialogue, separadas por \N. O <br/> do TTML vira a quebra dura do ASS e o evento mantém um único Start e um único End.
O ASS gerado preserva a ordem dos cues do TTML?
Preserva, com uma ordenação pelo início: se o arquivo listava os cue fora de sequência, a saída os recoloca em ordem crescente. A mudança é de estrutura, não de conteúdo, e é intencional.