SPL 格式(Salt Player Lyrics)语法标准
制定时间:2024 年 12 月 16 日
修订时间:2024 年 12 月 26 日
制定作者:不要糖醋放椒盐
前言
Salt Player 歌词格式(简称“SPL”),基于且兼容(增强型)LRC,一种阅读友好的歌词格式。
为什么选择 SPL?
- LRC 格式拥有极多的使用用户,SPL 兼容 LRC,并在此基础上对多年来遇到的多种兼容性问题进行了适配,拥有优秀的兼容性。
- LRC/SPL 非常简单,对人类阅读友好,时间戳为分、秒、毫秒格式,加上歌词文本,没有过多标记字符,使得在极简文本编辑器/编辑框中也可以非常方便地编辑。
- LRC/SPL 极简的标记格式拥有强大的表现力,占用的字符空间也更少。
- SPL SPL 在对适配各种兼容性问题的解决方案上将它们视为一种“语法糖”,并进行标准化,对编辑更加友好方便,同时也是本标准的意义。
时间戳
时间戳名词在互联网不同的使用场景有多种解释。在本文中,时间戳代表记录时间的文本标记,由分、秒和毫秒组成,并使用 [
和 ]
符号包裹,格式示例:
[05:20.22]你好椒盐音乐
其中 [05:20.22]
便是一个时间戳,表示 5 分 20 秒 220 毫秒,分和秒之间由 :
(半角冒号)分隔,秒和毫秒间由 .
(半角句号)分割,这和日常书写习惯一致。
分、秒和毫秒的数字规范
换算:1 分等于 60 秒,1 秒等于 1000 毫秒。
分限制 1 至 3 位数字,如 1
、02
、103
都是支持的写法。
秒限制 1 至 2 位数字,如 1
、02
、13
都是支持的写法。
毫秒限制 1 至 6 位数字,如 1
、02
、130
、450000
都是支持的写法。不足 3 位的写法将视为在后位省略了 0
,如 1
将视为 100
、02
将视为 020
,分别对应 100 毫秒和 20 毫秒,而非 1 毫秒和 2 毫秒。
综合示例,正确写法(//
后是注释):
[103:3.405] // 表示 103 分 3 秒 405 毫秒、
[3:12.5] // 表示 3 分 12 秒 500 毫秒
错误写法:
(103:3.405) // 错误的时间戳包裹符号 `(`、`)`
[3:102.5] // 秒部分超出限制位数
歌词行
一句歌词由时间戳和时间戳后接文本组成,如:
[05:20.22]你好椒盐音乐
表示这是一句从 5 分 20 秒 220 毫秒开始的歌词,歌词内容是 你好椒盐音乐
。
显式行结尾
在一句的歌词最后添加时间戳将视为歌词的结尾时间,如:
[05:20.22]你好椒盐音乐[05:21.22]
表示此句歌词从 5 分 20 秒 220 毫秒开始到 5 分 21 秒 220 毫秒结束,共持续 1 秒。
也可换行标记,如:
[05:20.22]你好椒盐音乐
[05:21.22]
和上一种写法一样,注意第二行时间戳后不接任何文本内容。
隐式行结尾
如果未在歌词行后标记歌词结束时间,这句歌词将一直持续直到下一句歌词开始,如:
[05:20.22]你好椒盐音乐
[05:22.22]天天开心
第一句歌词将视为 5 分 20 秒 220 毫秒开始到 5 分 22 秒 220 毫秒结束,结束时间为下一行的开始时间。
重复行
如果一句歌词重复在歌曲中出现,可以使用多时间戳的方式简写,如:
[05:20.22]你好椒盐音乐
[05:30.22]你好椒盐音乐
可简写为:
[05:20.22][05:30.22]你好椒盐音乐
歌词翻译
翻译识别
翻译依靠同时间戳识别,在前的一句为主歌词文本,后的一句为翻译歌词文本,如:
[05:20.22]你好椒盐音乐
[05:20.22]Hello Salt Player
其中 Hello Salt Player
是 你好椒盐音乐
的翻译文本,两句可以不紧挨着,但须保证翻译歌词在主歌词之后。
在 SPL 中也可省略翻译文本时间戳,如:
[05:20.22]你好椒盐音乐
Hello Salt Player
但 Hello Salt Player
必须紧挨着主歌词句子,若:
[05:20.22]你好椒盐音乐
[05:21.22]不要糖醋放椒盐
Hello Salt Player
Hello Salt Player
将被视为 [05:21.22]不要糖醋放椒盐
的翻译文本。
多行翻译
SPL 标准支持多行翻译,
[05:20.22]你好椒盐音乐
Hello Salt Player
こんにちは Salt Player
逐字歌词
逐字歌词是可以争对一行歌词内的文本进行更精确的时间控制,不局限于对每个字符都精确控制,也可以是词组或者其他一部分,如:
[05:20.22]你好椒盐音乐
歌词中如果 你好
两个字持续 3 秒而 椒盐音乐
四个字持续 1 秒,这时候行歌词并不能精确的表现,便需要一种方法指定行内的更精确的时间标记。
逐字标记时间戳
逐字歌词和行歌词的时间戳逻辑差别不大,如上方提到的需求可以写成:
[05:20.22]你好[05:23.22]椒盐音乐[05:24.22]
[05:20.22]
到 [05:23.22]
的间隔为 3 秒,[05:23.22]
到 [05:24.22]
的间隔为 1 秒。
其中 [05:20.22]
依旧是行开始时间戳同时也是开始逐字标记时间戳,因为它位于句首,而 [05:23.22] 是中间的一个逐字标记时间戳,用以分隔 你好
和 椒盐音乐
,最后的 [05:24.22]
是行结束时间戳同时也是结束逐字标记时间戳。
逐字标记时间戳需要递增,如果出现时间戳不在行开始时间和结束时间间或者小于之前的时间戳,那么此逐字标记时间戳会被忽略。
局限性
[05:20.22][05:30.22]你好[05:23.22]椒盐音乐[05:24.22]
将被视为:
[05:20.22]你好[05:23.22]椒盐音乐[05:24.22]
[05:30.22]你好[05:23.22]椒盐音乐[05:24.22]
其中第一行正常而第二行逐字标记时间戳存在顺序错误而被忽略,所以在使用逐字标记建议不使用重复行特性。
兼容性与延迟逐字标记
非开始逐字标记和结束逐字标记时间戳可以使用 <
和 >
符号包裹,如:
[05:20.22]你好[05:23.22]椒盐音乐[05:24.22]
可写成:
[05:20.22]你好<05:23.22>椒盐音乐[05:24.22]
这带来一种特性(但不推荐使用),可以实现歌词行到达而首字未开始,如:
[05:20.22]<05:21.22>你好<05:23.22>椒盐音乐[05:24.22]
表示这句歌词从 5 分 20 秒 220 毫秒开始,但是到 5 分 21 秒 220 毫秒才到 你好
这部分,可以在 Salt Player 中实现歌词跳转到当前行但未真正开始播放的特性。