Aller au contenu principal
SubtitleMatrix

Convertir TTML en ASS

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 ASS. Le TTML est un XML de sous-titrage : ses paragraphes <p> portent begin et end, ses styles nommés vivent dans <styling> et ses positions dans <layout>. L’ASS, lui, décrit des Dialogue avec un style nommé et des balises de substitution placées dans le texte.

Les mises en forme portées directement par un <span> sont traduites : tts:fontStyle="italic" devient {\i1}…{\i0}, et tts:color devient une balise de couleur ASS. En revanche, les tables <style> et <region> ainsi que le prologue XML ne sont pas recopiés : le fichier produit ne contient qu’un style Default et les balises réellement présentes dans le texte.

Les quatre écritures de temps du TTML sont lues : horloge, offset comme 1.5s, numéro d’image comme 00:00:07:12 et décalage en images comme 36f. Les deux dernières exigent ttp:frameRate, et ttp:frameRateMultiplier permet d’exprimer 29,97 par 30000 1001. L’ASS n’écrit que des centièmes : un temps au millième est arrondi, ce qui constitue la perte de précision signalée.

Exemples

Un fichier TTML typique, converti en ASS

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, 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.

L’italique en ligne devient {\i1} et le paragraphe de deux lignes devient un Dialogue avec \N ; le style nommé et la région ne sont pas repris.

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 &amp; Jerry.</p>
    </div>
  </body>
</tt>

Sortie

[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 &amp; Jerry.

Les offsets, durées et timecodes en images sont lus grâce à ttp:frameRate ; le paragraphe sans end reçoit 2 000 ms.

Questions fréquentes

Comment les quatre écritures de temps TTML arrivent-elles dans l’ASS ?

Elles sont toutes converties en heures, minutes, secondes et centièmes. Une horloge 00:00:01.000 reste identique, un offset 1.5s devient 0:00:01.50, et un timecode 00:00:07:12 à 25 fps devient 0:00:07.48. La précision finale est celle de l’ASS.

Que deviennent les tableaux styling et layout du TTML ?

Ils ne sont pas recopiés : le fichier ASS produit définit un seul style Default. Une couleur ou une graisse déclarée dans <style> et référencée par un <p> est donc perdue, alors qu’une mise en forme écrite directement dans un <span> survit sous forme de balise de style.

Pourquoi la précision TTML ne survit-elle pas entièrement dans l’ASS ?

Parce que le TTML peut exprimer des millisecondes, voire des fractions d’image, et que l’ASS n’écrit que des centièmes. Le temps 00:00:08.480 devient 0:00:08.48, ce qui reste exact ici, mais une valeur comme 00:00:08.475 serait arrondie et ne serait plus fidèle à la source.

Une couleur tts:color survit-elle dans l’ASS ?

Oui si elle est portée par un <span> en ligne : elle devient une balise {\c&HBBGGRR&} autour du texte concerné. Non si elle vient d’un style nommé ou d’une région : ces définitions ne sont pas transportées, et le Dialogue se rabat sur le style Default.

Que devient un paragraphe TTML sans attribut end ?

Il reçoit une durée de 2 000 ms. Le TTML autorise un paragraphe ouvert, mais l’ASS exige deux heures par Dialogue : la fin est donc fabriquée, et le rapport de pertes la présente comme telle plutôt que comme une valeur lue dans le fichier.

Les entités XML comme &amp; sont-elles décodées dans l’ASS ?

Elles restent telles qu’elles sont écrites dans le texte produit. Le document est lu comme du XML, mais le contenu textuel n’est pas réécrit en entités ou en caractères différemment : un &amp; du source se retrouve donc littéralement dans le Dialogue.

Outils associés