Chuyển đến nội dung chính
SubtitleMatrix

Chuyển JSON sang ASS

Hoặc dán văn bản phụ đề

Chuyển đổi này thay đổi điều gì

1 thứ bị bỏ hoặc cần một quyết định

  • Độ chính xác

    độ chính xác thời gian — đồng hồ của kết quả thô hơn, nên mọi mốc thời gian được làm tròn đến 10 ms gần nhất

Danh sách này đến từ ma trận năng lực của hai định dạng này, không phải từ tệp cụ thể bạn đã tải lên. Một tệp cụ thể có thể mất nhiều hơn nếu nó dùng các tính năng mà định dạng cho phép nhưng ma trận không mô hình hóa.

Trang này chuyển đổi JSON sang ASS. Bạn kéo tệp vào hoặc dán văn bản, rồi nhận lại phiên bản ASS. Toàn bộ quá trình chạy ngay trong trình duyệt: không tải tệp lên máy chủ, không cần tài khoản.

JSON ở đây lưu thời gian bằng mili giây, còn ASS chỉ ghi tới một phần trăm giây, nên phần lẻ bị làm tròn tới 10 ms gần nhất; đó là mất mát duy nhất của chiều này. Danh sách phía trên lấy từ khả năng của hai định dạng chứ không phải từ tệp của bạn, nên nó giống nhau trước khi bạn mở tệp.

Một tệp hay cả mùa đều được: hàng đợi xử lý lần lượt và trả kết quả về cùng một tệp ZIP.

Ví dụ

Tệp JSON thông thường, chuyển sang ASS

Đầu vào

{
  "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"
    }
  ]
}

Kết quả

[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.

Phần bị mất trong kết quả này: độ chính xác. Phần còn lại khớp từng dòng.

Cùng phép chuyển trên một tệp lộn xộn

Đầu vào

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

Kết quả

[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.

Đây là kiểu hỏng tệp thật thường có — kết thúc dòng lẫn lộn, khoảng trắng thừa, trường bỏ trống. So sánh với ví dụ gọn phía trên để thấy bộ đọc bỏ qua được gì.

Câu hỏi thường gặp

Vì sao mốc thời gian đổi khi chuyển JSON sang ASS?

JSON ghi `4126` mili giây, còn ASS ghi `0:00:04.13` — một phần trăm giây — nên mỗi mốc được làm tròn tới 10 ms gần nhất. Không cue nào bị kéo giãn hay đổi thứ tự, và lệch tối đa là 5 ms.

Kết quả JSON sang ASS trông như thế nào?

Mỗi cue thành một dòng `Dialogue:` trong mục `[Events]`, với trường layer thay cho số thứ tự của SRT. Bảng `styles` của JSON được dựng thành mục `[V4+ Styles]`, nên kiểu chữ có tên vẫn đi theo.

Một cue JSON hai dòng ra sao trong tệp ASS?

Hai phần tử trong mảng `lines` được nối bằng `\N`, cách ASS ghi ngắt dòng cứng. Hai dòng vẫn thuộc cùng một cue ASS nên trình phát hiển thị chúng cùng lúc.

Các cue JSON có giữ thứ tự trong kết quả ASS không?

Có, và chúng được sắp theo trường `start` trước khi ghi ra. Nếu tài liệu JSON liệt kê cue lộn thứ tự, ASS xuất ra sẽ xếp lại; đó là thay đổi cấu trúc, không phải nội dung.

Tôi có chuyển ngược ASS về JSON được không?

Được, nhưng chiều ASS sang JSON bỏ nội dung riêng của định dạng: các khối `[Script Info]`, hiệu ứng và cấu trúc ngoài mô hình cue không có chỗ trong JSON. Danh sách mất mát của chiều ngược khác danh sách phía trên.

Kết quả ASS có giữ encoding của tệp JSON không?

Không. ASS xuất ra là UTF-8, kết thúc dòng kiểu Unix và không có BOM, bất kể JSON đầu vào dùng gì. Tệp UTF-16 được giải mã khi đọc và bảng kết quả sẽ báo.

Công cụ liên quan