跳至主要內容
SubtitleMatrix

JSON 轉 SRT

或者貼上字幕文字

這次轉換會改變什麼

有 3 項會被捨棄或需要你決定

  • 樣式

    全部樣式(粗體、斜體、顏色、外框、陰影)

  • 定位

    螢幕定位(每條字幕都會回到預設位置)

  • 卡拉 OK

    卡拉 OK 計時(逐音節高亮)

這份清單來自這兩種格式的能力矩陣,而不是你載入的這份具體檔案。如果具體檔案用到了格式允許、但矩陣沒有建模的特性,可能會遺失更多。

這一頁把 JSON 字幕檔轉成 SRT。拖入檔案或直接貼上文字,就會拿回 SRT 版本;轉換全程在瀏覽器裡跑,不上傳、也不需要帳號。

兩個格式能存的東西不同,差別不是外觀問題:樣式、定位與卡拉OK在 SRT 裡沒有落點。上方清單來自兩個格式各自能表達什麼,不是讀了你的檔案才算出來的,所以檔案還沒載入就已經是這個答案。

本站的 JSON 完整形狀是版本號加一個 cues 陣列,也可以直接是一串 cue;它保留樣式、定位與卡拉OK,這些正是播放器格式常丟掉的。單檔可以,整季也可以:佇列依序處理,結果打包成一個 ZIP。

範例

一份典型的 JSON 檔轉成 SRT

輸入

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

輸出

1
00:00:00,000 --> 00:00:02,000
Hello world.
Second line.

2
00:00:02,500 --> 00:00:04,000
Plain line.
<i>Styled</i> line.

3
00:00:04,500 --> 00:00:06,000
Roger: I am here.

這份產物丟掉了:樣式、定位與卡拉OK。其餘內容逐行對得上。

同一轉換遇到結構鬆散的 JSON 輸入

輸入

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

輸出

1
00:00:00,000 --> 00:00:01,000
First.

2
00:00:01,000 --> 00:00:02,000
Second.

3
00:00:02,000 --> 00:00:03,000
Third.

真實檔案常有混合換行、多餘空白與空欄位,這份輸入就是那個樣子;可以對照上面那份乾淨範例,看看解析器容忍到哪裡。

常見問題

JSON 轉 SRT 接受哪幾種 JSON 結構?

兩種:本站寫出的「版本號加 cues 陣列」,以及檔案本身就是一串 cue。判斷標準是每條 cue 有沒有 start、end 與文字,不是開頭有沒有版本號。

JSON 轉 SRT 時,粗體、斜體與顏色會留下嗎?

行內強調會留下,樣式表不會。粗體、斜體、底線與顏色會寫成 SRT 文字裡的標籤(<i>、<b>、<u>、<font color="…">),這是 cue 層級格式還帶得動的部分;JSON 檔的全域樣式表——字型、字號、描邊、陰影與邊距——則整份丟掉。

JSON 轉 SRT 時,時間碼會失真嗎?

不會。JSON 的 4126 毫秒進到 SRT 就是 00:00:04,126,兩邊都以毫秒為單位,不四捨五入、不位移。

JSON 轉 SRT 時,結束時間早於開始時間的 cue 會怎麼處理?

轉換器會修好它,不會拒絕整份檔案,所以手改過的檔案仍然產得出可載入的字幕。修好的時間要對照影片確認,因為原檔已經在提示這裡有問題。

JSON 轉 SRT 再轉回 JSON,會損失什麼?

時間軸與行內樣式會原樣回來:斜體、粗體、顏色寫成標籤後再讀回標籤。回不來的是 SRT 本來就存不下的東西——全域樣式表、螢幕定位與卡拉OK——也就是上方列出的那幾項。

相關工具