CSV 转 SMI
或者粘贴字幕文本
这次转换会改变什么
这个方向不会丢失内容 —— 源格式的每一项特性在目标格式里都有地方可去。
这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。
这一页把 CSV 转成 SMI(SAMI)。SAMI 用 <SYNC Start=…> 标记时间点,每条字幕写在它下面的 <P> 里;转换在浏览器里完成,不上传。
一个 SYNC 会替换屏幕上现有的内容,所以每条字幕后面还会跟一个 <P> 的空块,把屏幕清掉——在示例的产物里能看到它成对出现。时间值是整数毫秒,Start=4126 对应 CSV 的 00:00:04.126。
这个方向不丢东西:毫秒、硬换行(写成 <br>)、文字都完整保留。产物按起始时间升序,两行的字幕仍然在同一个 <P> 里,换行处用 <br> 连接;结构外壳是 SAMI 的 HEAD、STYLE 与 BODY。
CSV 的列按表头识别,没有表头时按 start、end、text 顺序读;时间码里没加引号的逗号把一行拆成两列时,转换器会把两半拼回同一个时间码。
产物是 UTF-8、Unix 换行、无 BOM。文件在本机处理,可以批量拖入整季,串行完成后打包下载。
示例
一份典型的 CSV 文件转成 SMI
输入
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."
输出
<SAMI>
<HEAD>
<STYLE TYPE="text/css">
<!--
P { text-align: center; font-family: Arial, sans-serif; }
-->
</STYLE>
</HEAD>
<BODY>
<SYNC Start=1000>
<P>The quick brown fox.
<SYNC Start=3500>
<P>
<SYNC Start=4000>
<P>Jumps over, the lazy dog.
<SYNC Start=6250>
<P>
<SYNC Start=7000>
<P>Two lines here.<br>And a second one.
<SYNC Start=9000>
<P>
</BODY>
</SAMI>
这一方向不丢东西:左右两栏可以逐行对照。
同一转换遇到一份脏文件
输入
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.
输出
<SAMI>
<HEAD>
<STYLE TYPE="text/css">
<!--
P { text-align: center; font-family: Arial, sans-serif; }
-->
</STYLE>
</HEAD>
<BODY>
<SYNC Start=1000>
<P>Hello there, friend.
<SYNC Start=4000>
<P>
<SYNC Start=5000>
<P>Second line.
<SYNC Start=7000>
<P>
<SYNC Start=10000>
<P>End before start.
<SYNC Start=10001>
<P>
<SYNC Start=12000>
<P>Unquoted comma in text, right here.
<SYNC Start=14000>
<P>
</BODY>
</SAMI>
真实文件里常见的损坏:混合换行、散落的空白、留空的字段。可以对照上面那份干净样例,看看解析器能容忍到什么程度。
常见问题
CSV 转 SMI 的产物里,SYNC 与 P 是什么关系?
每个 <SYNC Start=毫秒> 标记一个字幕出现的时刻,紧跟其后的 <P> 放那一屏的文字;这是 SAMI 的时间与内容配对方式。
为什么 CSV 转 SMI 后,每条字幕后面多一个空块?
SAMI 的一条 SYNC 会替换当前屏幕,字幕消失也需要一条指令。产物因此在每条之后写一个 <P> 把屏幕清空,否则上一条会一直留在画面上。
CSV 转 SMI 会丢毫秒吗?
不会。时间写成整数毫秒的 Start 值,00:00:04.126 就是 Start=4126;两侧精度相同,不做四舍五入。
CSV 转 SMI 后,一条两行字幕怎么放?
放在同一个 <P> 里,两行之间用 <br>,这是 SAMI 的硬换行写法;仍然是一条字幕,一起显示。
CSV 转 SMI 之后,再转回 CSV 会丢什么?
会丢样式、定位与格式私有内容。SAMI 能写字体、颜色与对齐,CSV 没有地方放这些;那份清单和去程这一份不同。
CSV 转 SMI 会按什么顺序输出?
按起始时间升序,最早的 SYNC 在前。CSV 原本乱序时,产物会被整理成升序,这是对结构的整理而不是内容改动。