跳至主要內容
SubtitleMatrix

SMI 轉 JSON

格式轉換SAMI(SMI)
或者貼上字幕文字

這次轉換會改變什麼

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

  • 格式專屬內容

    來源格式保留在字幕之外的內容(非字幕區塊、檔案標頭文字、單條字幕的設定、被註解掉的事件)——目標格式沒有地方存放它們

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

這一頁把 SMI 轉成本站的 JSON 結構:給腳本與流程讀的字幕表示,時間是整數毫秒。轉換完全在瀏覽器裡執行,不會上傳。

這兩種格式存的東西不同,而且差別不是外觀問題:格式私有內容在 JSON 裡沒有落點。JSON 產物雖然有 `title` 與 `styles` 欄位,但對 SMI 來說兩者都是空的,因為沒有規則把 SAMI 的 CSS 或標題映射過去;寫在字幕文字裡的強調則會進入 `tags` 陣列。時間軸不受影響:`Start=4126` 寫成 `4126`。

單一檔案可以,整季影集也可以:佇列會依序處理,結果一起打包成一個 ZIP 下載。

範例

一份典型的 SMI 檔案轉成 JSON

輸入

<SAMI>
<HEAD>
<STYLE TYPE="text/css">
<!--
P { text-align: center; font-family: Arial; }
.ENCC { Name: English; lang: en-US; }
-->
</STYLE>
</HEAD>
<BODY>
<SYNC Start=1000>
<P Class=ENCC>Hello there.
<SYNC Start=3000>
<P Class=ENCC>&nbsp;
<SYNC Start=3500>
<P Class=ENCC>How are you?<br>Fine, thanks.
<SYNC Start=6000>
<P Class=ENCC>&nbsp;
</BODY>
</SAMI>

輸出

{
  "version": 1,
  "cues": [
    {
      "start": 1000,
      "end": 3000,
      "lines": [
        "Hello there."
      ]
    },
    {
      "start": 3500,
      "end": 6000,
      "lines": [
        "How are you?",
        "Fine, thanks."
      ]
    }
  ]
}

這份產物丟掉了 STYLE、TITLE 與 Class;毫秒時間與行內標註都保留。

同一轉換遇到格式紊亂的輸入

輸入

<SAMI>
<HEAD>
<TITLE>Episode 1</TITLE>
<STYLE TYPE="text/css">
<!--
.ENCC { Name: English; }
-->
</STYLE>
</HEAD>
<BODY>
<sync start="00:00:02,500">
<P Class=ENCC>Line one<br>Line two
<sync start=9000>
<P Class=ENCC>Tom &amp; Jerry
<SYNC Start=12000>
<P Class=ENCC>&nbsp;
</BODY>
</SAMI>

輸出

{
  "version": 1,
  "cues": [
    {
      "start": 2500,
      "end": 9000,
      "lines": [
        "Line one",
        "Line two"
      ]
    },
    {
      "start": 9000,
      "end": 12000,
      "lines": [
        "Tom &amp; Jerry"
      ]
    }
  ]
}

真實檔案常見的損壞就是這樣——混合換行、散落的空白、壞掉的 SYNC 區塊。拿它和上面那份乾淨樣本對照,就能看出解析器容忍到什麼程度。

常見問題

SMI 轉 JSON 後,<STYLE> 的 CSS 會進入 styles 欄位嗎?

不會。JSON 產物有 `title` 與 `styles` 欄位,但這兩個欄位對 SMI 是空的,因為 CSS 與 `<TITLE>` 沒有映射規則。

SMI 轉 JSON 後,start 與 end 用什麼單位?

整數毫秒。`Start=4126` 直接寫成 `4126`,不經過時間碼字串,所以沒有舍入誤差。

SMI 轉 JSON 後,行內斜體會放在哪裡?

放在對應行的 `tags` 陣列裡,而不是拼進 `lines` 的純文字;它屬於文字本身的標註。

SMI 轉 JSON 時,一條兩行的字幕會變成兩條 cue 嗎?

不會。它仍是同一條 cue,兩行分別是 `lines` 陣列的兩項。

SMI 轉 JSON 後,清屏區塊會保留嗎?

不會。`<P>&nbsp;` 沒有文字,只拿來清屏,不會產生 cue;它在檔案裡的位置會在讀取過程中記錄下來。

SMI 轉 JSON 的產物有 title 與 styles 欄位嗎?

有,但對 SMI 而言兩者都是空的;cue 本身帶 `start`、`end` 與 `lines`,時間是整數毫秒。

SMI 轉 JSON 的產物使用什麼編碼?

固定 UTF-8、Unix 換行、無 BOM;輸入若是 UTF-16 或 Windows 單一位元組編碼,讀入時會先解碼。

相關工具