跳到主要内容
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;源文件若是 UTF-16 或 Windows 单字节编码会先解码。批量串行、可取消、ZIP 打包,全程在浏览器里,不上传。

示例

一份典型的 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>`;已经丢掉的东西补不回来。

相关工具