跳至主要內容
SubtitleMatrix

TTML 轉 LRC

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

這次轉換會改變什麼

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

  • 時間

    字幕的結束時間(輸出格式只記錄字幕何時開始)

  • 樣式

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

  • 定位

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

  • 精確度

    時間精確度——輸出的時間刻度較粗,因此每個時間戳記都會四捨五入到最接近的 10 毫秒

  • 格式專屬內容

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

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

這一頁把 TTML 寫成 LRC:每行一個 `[00:01.00]` 時間戳。LRC 只記開始時刻,不記結束——歌詞播放器會把這一行留到下一條開始為止,所以每條 `<p>` 的 `end` 都會被丟掉。

它也是這一組轉換裡丟得最多的一頁:結束時間、頭部兩張表(`<styling>` 與 `<layout>`)、命名空間與 `<metadata>`、`<p>` 上的 `style` / `region` 參照、段落內的強調,全都沒有落點。精度也降一級:TTML 到毫秒,LRC 到百分秒,四捨五入到 10 ms,單條最多偏 5 ms。

能保住的只有順序與文字。一條 `<p>` 裡的 `<br/>` 兩行會寫成兩行同時間戳的 LRC,這是 LRC 表示「它們屬於同一條字幕」的唯一方式。產物依開始時間升序,UTF-8、LF、無 BOM;批次可取消、最後打包成 ZIP。

範例

一份典型的 TTML 檔轉成 LRC

輸入

<?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>

輸出

[00:01.00]Hello there.
[00:03.50]How are you?
[00:03.50]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>

輸出

[00:01.50]Loaded from an offset and a duration.
[00:04.00]A coarser clock spelling.
[00:07.00]Frames, at 25fps.
[00:09.00]Half-open and Tom &amp; Jerry.

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

常見問題

TTML 轉 LRC 時,每條 cue 的結束時間去哪了?

被丟掉。LRC 沒有結束時間的寫法,一行會一直顯示到下一條開始;`end` 再精確也沒有位置可放。

TTML 的 `<styling>` 和 `<layout>` 轉 LRC 後還在嗎?

不在。LRC 不存任何樣式或位置,頭部兩張表與 `<p>` 上的參照一起消失,每行都是純文字。

TTML 轉 LRC 的時間碼精度是多少?

百分秒。`[00:01.00]` 只到百分之一秒,毫秒換算後四捨五入到最近的 10 ms,單條最多偏 5 ms。

TTML 轉 LRC 時一條兩行字幕怎麼寫?

寫成兩行 LRC,時間戳相同。LRC 沒有 cue 分組,只能靠相同時間戳表示這兩行一起出現。

TTML 的 `begin="00:00:07:00"` 影格寫法 LRC 認嗎?

認。它在轉換時依 `ttp:frameRate` 先折算成時鐘(25 fps 下是 7.00 秒),再寫成 LRC 的時間戳;LRC 產物本身只有時鐘。

TTML 轉 LRC 後,段落內的斜體與顏色還在嗎?

不在。LRC 沒有任何行內標記語法,`<span>` 裡的文字留下,斜體、顏色與底線都不保留。

TTML 轉 LRC 會保留 `<metadata>` 嗎?

不會。`<metadata>` 屬於 XML 頭部,LRC 只有時間戳與歌詞行,沒有能安放它的地方。

TTML 轉 LRC 後,cue 的順序會被改動嗎?

會依開始時間升序重排。來源若原本有序就一個字都不動;顛倒的檔案會被放回正確順序。

LRC 再轉回 TTML 會丟掉什麼?

丟掉時間軸。LRC 沒有結束時間,寫回 TTML 時要重新替每條 `<p>` 產生一個 `end`;樣式與區域同樣補不回來。

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

UTF-8、LF、無 BOM;來源編碼不同時先解碼並在結果面板說明,輸出一律相同。

相關工具