Convertir TTML en SSA
Ou collez le texte d'un sous-titre
Ce que cette conversion change
2 éléments perdus ou à décider
- Précision
la précision du minutage — l'horloge de la sortie est plus grossière, chaque code temporel est donc arrondi au 10 ms le plus proche
- Contenu propre au format
le contenu que le format source garde hors de ses blocs (blocs hors sous-titres, texte d'en-tête, réglages par bloc, événements commentés) — le format cible n'a nulle part où le mettre
Ce rapport de pertes vient de la matrice de capacités de ces deux formats, pas du fichier particulier que vous avez chargé. Un fichier précis peut perdre davantage s'il utilise des fonctionnalités que le format autorise mais que la matrice ne modélise pas.
Cette page convertit un fichier TTML en SSA, la version historique de SubStation Alpha. La sortie utilise ScriptType: v4.00, une table [V4 Styles] et des Dialogue avec un champ Marked. Les paragraphes TTML deviennent des événements, et les heures sont arrondies au centième.
Les mises en forme en ligne sont traduites : un span italique devient {\i1}…{\i0}, une couleur devient une balise de couleur SSA. Les tables <style> et <layout> et le prologue XML ne sont pas recopiés ; le fichier produit ne définit qu’un style Default, et les références à des styles nommés n’ont plus de cible.
Le TTML peut exprimer des millisecondes ou des fractions d’image, alors que le SSA n’écrit que des centièmes : c’est la perte de précision signalée. Les timecodes en images sont lus avec ttp:frameRate, et un paragraphe sans end reçoit 2 000 ms. La conversion reste locale.
Exemples
Un fichier TTML typique, converti en SSA
Entrée
<?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>
Sortie
[Script Info]
ScriptType: v4.00
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,1,2,2,2,10,10,10,0,1
[Events]
Format: Marked, 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.
L’italique en ligne devient une balise de style SSA et le paragraphe de deux lignes utilise \N ; le style nommé et la région sont abandonnés.
La même conversion sur une entrée abîmée
Entrée
<?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>
Sortie
[Script Info]
ScriptType: v4.00
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,1,2,2,2,10,10,10,0,1
[Events]
Format: Marked, 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.
Les offsets, durées et images sont convertis en centièmes ; le paragraphe sans end reçoit 2 000 ms.
Questions fréquentes
Comment les timecodes TTML arrivent-ils dans les Dialogue SSA ?
Ils sont convertis en heures, minutes, secondes et centièmes, avec un seul chiffre pour l’heure : 0:00:01.00. Une horloge, un offset ou un timecode en images donnent le même type de valeur. La fréquence du document sert uniquement à lire les timecodes qui l’exigent.
Pourquoi le SSA perd-il de la précision par rapport au TTML ?
Parce que le SSA arrondit au centième de seconde, alors que le TTML peut décrire des millisecondes entières ou des fractions d’image. Un temps de 1 234 ms devient 0:00:01.23, soit 1 230 ms. L’écart est faible mais réel, et il peut s’accumuler sur une longue conversion.
Que deviennent les tables de style et de région du TTML ?
Elles ne sont pas écrites. Le SSA produit définit un seul style Default et ne reprend ni les identifiants de <style> ni les zones de <layout>. Une mise en forme déclarée dans une table nommée est donc perdue, même si le texte qui y faisait référence reste intact.
Le prologue XML et les espaces de noms sont-ils conservés ?
Non, le SSA n’est pas un document XML. La déclaration <?xml?>, les attributs xmlns et le profil TTML disparaissent au profit de l’en-tête [Script Info] et des sections du format SSA. C’est l’une des pertes de contenu propre au format signalées par le rapport.
Comment le SSA achève-t-il un paragraphe TTML sans attribut end ?
Il reçoit 2 000 ms avant d’être écrit comme Dialogue. Le TTML accepte un paragraphe ouvert, mais le SSA exige deux heures par événement : la fin est donc calculée, puis arrondie au centième, et le rapport de pertes le précise.
Le SSA produit est-il bien en version 4.00 ?
Oui. L’en-tête contient ScriptType: v4.00, la table s’appelle [V4 Styles] et les événements portent un champ Marked. C’est la différence avec la sortie ASS, qui utilise v4.00+, la table [V4+ Styles] et un champ Layer.