跳至主要內容
SubtitleMatrix

LRC 轉 JSON

格式轉換歌詞(LRC)
或者貼上字幕文字

選項

當來源檔案沒有結束時間時使用(純文字、LRC)。輸出裡的時間軸是在這裡產生的,不是轉換來的,所以填多少就是多少。

這次轉換會改變什麼

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

  • 時間

    字幕的結束時間——來源檔案不記錄這些時間,因此輸出中的結束時間是產生出來的,而非轉換而來

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

LRC 轉 JSON 輸出的是結構化資料:`version`、可有可無的 `title`,以及 `cues` 陣列;每一條 cue 有自己的 `start`、`end`(整數毫秒)與 `lines`。適合再交給腳本或做後續批次處理。

`end` 由下一行的開始推得,最後一行用頁面設定的時長補足,報告會標明這個值是生成的。同一個時間戳的多行歌詞會進入同一條 cue 的 `lines`,因此雙語歌詞不會被拆成兩條。

`[ti:]` 寫進 JSON 的 `title`,`[ar:]` 與 `[al:]` 沒有對應欄位,`[offset:]` 讀取但不套用。輸出依 `start` 升序排列,空歌詞行會保留成 `lines` 裡的一個空字串;轉換在瀏覽器內完成,檔案不上傳、不需要註冊。

範例

一份典型的 LRC 檔轉成 JSON

輸入

[ti:Sample Song]
[ar:Some Artist]
[length:00:41.00]
[offset:+250]
[00:12.00]First line of the song.
[00:15.30]Second line.
[00:15.30]Second line, translated.
[00:18.00]
[00:21.50]Final line.

輸出

{
  "version": 1,
  "title": "Sample Song",
  "cues": [
    {
      "start": 12000,
      "end": 15300,
      "lines": [
        "First line of the song."
      ]
    },
    {
      "start": 15300,
      "end": 18000,
      "lines": [
        "Second line.",
        "Second line, translated."
      ]
    },
    {
      "start": 18000,
      "end": 21500,
      "lines": [
        ""
      ]
    },
    {
      "start": 21500,
      "end": 23500,
      "lines": [
        "Final line."
      ]
    }
  ]
}

這個方向丟掉的是結束時間;開始時間由百分秒換成整數毫秒,文字逐行對應。

同一轉換遇到一份格式凌亂的檔案

輸入

[ar:Some Artist]
[0:05.5]Leading zero omitted, one decimal.
[00:07]Second with no centiseconds.
[00:03.00]Out of order.
[00:07.00][00:09.00]Repeated chorus line.
[00:12.00]

輸出

{
  "version": 1,
  "cues": [
    {
      "start": 3000,
      "end": 5500,
      "lines": [
        "Out of order."
      ]
    },
    {
      "start": 5500,
      "end": 7000,
      "lines": [
        "Leading zero omitted, one decimal."
      ]
    },
    {
      "start": 7000,
      "end": 9000,
      "lines": [
        "Second with no centiseconds.",
        "Repeated chorus line."
      ]
    },
    {
      "start": 9000,
      "end": 12000,
      "lines": [
        "Repeated chorus line."
      ]
    },
    {
      "start": 12000,
      "end": 14000,
      "lines": [
        ""
      ]
    }
  ]
}

真實檔案常見的狀況:BOM、混合換行、缺前導零的時間戳、重複的副歌行。解析器不會中斷,讀不出的部分會進有損說明。

常見問題

LRC 轉 JSON 後,`[ti:]` 標題會寫在哪裡?

寫進頂層的 `title` 欄位;檔案沒有 `[ti:]` 時這個鍵不會出現,而不是留下一個空字串。

LRC 轉 JSON 的 `end` 數值是怎麼算出來的?

取下一行的開始;最後一行沒有後繼,用頁面設定的時長補,報告會標明這個值是生成的,因為檔案裡沒有任何值可以借。

LRC 的 `[ar:]` 藝人在 JSON 裡留得住嗎?

留不住。cue 模型沒有藝人欄位,`[ar:]` 與 `[al:]` 都不會進到產物;`[offset:]` 會被讀取,但不會加進任何 `start` 或 `end`。

LRC 轉 JSON 時,同一時間戳的兩行歌詞會合併嗎?

會。它們進入同一條 cue 的 `lines` 陣列,因此雙語歌詞仍然是同一條字幕,不會變成兩條時間相同的紀錄。

LRC 轉 JSON 後,時間的單位是什麼?

整數毫秒。`[00:12.00]` 寫成 `12000`,`[00:15.30]` 寫成 `15300`,小數點在產物裡不存在。

LRC 轉 JSON 會把亂序的歌詞排好嗎?

會。`cues` 依 `start` 升序輸出,原檔案的先後若顛倒會被糾正;陣列順序就是播放器讀到的順序。

相關工具