我有一个包含视频字幕的 ttml 文件,我想通过所有对 time\caption 获取并将它们放入 JSON 文件中,我尝试过https://www.npmjs.com/package/ttml?activeTab=readme但是它没有用这个。有任何想法吗 ?谢谢
2 回答
尝试查看https://github.com/sandflow/imscJS以获取提取中间同步文档 (ISD) 的代码 - 例如文件 isd.js 可能是相关的。
顺便说一句,值得注意的是,TTML 中的数据模型并不完全符合时间对和单个字幕之间映射的想法。你可能会得到重复。
每个 ISD 是时间线上两个时刻之间的快照,其中呈现的内容不会改变。
这是一个重要的区别,因为在 TTML 中,有时可能会出现相同的“标题”与出现和消失的其他标题重叠,例如:
...
<div begin="10s" end="20s">
<p>This text appears at 10s and disappears by 20s</p>
<p end="5s">This text appears at 10s and disappears by 15s</p>
<p begin="5s">This text appears at 15s and disappears by 20s</p>
</div>
...
所以 ISD 的结果是:
0->10s [无]
10s->15s
此文本在 10 秒出现并在 20 秒后消失
此文本在 10 秒出现并在 15 秒后消失
15s->20s
此文本在 10 秒出现并在 20 秒后消失
此文本在 15 秒出现并在 20 秒后消失
20 多岁-> [无]
如您所见,第一行出现在两个 ISD 中。当然,这取决于您在应用程序中如何处理这个问题。
对于喜欢 Python 的人来说,ttconv可以将 TTML/IMSC 文档拆分为一系列中间同步文档 (ISD),每个中间同步文档 (ISD) 对应于 TTML/IMSC 文档内容是静态的一段时间。
import ttconv.imsc.reader
import ttconv.isd
import xml.etree.ElementTree as et
tt_doc = """<?xml version="1.0" encoding="UTF-8"?>
<tt xml:lang="fr" xmlns="http://www.w3.org/ns/ttml">
<body>
<div>
<p begin="1s" end="2s">Hello</p>
<p begin="3s" end="4s">Bonjour</p>
</div>
</body>
</tt>"""
m = ttconv.imsc.reader.to_model(et.ElementTree(et.fromstring(tt_doc)))
st = ttconv.isd.ISD.significant_times(m)
for t in st:
isd = ttconv.isd.ISD.from_model(m, t)
# convert ISD to JSON
ttconv还支持从 TTML/IMSC 到SRT的转换,这是一种简单的基于文本的格式。但是,所有样式信息都丢失了。
tt.py convert -i <input .ttml file> -o <output .srt file> --otype SRT --itype TTML