Convertir TTML en JSON
Ou collez le texte d'un sous-titre
Ce que cette conversion change
1 élément perdu ou à décider
- 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 JSON structuré. La sortie contient une version, puis un tableau cues dont chaque entrée porte start, end et lines. Les temps sont des millisecondes entières, calculées depuis les horloges, les offsets et les timecodes en images du TTML.
Le tableau lines mélange deux formes selon le contenu : une ligne sans mise en forme est une simple chaîne, tandis qu’une ligne avec un <span> devient un objet qui porte son texte et la liste de ses balises, avec leur type, leurs positions et leur valeur. L’italique et la couleur sont donc conservés sous forme de données, pas de balisage.
Les tables <style> et <layout>, le prologue XML et les attributs de profil ne sont pas recopiés : c’est la perte de contenu propre au format signalée par le rapport. Un paragraphe sans end reçoit 2 000 ms. Le JSON produit reste lisible par n’importe quel langage et ne quitte pas votre machine.
Exemples
Un fichier TTML typique, converti en JSON
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
{
"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."
]
}
]
}
La ligne italique devient un objet avec une balise italic, tandis que le paragraphe sans mise en forme reste une chaîne dans lines.
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
{
"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 & Jerry.",
"tags": [
{
"kind": "color",
"start": 0,
"end": 9,
"value": "#FF0000"
}
]
}
]
}
]
}
Les timecodes en images sont convertis grâce à ttp:frameRate et la couleur en ligne devient une balise color avec sa valeur.
Questions fréquentes
Pourquoi certaines lignes JSON sont-elles des chaînes et d’autres des objets ?
Une ligne sans mise en forme n’a rien à décrire : elle est écrite comme une chaîne. Dès qu’un <span> porte un italique, une couleur ou un soulignement, la ligne devient un objet avec text et tags, parce qu’il faut conserver les positions de début et de fin de chaque mise en forme.
Comment les balises TTML sont-elles représentées dans le JSON ?
Chaque balise est un objet avec kind, start, end et éventuellement value. Un tts:fontStyle="italic" sur les caractères 6 à 11 donne kind: "italic", start: 6, end: 11. Une couleur donne kind: "color" et value: "#FF0000". Les positions sont relatives au texte de la ligne.
Les styles nommés et les régions sont-ils conservés dans le JSON ?
Non. Les définitions de <styling> et <layout> ne sont pas recopiées, car le schéma JSON de sortie décrit des blocs et des balises en ligne, pas une feuille de styles. Une référence de style sur un paragraphe est donc perdue, seules les balises réellement présentes dans le texte subsistent.
Les temps du JSON sont-ils en millisecondes ?
Oui, start et end sont des entiers en millisecondes. Une horloge 00:00:04.000 donne 4000, un offset 1.5s donne 1500, et un timecode 00:00:08:12 à 25 fps donne 8480. Le JSON ne conserve donc pas la syntaxe temporelle d’origine, seulement l’instant.
Comment le JSON complète-t-il un paragraphe sans attribut end ?
Il reçoit 2 000 ms de durée, comme dans toutes les conversions TTML de ce site. Le TTML accepte un paragraphe ouvert, mais le JSON produit doit avoir un end pour chaque bloc ; cette valeur est ajoutée et signalée dans le rapport de pertes.
Le JSON produit peut-il être relu par un autre outil ?
Oui, sa structure est stable et documentée : version 1, cues, start, end, lines, puis text et tags pour les lignes mises en forme. Aucune donnée ne dépend d’un navigateur particulier, et les temps sont des entiers faciles à comparer ou à recalculer.