跳至主要內容
SubtitleMatrix

TTML 轉 CSV

格式轉換TTML / DFXP
或者貼上字幕文字

這次轉換會改變什麼

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

  • 樣式

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

  • 定位

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

  • 格式專屬內容

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

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

這一頁把 TTML 寫成 CSV:表頭 `start,end,text`,一條 `<p>` 一列。時間是 `00:00:01.000` 這種時鐘寫法;TTML 與 CSV 都到毫秒,所以只要來源寫的是時鐘,時間碼就逐字元一致。

段落內部的強調保留為標籤:`<b>`、`<i>`、`<u>`、`<font color="…">`。這是 cue 級格式還承接得住的那一類樣式。真正丟的是全域層:`<styling>` 的字型、字級、描邊、陰影、邊距,`<layout>` 的區域定義,`<metadata>`,以及 `<p>` 上的 `style` / `region` 參照——CSV 沒有畫面位置,也沒有「引用一張表」的機制。

一條兩行字幕放進同一個 `text` 儲存格,中間是換行,整格依 CSV 規則加引號;帶逗號、雙引號或前後空白的格子同樣會被引號包住。產物依開始時間升序,UTF-8、LF、無 BOM;來源編碼不同會先解碼,批量可取消。

範例

一份典型的 TTML 檔轉成 CSV

輸入

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling" xml:lang="en">
  <head>
    <styling>
      <style xml:id="s1" tts:color="#FFFF00" tts:fontWeight="bold"/>
    </styling>
    <layout>
      <region xml:id="bottom" tts:origin="10% 80%" tts:extent="80% 20%"/>
    </layout>
  </head>
  <body>
    <div>
      <p begin="00:00:01.000" end="00:00:03.500" region="bottom" style="s1">Hello <span tts:fontStyle="italic">there</span>.</p>
      <p begin="00:00:03.500" end="00:00:06.000" region="bottom">How are you?<br/>Fine, thanks.</p>
    </div>
  </body>
</tt>

輸出

start,end,text
00:00:01.000,00:00:03.500,Hello <i>there</i>.
00:00:03.500,00:00:06.000,"How are you?
Fine, thanks."

這個方向丟掉頭部的樣式表、區域表與定位參照;段落內的強調以標籤保留,時間碼精確到毫秒。

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

輸入

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling"
    xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
    ttp:frameRate="25" xml:lang="en">
  <body>
    <div>
      <p begin="1.5s" dur="2s">Loaded from an offset and a duration.</p>
      <p begin="4s" end="00:00:06.50">A coarser clock spelling.</p>
      <p begin="00:00:07:00" end="00:00:08:12">Frames, at 25fps.</p>
      <p begin="9s"><span tts:color="#FF0000">Half-open</span> and Tom &amp; Jerry.</p>
    </div>
  </body>
</tt>

輸出

start,end,text
00:00:01.500,00:00:03.500,Loaded from an offset and a duration.
00:00:04.000,00:00:06.500,A coarser clock spelling.
00:00:07.000,00:00:08.480,"Frames, at 25fps."
00:00:09.000,00:00:11.000,"<font color=""#FF0000"">Half-open</font> and Tom &amp; Jerry."

這一份混用了真實寫法:位移加時長、較粗的時鐘拼法、按影格寫的時間、實體,以及只有開始時間的半開 cue。可以看解析器把哪些寫法折進同一條時間軸。

常見問題

TTML 轉 CSV 後,粗體與斜體還在嗎?

還在,寫成 `<b>` 與 `<i>` 標籤放進 `text` 欄。丟的是樣式表裡那些全域設定:字型、字級、描邊、陰影與邊距。

TTML 的 `region` 與 `style` 參照轉 CSV 後去了哪裡?

被丟掉。CSV 沒有畫面位置,也沒有可按名字查的樣式表;每條 cue 回到播放器決定的預設位置,通常是畫面底部置中。

TTML 轉 CSV 的時間碼會變嗎?

時鐘寫法下不變,兩邊都到毫秒。`begin="1.5s"` 或 `begin="00:00:07:00"` 這類寫法會先折算成時鐘,所以變的是拼法,不是時刻。

TTML 的一條兩行字幕在 CSV 裡長什麼樣?

同一個 `text` 儲存格裡兩行,整格加雙引號。它仍然是一條 cue,不會被拆成兩列紀錄。

TTML 轉 CSV 時 `<metadata>` 會被保留嗎?

不會。`<metadata>` 屬於頭部,CSV 只有 start、end、text 三欄,沒有能安放它的欄位。

CSV 再轉回 TTML 會補回樣式嗎?

不會。CSV 裡沒有記錄原來的 `tts:color` 或 `region`,轉回時只能產生沒有頭部定義的 `<p>`;已經丟掉的東西補不回來。

TTML 轉 CSV 時,帶逗號的正文會被拆成兩欄嗎?

不會。儲存格裡的逗號、雙引號、換行或前後空白都會觸發引號包裹,雙引號本身依 CSV 規則寫成兩個。

TTML 轉 CSV 的產物順序會變嗎?

會依開始時間升序重排。來源若把 cue 寫亂,CSV 會把最早開始的放在最前面;這是結構改動,不是文字改寫。

TTML 轉 CSV 的產物用什麼編碼?

UTF-8、LF、無 BOM。來源若是 UTF-16 或 Windows 單一位元編碼,會先解碼並在結果面板說明。

相關工具