上一个开发阶段《Android获取歌词汇总》实现了获取歌词的功能。
现在着手解析歌词。
一、目标
选择合适的歌词格式。
二、歌词格式
- 歌词形式
形式 | 描述 |
---|---|
逐行歌词 | 早期的歌词形式,以行为单位显示歌词,类似于字幕。 |
逐字歌词 | 卡拉OK形式的歌词,精确到每个字。 |
- 歌词组成
歌词按行进行排序,每一行以[
开始,以]
结束。
组成 | 描述 |
---|---|
属性 | 用于描述歌词的信息,比如: ti:标题 ar:艺术家 language:酷狗音乐的翻译歌词 ……等其他信息,并且以 : 分隔名值。 |
歌词 | 以数字开始的内容,有2种格式分别对应逐行歌词和逐字歌词。 [mi:se.mmm]:逐行歌词,分钟:秒数:毫秒数 [begin,duration]:逐字歌词,开始毫秒数,持续毫秒数 需要注意的是,一行中可以包含多个时间戳。 |
文本 | 不包含: 分割符的属性,出现在酷狗音乐的翻译歌词部分。 |
- 翻译歌词
针对外文歌词(如英语、日语、……等)翻译成中文歌词。
翻译歌词通常为逐行形式的歌词(可能也只能逐行吧)。
翻译歌词有2种形式。
形式 | 描述 |
---|---|
有时间戳 | 与逐行歌词一致,带有时间戳,可以独立使用。 网易云音乐使用该种形式。 |
无时间戳 | 没有时间戳,以文本形式存在,必须配合逐行歌词使用,按索引位置一一对应。 酷狗音乐使用该形式。 |
三、歌词容器
歌词格式描述的是歌词内容的语法结构。
歌词容器描述的是歌词文件的存储结构。
不同的云音乐平台采用的歌词容器也不相同。
同一个云音乐平台,不同的使用场景,采用的歌词容器也不相同。
音乐平台 | 使用场景 | 描述 |
---|---|---|
网易云音乐 | Android离线歌词 | 同时包行逐行、逐字、翻译三种形式歌词,但是可选。 纯音乐歌曲,不存在歌词。 |
Android在线歌词 | 与离线歌词一致,但组织方式略有差别。 | |
酷狗音乐 | Android离线歌词 | krc形式,包含逐字和翻译歌词,同样为可选。 目前没有发现逐行歌词。 猜想逐行和逐字为二选一,不会同时存在krc文件中。 |
Android在线歌词 | krc格式,包含在json数据中。 |
四、回顾
歌词格式相对比较固定,无论是网易云音乐还是酷狗音乐,语法结构都比较固定。
麻烦的是歌词容器的结构,不同音乐平台采用的结构都不尽相同。
同一音乐平台也会有多种存储结构。
五、接下来
不同的歌词容器需要不同的加载器。
不同的歌词格式需要不同的解析器。
需要编写一堆的加载器和解析器,然后输出为统一的数据格式。
六、遗留问题
将不同的歌词容器统一成单一的歌词容词。
还是保持分散呢?
虽然不能减少编写加载器和解析器的工作量。
但至少文件格式是一致的,未来不需要查找各家的歌词容器结构。
未来或许有必要统一一下,可以降低代码管理的成本。
导入歌词时,使用原生格式。
加载歌词时,转换成标准格式。
七、Finally
何以故。
须菩提。
一切诸佛。及诸佛阿耨多罗三藐三菩提法。
皆从此经出。