Ir para o conteúdo principal
SubtitleMatrix

Converter JSON para ASS

Ou cole o texto da legenda

O que esta conversão altera

1 coisa é descartada ou precisa 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

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 JSON em ASS. Arraste um arquivo — ou cole o texto — e receba a versão ASS de volta. A conversão roda inteiramente no seu navegador, então nada é enviado e nenhuma conta é necessária.

Estes dois formatos não guardam as mesmas coisas, e a diferença não é cosmética: precisão não tem para onde ir no ASS. A lista acima vem do que cada um dos formatos consegue expressar, não do seu arquivo, então a resposta é a mesma antes de você carregar qualquer coisa.

Um arquivo está bom, e uma temporada inteira também: a fila processa na ordem e os resultados descem juntos num único ZIP.

Exemplos

Um arquivo JSON típico, convertido para ASS

Entrada

{
  "version": 1,
  "title": "Fixture: typical",
  "fps": 25,
  "styles": {
    "Default": {
      "name": "Default",
      "fontFamily": "Arial",
      "fontSize": 20,
      "primaryColor": "#FFFFFF",
      "bold": false,
      "italic": false
    }
  },
  "generator": "subtitlematrix fixtures",
  "cues": [
    {
      "id": "1",
      "start": 0,
      "end": 2000,
      "lines": [
        "Hello world.",
        "Second line."
      ],
      "style": "Default",
      "position": {
        "x": 100,
        "y": 200,
        "align": "center"
      }
    },
    {
      "id": "2",
      "start": 2500,
      "end": 4000,
      "lines": [
        "Plain line.",
        {
          "text": "Styled line.",
          "tags": [
            {
              "kind": "italic",
              "start": 0,
              "end": 6
            }
          ]
        }
      ]
    },
    {
      "id": "3",
      "start": 4500,
      "end": 6000,
      "lines": [
        "Roger: I am here."
      ],
      "speaker": "Roger"
    }
  ]
}

Saída

[Script Info]
Title: Fixture: typical
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,,,,0,0,,,,,,,,,,,,,,

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:02.00,Default,,0,0,0,,{\pos(100,200)}Hello world.\NSecond line.
Dialogue: 0,0:00:02.50,0:00:04.00,Default,,0,0,0,,Plain line.\N{\i1}Styled{\i0} line.
Dialogue: 0,0:00:04.50,0:00:06.00,Default,,0,0,0,,Roger: I am here.

Perdido nesta saída: precisão. Todo o resto corresponde linha a linha.

A mesma conversão sobre uma entrada problemática

Entrada

[
    { "start": 0, "end": 1000, "lines": ["First."] },
    { "start": 1000, "end": 2000, "text": "Second." },
    "not an object",
    { "start": 2000, "end": 3000, "lines": ["Third."], "class": "top" }
]

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:00.00,0:00:01.00,Default,,0,0,0,,First.
Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,Second.
Dialogue: 0,0:00:02.00,0:00:03.00,Default,,0,0,0,,Third.

É o tipo de dano que os arquivos reais têm: fim de linha misturado, espaço sobrando, campos vazios. Compare com o exemplo organizado acima para ver o que o analisador perdoa.

Perguntas frequentes

Por que os tempos se movem de JSON para ASS?

O ASS guarda o tempo como 0:00:04.13, enquanto o JSON guarda 4126: centésimo de segundo contra milésimo, então cada timecode é arredondado para os 10 ms mais próximos. Nada é esticado nem reordenado e nenhum bloco se move mais de 5 ms, mas se você vai alinhar estas legendas com outro arquivo, esse é o único ponto em que a conversão deixa de ser exata.

Como fica a saída quando JSON vira ASS?

Fica com a estrutura do ASS: sem números de bloco, cada legenda é uma linha Dialogue na seção Events, com um campo de camada onde o SRT guarda o número. Cada bloco JSON vira um Dialogue, na mesma ordem, com o mesmo texto.

As duas linhas de um bloco JSON viram o quê no ASS?

Viram duas linhas separadas por um \N, que é como o ASS escreve uma quebra de linha rígida. O vínculo se mantém: as duas linhas do JSON continuam pertencendo a uma única legenda no ASS, e o player as mostra juntas.

A ordem dos blocos JSON se mantém no ASS?

Se mantém, e eles são ordenados pelo início no caminho, do mais cedo para o mais tarde, que é como todo formato aqui espera recebê-los e como os players leem. Se o seu JSON listava os blocos fora de ordem, o ASS os devolve em ordem; isso muda a estrutura do arquivo, não o conteúdo, e é feito de propósito.

Consigo converter o ASS de volta para JSON?

Consegue, e há uma lista própria para isso: converter ASS para JSON descarta o conteúdo específico do formato, e a tabela de estilos do ASS chega ao JSON como objetos styles. A lista é diferente da de cima porque os dois formatos guardam coisas diferentes.

O ASS de saída mantém a codificação do arquivo JSON?

Não. O arquivo sai em UTF-8, com fim de linha Unix e sem BOM, independentemente do que o JSON usava. Se o documento chegou em UTF-16 ou numa codificação de byte único do Windows, ele é decodificado na entrada e o painel de resultado avisa; o ASS gerado é sempre o mesmo UTF-8.

Ferramentas relacionadas