Convertir SSA 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 SSA en JSON structuré : un objet racine, une table de styles et un tableau de blocs. Le texte, les temps et la table `[V4 Styles]` sont conservés ; les constructions que le modèle JSON ne connaît pas sont les seules à partir.
Le JSON garde le titre, chaque colonne de style — y compris celles que le site ne modélise pas — et les blocs avec leur début, leur fin, leurs lignes et leur style. Ce qui n’a pas de clé correspondante : le reste de `[Script Info]` (`PlayResX`, `WrapStyle`, `Collisions`), les événements autres que `Dialogue:`, et le contenu binaire de `[Fonts]` et `[Graphics]`. La liste affichée en haut de page vient de ce que chaque format sait exprimer, pas de votre fichier : elle ne change donc pas selon ce que vous déposez.
Le traitement se fait dans le navigateur, sans envoi de fichier ni inscription. Plusieurs fichiers peuvent être déposés d’un coup : la file les traite dans l’ordre et les résultats repartent ensemble dans une archive ZIP.
Exemples
Un fichier SSA courant converti en JSON
Entrée
[Script Info]
Title: Example SSA
ScriptType: v4.00
Collisions: Normal
[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: Marked=0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello there.
Dialogue: Marked=0,0:00:05.00,0:00:08.00,Default,,0,0,0,,{\i1}Italic{\i0} line.
Dialogue: Marked=0,0:00:09.00,0:00:12.00,Default,,0,0,0,,Two\Nlines
Sortie
{
"version": 1,
"title": "Example SSA",
"styles": {
"Default": {
"name": "Default",
"Name": "Default",
"Fontname": "Arial",
"Fontsize": "20",
"PrimaryColour": "&H00FFFFFF",
"SecondaryColour": "&H000000FF",
"TertiaryColour": "&H00000000",
"BackColour": "&H00000000",
"Bold": "0",
"Italic": "0",
"BorderStyle": "1",
"Outline": "2",
"Shadow": "2",
"Alignment": "2",
"MarginL": "10",
"MarginR": "10",
"MarginV": "10",
"AlphaLevel": "0",
"Encoding": "1",
"fontFamily": "Arial",
"fontSize": 20,
"primaryColor": "#ffffff",
"bold": false,
"italic": false
}
},
"cues": [
{
"start": 1000,
"end": 4000,
"lines": [
"Hello there."
],
"style": "Default"
},
{
"start": 5000,
"end": 8000,
"lines": [
{
"text": "Italic line.",
"tags": [
{
"kind": "italic",
"start": 0,
"end": 6
}
]
}
],
"style": "Default"
},
{
"start": 9000,
"end": 12000,
"lines": [
"Two",
"lines"
],
"style": "Default"
}
]
}
Perdu dans cette sortie : le contenu propre au format. Le titre et la table de styles, eux, sont bien présents dans l’objet produit.
La même conversion sur une entrée abîmée
Entrée
[Script Info]
Title: Dirty SSA
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
Comment: Marked=0,0:00:00.00,0:00:01.00,Default,,0,0,0,,not a subtitle
Dialogue: Marked=0,0:00:01.00,0:00:04.00,Default,,0,0,0,,{\b1}Bold{\b0} and {\u1}underlined{\u0}.
Dialogue: Marked=0,0:00:05.00,0:00:08.00,Default,,0,0,0,,A soft\nbreak and a {\p1}mystery{\p0} code.Sortie
{
"version": 1,
"title": "Dirty SSA",
"styles": {
"Default": {
"name": "Default",
"Name": "Default",
"Fontname": "Arial",
"Fontsize": "20",
"PrimaryColour": "&H00FFFFFF",
"SecondaryColour": "&H000000FF",
"TertiaryColour": "&H00000000",
"BackColour": "&H00000000",
"Bold": "0",
"Italic": "0",
"BorderStyle": "1",
"Outline": "2",
"Shadow": "2",
"Alignment": "2",
"MarginL": "10",
"MarginR": "10",
"MarginV": "10",
"AlphaLevel": "0",
"Encoding": "1",
"fontFamily": "Arial",
"fontSize": 20,
"primaryColor": "#ffffff",
"bold": false,
"italic": false
}
},
"cues": [
{
"start": 1000,
"end": 4000,
"lines": [
{
"text": "Bold and underlined.",
"tags": [
{
"kind": "bold",
"start": 0,
"end": 4
},
{
"kind": "underline",
"start": 9,
"end": 19
}
]
}
],
"style": "Default"
},
{
"start": 5000,
"end": 8000,
"lines": [
"A soft",
"break and a {\\p1}mystery{\\p0} code."
],
"style": "Default"
}
]
}
BOM, retours chariot et champs absents : le JSON reste analysable, les blocs dégradés sont signalés et les temps impossibles à lire sont réparés plutôt que perdus en silence.
Questions fréquentes
Que deviennent `[Script Info]`, les lignes `Comment:` et les polices intégrées dans le JSON ?
Plus de choses survivent qu’on ne l’imagine : le titre est repris et la table `[V4 Styles]` est conservée colonne par colonne, avec la police, la taille, la couleur et les indicateurs gras/italique analysés. Le JSON n’a pas de place pour le reste de `[Script Info]` (`PlayResX`, `WrapStyle`, `Collisions`), pour les événements autres que `Dialogue:` (`Comment:`, `Picture:`, `Sound:`) ni pour `[Fonts]` et `[Graphics]`.
À quoi ressemble la sortie quand un SSA devient du JSON ?
À un objet JSON : un tableau `cues` dont chaque entrée porte `start`, `end`, `lines` et le cas échéant `style`. Chaque bloc SSA devient une entrée, dans le même ordre, avec le même texte ; une ligne accentuée devient un objet avec son tableau `tags`.
Les horodatages SSA sont-ils exacts dans le fichier JSON ?
Oui. Le JSON exprime les instants en millisecondes entières : `0:00:04.13` dans le SSA devient `4130` dans le JSON, sans arrondi ni décalage. Un bloc de 2,9 s garde exactement la même durée, et l’unité reste la milliseconde d’un bout à l’autre.
Comment un dialogue SSA sur deux lignes sort-il en JSON ?
Sous forme de deux entrées dans le tableau `lines` du même bloc : `["Two", "lines"]`. Le lien n’est pas perdu, puisqu’il tient dans un seul objet ; un lecteur qui affiche ce bloc montre les deux lignes ensemble.
Les blocs SSA conservent-ils leur ordre dans la sortie JSON ?
Oui, et ils sont triés par heure de début au passage, du plus tôt au plus tard. Si votre fichier SSA listait ses blocs dans le désordre, la sortie les remet dans l’ordre : c’est un changement de structure du fichier, pas de contenu, et il est volontaire.
Le JSON produit peut-il redevenir un SSA sans perte ?
Non : le retour JSON vers SSA coûte la précision, parce que SSA écrit les temps en centièmes. Les valeurs en millisecondes du JSON sont arrondies au centième le plus proche, avec au plus 5 ms d’écart. Les blocs propres au SSA déjà disparus à l’aller ne peuvent pas non plus être reconstruits.