Konversi ASS ke JSON
Atau tempel teks subtitle
Apa yang berubah dalam konversi ini
1 hal dihapus atau memerlukan keputusan
- Konten khusus format
konten yang disimpan format sumber di luar cue-nya (blok non-cue, teks header, pengaturan per cue, event yang dikomentari) — format tujuan tidak punya tempat untuknya
Daftar ini berasal dari matriks kemampuan untuk kedua format ini, bukan dari file tertentu yang Anda muat. File tertentu bisa kehilangan lebih banyak jika memakai fitur yang diizinkan format tetapi tidak dimodelkan matriks.
Di halaman ini skrip ASS diubah menjadi dokumen JSON dengan skema milik situs ini: satu nomor versi, lalu satu entri per cue berisi pengenal, waktu mulai dan selesai dalam milidetik, baris-baris teks, dan rentang inline untuk tiap tag. Karena model cue situs ini memang menampung gaya, posisi, dan karaoke, hampir semua yang dibawa skrip ASS bisa dinyatakan di JSON.
Satu hal hilang: isi khas format. Itu berarti [Script Info], baris Comment:, bagian [Fonts] dan [Graphics], serta konstruksi skrip lain yang berada di luar cue. Semuanya adalah konfigurasi atau lampiran untuk mesin render, bukan subtitle, jadi tidak punya kunci di skema dan tidak diselipkan ke kolom cadangan.
Waktu berubah bentuk dari perseratus detik ke milidetik bilangan bulat, dan baris cue tetap terpisah alih-alih digabung, sehingga hasilnya bisa langsung dipakai skrip Anda. Satu file atau satu musim, di peramban, tanpa unggah, hasil dalam satu ZIP.
Contoh
File ASS biasa, dikonversi ke JSON
Masukan
[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
Keluaran
{
"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"
}
]
}
Yang hilang pada hasil ini: isi khas format. Sisanya sama baris demi baris.
Konversi yang sama pada input yang berantakan
Masukan
[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 timecodeKeluaran
{
"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"
}
]
}
Ini jenis kerusakan yang nyata pada file asli — akhir baris campuran, spasi berlebih, kolom kosong. Bandingkan dengan contoh rapi di atas untuk melihat apa yang dimaafkan parser.
Pertanyaan yang sering diajukan
Apa yang terjadi pada [Script Info], baris Comment:, dan font tertanam ASS di JSON?
Semuanya dibuang. Skema JSON di sini mendeskripsikan cue, dan [Script Info] adalah konfigurasi skrip, Comment: adalah catatan penulis, sedangkan [Fonts] dan [Graphics] adalah lampiran biner untuk renderer. Tidak ada kunci untuk mereka, dan konverter tidak mengarangnya.
Seperti apa keluaran saat ASS menjadi JSON?
Dokumen dengan nomor versi dan array cues; setiap cue punya id, start dan end dalam milidetik, serta lines. Baris dengan pemformatan menyimpan tag sebagai rentang, termasuk posisi dan karaoke yang modelnya memang menampungnya.
Apakah waktu ASS tetap persis di file JSON?
Ya. ASS menulis 0:00:01.23 dan JSON menyimpannya sebagai 1230 milidetik; tidak ada pembulatan baru. Angka itu langsung bisa dipakai dalam perhitungan tanpa diurai lebih dulu.
Bagaimana cue ASS dua baris keluar di JSON?
Sebagai dua entri di array lines, bukan satu string dengan baris baru. Pemisahan itu mempertahankan struktur cue dan memudahkan skrip yang ingin memperlakukan setiap baris secara terpisah.
Apakah urutan cue ASS tetap di keluaran JSON?
Ya, dan cue diurutkan menurut waktu mulai saat diproses. Urutan di skrip bisa berbeda dari urutan waktu; JSON mengembalikannya ke urutan kronologis, dan itu perubahan struktur, bukan isi.
Bisakah JSON hasil konversi ASS ini diubah kembali menjadi ASS?
Bisa lewat halaman JSON ke ASS, dan yang tidak bisa dipulihkan hanyalah isi khas format — [Script Info], Comment:, dan lampiran font serta grafik. Gaya, posisi, karaoke, waktu, dan teks kembali.
Apakah keluaran JSON mempertahankan encoding file ASS saya?
Tidak — hasil selalu UTF-8, akhir baris Unix, tanpa byte-order mark. File ASS berencoding lama didekode saat dibaca, dan panel hasil menandai bila konversi encoding terjadi.