Flamingo 的 TTML 逐字歌词:span 标签逐字计时
TTML 的逐字能力由 <p> 内的 <span> 子元素实现——这是它比 LRC 逐字写法更结构化的地方。
逐字计时的写法
<p begin="12.000" end="14.000">
<span begin="12.000" end="12.500">你</span>
<span begin="12.500" end="13.000">好</span>
</p>
- 外层
<p>的 begin/end 定整行起止。 - 每个
<span>的 begin/end 定单个字的起止。 - 逐字高亮与逐字上浮动画都以 span 时间为准,不认其他时间。
与翻译行叠加
翻译由 itunes key 机制挂在同一行上(而不是 LRC 那样重复时间戳),逐字与翻译互不干扰:
<p begin="12.000" end="14.000" itunes:key="L1">
<span begin="12.000" end="12.500">你</span>
<span begin="12.500" end="13.000">好</span>
</p>
<translations>
<translation type="subtitle" xml:lang="zh-CN">
<text for="L1">你好</text>
</translation>
</translations>
完整规则见TTML 翻译与音译。
对唱标记
多歌手对唱用 ttm:agent 属性标记:
<p begin="12.000" end="14.000" ttm:agent="v2">这一句二号歌手唱</p>
不同 agent 的行在歌词页会有区分排版,效果见歌词显示效果。
从 LRC 迁移的注意点
- LRC 逐字用的是行内小标签,TTML 是嵌套结构——用转换工具迁移时检查每个 span 的起止是否闭合。
- span 的时间必须在父级
<p>的时间范围内,超界行为未定义。 - 转换后若逐字效果丢失,优先确认文件是合法 XML(标签全小写、属性带引号),再确认 span 时间连续。
官方歌词格式文档在 GitHub 仓库的 docs 目录里,遇到本文未覆盖的边角案例可以查阅原文,以官方最新版为准。