跳到主要内容
SubtitleMatrix

CSV 转 TTML

或者粘贴字幕文本

这次转换会改变什么

这个方向不会丢失内容 —— 源格式的每一项特性在目标格式里都有地方可去。

这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。

这一页把 CSV 转成 TTML。TTML 是 XML,每条字幕是一个 <p> 元素,起止写在 begin 与 end 属性里;转换在浏览器里完成,不上传。

这个方向不丢东西。CSV 与 TTML 都把时间写成 00:00:04.126 这种形状,转换时字符一级不变,不四舍五入也不平移。硬换行写成 <br/>,同一条字幕的两行仍然留在同一个 <p> 里。

产物是一份带 XML 声明、tt 根元素与 body 的文档,按起始时间升序。CSV 中的毫秒值在 TTML 里仍是同一个串,所以把产物与源表逐条核对时,时间码应当能一一对上。

CSV 的列按表头识别:start、end、text 可以写成 begin、finish、content 之类的别名,没有表头时按前三列顺序读。被时间码里的逗号拆开的行会自动拼回,所以表格软件导出的脏数据也能读。

输出是 UTF-8、Unix 换行、无 BOM。文件在本机处理,可以整季批量拖入,串行完成后打包下载。

示例

一份典型的 CSV 文件转成 TTML

输入

start,end,text
00:00:01.000,00:00:03.500,The quick brown fox.
00:00:04.000,00:00:06.250,"Jumps over, the lazy dog."
00:00:07.000,00:00:09.000,"Two lines here.
And a second one."

输出

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling">
  <body>
<p begin="00:00:01.000" end="00:00:03.500">The quick brown fox.</p>
<p begin="00:00:04.000" end="00:00:06.250">Jumps over, the lazy dog.</p>
<p begin="00:00:07.000" end="00:00:09.000">Two lines here.<br/>And a second one.</p>  </body>
</tt>

这一方向不丢东西:左右两栏可以逐行对照。

同一转换遇到一份脏文件

输入

id,start,end,note,text
1,00:00:01,000,00:00:04,000,cue one,"Hello there, friend."
2,00:00:05.000,00:00:07.000,cue two,Second line.
bad,notatime,00:00:09.000,cue three,Unreadable start.
4,00:00:10.000,00:00:09.000,cue four,End before start.
5,00:00:12.000,00:00:14.000,cue five,Unquoted comma in text, right here.

输出

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling">
  <body>
<p begin="00:00:01.000" end="00:00:04.000">Hello there, friend.</p>
<p begin="00:00:05.000" end="00:00:07.000">Second line.</p>
<p begin="00:00:10.000" end="00:00:10.001">End before start.</p>
<p begin="00:00:12.000" end="00:00:14.000">Unquoted comma in text, right here.</p>  </body>
</tt>

真实文件里常见的损坏:混合换行、散落的空白、留空的字段。可以对照上面那份干净样例,看看解析器能容忍到什么程度。

常见问题

CSV 转 TTML 的产物是什么结构?

带 XML 声明的 tt 文档,正文在 body 里,每条字幕是一个 <p begin=… end=…>;时间用 00:00:04.126 这种形状写在属性里,不再有单独的时间行。

CSV 转 TTML 会改时间码的写法吗?

不会。两边都写成 00:00:04.126,转换只负责搬位置,不重排数字;输出与输入的时间串逐字符相同。

CSV 转 TTML 后,一条两行字幕怎么放?

放在同一个 <p> 里,两行之间用 <br/>,这是 TTML 的硬换行写法;仍然是一条字幕。

CSV 转 TTML 会按起始时间排序吗?

会,最早的在前。TTML 的 p 元素按文档顺序出现,播放器按这个顺序读;CSV 乱序时产物会被整理。

CSV 转 TTML 之后,再转回 CSV 会丢什么?

会丢样式、定位与格式私有内容,因为 CSV 只有时间与文字两栏。CSV 转 TTML 这一趟本身不丢东西,代价要到回程才出现。

CSV 转 TTML 的输出编码是什么?

UTF-8、Unix 换行、无 BOM。输入若是 UTF-16 或 Windows 单字节编码,会先解码再写进 XML,结果面板会说明这次解码。

相关工具