跳至主要內容
SubtitleMatrix

SRT 轉 JSON

格式轉換SubRip(SRT)
或者貼上字幕文字

這次轉換會改變什麼

這個方向不會遺失內容 —— 來源格式的每一項特性在目標格式裡都有地方可去。

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

這一頁把字幕變成結構化資料:一份 JSON 檔案,逐條列出每條字幕的起止時間與文字。schema 是本站自有的,刻意做得精簡——一個版本號加一個 cues 陣列,時間用整數毫秒而不是時間碼,不依賴任何特定函式庫,也沒有需要猜測的欄位。

用毫秒是因為它不需要先解析就能使用:本站支援的字幕格式最細只到一毫秒,而整數不會因為逗號或小數點的書寫慣例被讀錯。沒有格式的列是普通字串;帶斜體、粗體或顏色的列會變成物件,裡面有文字與套用到它的標籤,每個標籤記錄自己的類型與涵蓋的字元範圍。

產物是一份可以載入腳本、做 diff 或提交進版本控制的檔案,轉回去就能拿回字幕。和其他頁面一樣,所有工作都在你的瀏覽器裡完成;一次拖入多個檔案時,佇列依序處理、可中途停止,結果打包成一個 ZIP。

範例

一份典型的 SRT 檔案轉成 JSON

輸入

1
00:00:01,000 --> 00:00:03,500
Hello there.

2
00:00:03,500 --> 00:00:06,000
<i>Whispering</i> now.
And a second line.

3
00:00:06,000 --> 00:00:09,250
<b>Bold</b> statement.

輸出

{
  "version": 1,
  "cues": [
    {
      "id": "1",
      "start": 1000,
      "end": 3500,
      "lines": [
        "Hello there."
      ]
    },
    {
      "id": "2",
      "start": 3500,
      "end": 6000,
      "lines": [
        {
          "text": "Whispering now.",
          "tags": [
            {
              "kind": "italic",
              "start": 0,
              "end": 10
            }
          ]
        },
        "And a second line."
      ]
    },
    {
      "id": "3",
      "start": 6000,
      "end": 9250,
      "lines": [
        {
          "text": "Bold statement.",
          "tags": [
            {
              "kind": "bold",
              "start": 0,
              "end": 4
            }
          ]
        }
      ]
    }
  ]
}

這個方向沒有遺失東西:時間、文字與行內標籤都能從 JSON 還原。

同一轉換遇到一份格式不規則的輸入

輸入

1
0:00:01,00 --> 0:00:03,500
<B>Bold</B> and <I>italic</I>.


2
00:00:03,500 --> 00:00:06,000


3
00:00:08,000 --> 00:00:09,000
Last one.

輸出

{
  "version": 1,
  "cues": [
    {
      "id": "1",
      "start": 1000,
      "end": 3500,
      "lines": [
        {
          "text": "Bold and italic.",
          "tags": [
            {
              "kind": "bold",
              "start": 0,
              "end": 4
            },
            {
              "kind": "italic",
              "start": 9,
              "end": 15
            }
          ]
        }
      ]
    },
    {
      "id": "2",
      "start": 3500,
      "end": 6000,
      "lines": []
    },
    {
      "id": "3",
      "start": 8000,
      "end": 9000,
      "lines": [
        "Last one."
      ]
    }
  ]
}

空行、混合換行與多餘空白不會改變 schema;可疑條目會被修好或記進有損說明,產物仍是合法 JSON。

常見問題

SRT 轉 JSON 用的是哪一套 schema?

本站自有的 schema,範例就在上方面板:一個版本號,接著一個 cues 陣列。每條字幕有 id、以毫秒為單位的 start 與 end,以及一個 lines 清單;沒有隱藏的中繼資料,也不依賴第三方格式。

SRT 轉 JSON 為什麼用毫秒而不是時間碼?

這樣檔案不必先解析就能使用。把兩個時間相加、比較或排序,都只是整數運算;像 00:00:01,000 這樣的字串則必須先解碼,而且可能解錯。

SRT 轉 JSON 後斜體要怎麼表示?

純文字列仍是字串;帶格式的列會變成物件,裡面有 text 與 tags 陣列,每個標籤說明自己的類型以及在文字中開始、結束的位置。把 JSON 轉回去,格式就會被重新寫出。

SRT 轉 JSON 的產物可以手動編輯嗎?

可以,而轉回去就是檢查方式:只要檔案解析得動,轉換就會依你給的時間重現字幕,所以來回轉一次是找出錯字最快的方法。

SRT 轉 JSON 的檔案能直接交給腳本讀嗎?

可以,這正是它的用途:讀 cues 陣列,把 start 與 end 當數字,再把 lines 串起來——每一列不是字串,就是 text 欄位裝著文字的物件。

相關工具