Siirry pääsisältöön
SubtitleMatrix

Muunna ASS muotoon JSON

MuunnoksetAdvanced SubStation Alpha (ASS)
Tai liitä tekstityksen teksti

Mitä tämä muunnos muuttaa

1 asia pudotetaan tai vaatii päätöksen

  • Muotokohtainen sisältö

    sisältö, jonka lähdemuoto pitää alaotsikoidensa ulkopuolella (ei-alaotsikkolohkot, otsikkoteksti, alaotsikkokohtaiset asetukset, kommentoidut tapahtumat) — kohdemuodossa ei ole sille paikkaa

Tämä luettelo tulee näiden kahden muodon kyvykkyysmatriisista, ei lataamastasi tiedostosta. Tietty tiedosto voi menettää enemmän, jos se käyttää ominaisuuksia, jotka muoto sallii mutta matriisi ei mallinna.

Kun ASS muunnetaan JSONiksi, jokainen ASS-tiedoston alaotsikko kirjoitetaan uudelleen muotoon, jossa yksi alaotsikko on cues-taulukon alkio, jossa on start-, end- ja lines-kentät. Aikakoodi vaihtaa muotoa: ASS kirjoittaa sen muodossa 0:00:01.00, JSON puolestaan muodossa {"start": 1000, "end": 3500}. Sanoja ei muuteta, vaan ASS-tiedoston teksti siirretään JSONiin sellaisenaan.

Tässä suunnassa ASS-tiedostosta putoaa alaotsikoiden ulkopuolinen sisältö, kun se muunnetaan JSONiksi. Kun ASS muunnetaan JSONiksi, kohteen ulkopuolelle jäävät [Script Info] -osio, [V4+ Styles] -tyylitaulu sekä [Fonts]- ja [Graphics]-osiot ja Comment:-rivit. Luettelo on näkyvissä ennen kuin valitset ASS-tiedoston, ja se tarkentuu JSON-muunnoksen lukemisen jälkeen.

Koko ASS-kausi mahtuu samaan ajoon: tiedostot käsitellään yksi kerrallaan, ajon voi keskeyttää keskeltä ja kaikki JSON-tulokset tulevat yhtenä ZIP-tiedostona. Muunnos tapahtuu selaimessa, joten ASS-tiedostosi eivät käy palvelimella ennen JSON-versiota.

Esimerkit

Miltä tavallinen ASS-tiedosto näyttää JSONissa

Syöte

[Script Info]
Title: Example
ScriptType: v4.00+
WrapStyle: 0

[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
Style: Title,Arial,36,&H0000FFFF,&H000000FF,&H00000000,&H00000000,-1,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:04.00,Default,,0,0,0,,Hello there.
Dialogue: 0,0:00:05.00,0:00:08.50,Default,,0,0,0,,{\i1}Italic{\i0} and {\b1}bold{\b0} text.
Dialogue: 0,0:00:09.00,0:00:12.00,Title,,0,0,0,,{\pos(320,240)}Positioned
Dialogue: 0,0:00:13.00,0:00:16.00,Default,,0,0,0,,{\k50}ka{\k30}ra{\k20}o{\k10}ke
Dialogue: 0,0:00:17.00,0:00:20.00,Default,,0,0,0,,Line one\NLine two
Dialogue: 1,0:00:21.00,0:00:24.00,Default,,0,0,0,,{\an7}Top left

Tuotos

{
  "version": 1,
  "title": "Example",
  "styles": {
    "Default": {
      "name": "Default",
      "Name": "Default",
      "Fontname": "Arial",
      "Fontsize": "20",
      "PrimaryColour": "&H00FFFFFF",
      "SecondaryColour": "&H000000FF",
      "OutlineColour": "&H00000000",
      "BackColour": "&H00000000",
      "Bold": "0",
      "Italic": "0",
      "Underline": "0",
      "StrikeOut": "0",
      "ScaleX": "100",
      "ScaleY": "100",
      "Spacing": "0",
      "Angle": "0",
      "BorderStyle": "1",
      "Outline": "2",
      "Shadow": "2",
      "Alignment": "2",
      "MarginL": "10",
      "MarginR": "10",
      "MarginV": "10",
      "Encoding": "1",
      "fontFamily": "Arial",
      "fontSize": 20,
      "primaryColor": "#ffffff",
      "outlineColor": "#000000",
      "bold": false,
      "italic": false
    },
    "Title": {
      "name": "Title",
      "Name": "Title",
      "Fontname": "Arial",
      "Fontsize": "36",
      "PrimaryColour": "&H0000FFFF",
      "SecondaryColour": "&H000000FF",
      "OutlineColour": "&H00000000",
      "BackColour": "&H00000000",
      "Bold": "-1",
      "Italic": "0",
      "Underline": "0",
      "StrikeOut": "0",
      "ScaleX": "100",
      "ScaleY": "100",
      "Spacing": "0",
      "Angle": "0",
      "BorderStyle": "1",
      "Outline": "2",
      "Shadow": "2",
      "Alignment": "2",
      "MarginL": "10",
      "MarginR": "10",
      "MarginV": "10",
      "Encoding": "1",
      "fontFamily": "Arial",
      "fontSize": 36,
      "primaryColor": "#ffff00",
      "outlineColor": "#000000",
      "bold": true,
      "italic": false
    }
  },
  "cues": [
    {
      "start": 1000,
      "end": 4000,
      "lines": [
        "Hello there."
      ],
      "style": "Default"
    },
    {
      "start": 5000,
      "end": 8500,
      "lines": [
        {
          "text": "Italic and bold text.",
          "tags": [
            {
              "kind": "italic",
              "start": 0,
              "end": 6
            },
            {
              "kind": "bold",
              "start": 11,
              "end": 15
            }
          ]
        }
      ],
      "style": "Default"
    },
    {
      "start": 9000,
      "end": 12000,
      "lines": [
        "Positioned"
      ],
      "style": "Title",
      "position": {
        "x": 320,
        "y": 240
      }
    },
    {
      "start": 13000,
      "end": 16000,
      "lines": [
        {
          "text": "karaoke",
          "tags": [
            {
              "kind": "karaoke",
              "start": 0,
              "end": 2,
              "value": "50"
            },
            {
              "kind": "karaoke",
              "start": 2,
              "end": 4,
              "value": "30"
            },
            {
              "kind": "karaoke",
              "start": 4,
              "end": 5,
              "value": "20"
            },
            {
              "kind": "karaoke",
              "start": 5,
              "end": 7,
              "value": "10"
            }
          ]
        }
      ],
      "style": "Default"
    },
    {
      "start": 17000,
      "end": 20000,
      "lines": [
        "Line one",
        "Line two"
      ],
      "style": "Default"
    },
    {
      "start": 21000,
      "end": 24000,
      "lines": [
        "Top left"
      ],
      "style": "Default"
    }
  ]
}

Tulosteessa ASS:sta JSONiin menetetään muotokohtainen sisältö; vertaa kahta puolta rivi riviltä ja katso, mikä säilyi.

Sama ASS → JSON -muunnos hankalalla aineistolla

Syöte

[Script Info]
; 一份真实的脏文件:BOM + CRLF + 认不出的覆写码 + Comment + 坏时间码
Title: Dirty sample
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,1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Fonts]
fontname: Arial
!!!!!!!!!!!!!!!!!!!!!!!!!!!!

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Comment: 0,0:00:00.00,0:00:01.00,Default,,0,0,0,,这是一条注释,不该变成字幕
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello, world
Dialogue: 0,0:00:05.00,0:00:08.00,Default,,0,0,0,,{\fad(300,300)}Unmodelled override
Dialogue: 0,0:00:09.00,0:00:12.00,Default,,0,0,0,,{\an7\pos(320,240)}Both, wrong order
Dialogue: 0,0:00:13.00,0:00:16.5,Default,,0,0,0,,One decimal centisecond
Dialogue: 0,0:00:17.00,0:00:20.00,Default,,0,0,0,,Soft\nbreak
Dialogue: 0,0:00:xx.00,0:00:24.00,Default,,0,0,0,,Broken timecode

Tuotos

{
  "version": 1,
  "title": "Dirty sample",
  "styles": {
    "Default": {
      "name": "Default",
      "Name": "Default",
      "Fontname": "Arial",
      "Fontsize": "20",
      "PrimaryColour": "&H00FFFFFF",
      "SecondaryColour": "&H000000FF",
      "OutlineColour": "&H00000000",
      "BackColour": "&H00000000",
      "Bold": "1",
      "Italic": "0",
      "Underline": "0",
      "StrikeOut": "0",
      "ScaleX": "100",
      "ScaleY": "100",
      "Spacing": "0",
      "Angle": "0",
      "BorderStyle": "1",
      "Outline": "2",
      "Shadow": "2",
      "Alignment": "2",
      "MarginL": "10",
      "MarginR": "10",
      "MarginV": "10",
      "Encoding": "1",
      "fontFamily": "Arial",
      "fontSize": 20,
      "primaryColor": "#ffffff",
      "outlineColor": "#000000",
      "bold": true,
      "italic": false
    }
  },
  "cues": [
    {
      "start": 1000,
      "end": 4000,
      "lines": [
        "Hello, world"
      ],
      "style": "Default"
    },
    {
      "start": 5000,
      "end": 8000,
      "lines": [
        "{\\fad(300,300)}Unmodelled override"
      ],
      "style": "Default"
    },
    {
      "start": 9000,
      "end": 12000,
      "lines": [
        "Both, wrong order"
      ],
      "style": "Default",
      "position": {
        "x": 320,
        "y": 240
      }
    },
    {
      "start": 13000,
      "end": 16500,
      "lines": [
        "One decimal centisecond"
      ],
      "style": "Default"
    },
    {
      "start": 17000,
      "end": 20000,
      "lines": [
        "Soft",
        "break"
      ],
      "style": "Default"
    }
  ]
}

Näin rikkinäinen ASS-tiedosto saapuu JSON-muunnokseen: BOM-merkintä, Windows-rivinvaihdot ja lukukelvottomat aikakoodit eivät kaada jäsennintä. Vertaa sitä yllä olevaan siistiin esimerkkiin ja katso, mitä JSON saa mukaansa.

Usein kysytyt kysymykset

Miten ASS ja JSON kirjoittavat aikakoodin?

ASS kirjoittaa ajan muodossa 0:00:01.00: tunnit, minuutit, sekunnit ja sadasosat. JSON käyttää muotoa {"start": 1000, "end": 3500}, eli kokonaislukuina millisekunteina. Lähde on karkeampi: ASS tallentaa sadasosat, ja ne kirjoitetaan JSON-muodossa millisekunteina sellaisenaan, joten tarkkuus ei heikkene.

Mitä ASS:sta menetetään, kun siitä tehdään JSON?

Kun ASS muunnetaan JSONiksi, menetettävää on alaotsikoiden ulkopuolinen sisältö. Kun ASS muunnetaan JSONiksi, kohteen ulkopuolelle jäävät [Script Info] -osio, [V4+ Styles] -tyylitaulu sekä [Fonts]- ja [Graphics]-osiot ja Comment:-rivit. Alaotsikoiden teksti ja keskinäinen järjestys säilyvät.

Miten rivinsisäiset tagit käyttäytyvät, kun ASS muunnetaan JSONiksi?

ASS merkitsee rivinsisäisen muotoilun muodossa \i1, \b1, \c&H…& ja \anN, ja JSON kirjoittaa sen muodossa merkkirajoina tallennetut tagit.

Miten ASS-tiedoston moniriviset alaotsikot käyttäytyvät JSONissa?

Monirivisen alaotsikon rivit erotetaan ASS:ssa \N-merkinnällä, ja JSON merkitsee ne lines-taulukon erillisinä alkioina. JSON:ssa rivit ovat lines-taulukon alkioita, joten rakenne säilyy täsmälleen.

Mitä ASS-tiedoston [Script Info]- ja [Fonts]-osioille tapahtuu JSONissa?

ASS pitää alaotsikoiden ulkopuolella [Script Info] -otsakkeen, [Fonts]- ja [Graphics]-osiot sekä Comment:-rivit. JSON ei tarjoa niille paikkaa, joten ne jäävät pois ja raportoidaan menetyksinä; itse Dialogue-rivien teksti säilyy.

Toimiiko paluumuunnos JSONista ASS:hen samalla tavalla?

Kyllä, mutta paluusuunnassa menetettävää on: aikojen tarkkuus. Kun JSON muunnetaan ASS:ksi, jokainen aikaleima pyöristetään lähimpään 10 ms:iin. Edestakainen matka ASS:sta JSONiin ja takaisin ei palauta sitä, mitä ensimmäinen muunnos pudotti.

Toimiiko ASS → JSON -eräajo, kun tiedostoja on sata?

Kyllä. Jono käsittelee ASS-tiedostot yksi kerrallaan, ajon voi keskeyttää milloin tahansa ja tulokset tulevat yhtenä ZIP-tiedostona. Jokainen JSON-tiedosto kirjoitetaan selaimessa, joten mitään ei lähetetä palvelimelle; yksittäinen tekstitystiedosto saa olla enintään 64 Mt.

Aiheeseen liittyvät työkalut