效果如图

访问 http://tools.hbte.ch/music/ 即可体验。
开发经过
第一次有这个想法的时候,觉得实现这个应该很简单,想了一个(伪)流程图:
开始 -> 获取外文、翻译歌词 -> 分别正则匹配外文翻译、歌词的时间标签,歌词内容 -> 循环判断时间标签是否相等,如果相等把两者连接 -> 输出
如果外文和翻译歌词是一一对应的,即每一行外文歌词都有对应的翻译,那么按这个流程下来,理论上是能得到合并歌词的。事实也证明这个方案确实可行,但在处理网易云音乐的一些歌词的时候出了岔子,因为有些歌词的外文和翻译并非一一对应。
下面给出一些这类歌词的例子。
Faded
如图所示,在外文歌词中,开头的两行作曲、作词的内容在这里以两行歌词的形式来显示了。这无可厚非,的确也是常规操作,但这两行内容占用了外文歌词中的两个时间标签,在翻译中却没有这两个时间标签,这便会导致程序出错。也就是说,当外文与翻译歌词行数的不一致时,就无法正常合并。
与之类似的还有:
Way Back Into Love
这首歌的英文歌词中出现了空行,翻译却没有也用空行来占行。
对于以上这种情况,我想到的解决方法是,针对外文和翻译歌词使用两个不同的循环变量,将外文与翻译分成两部分进行循环判断。当有一部分与另一部分时间标签对应不上时,该部分的循环变量会 +1 ,再继续判断。
Soldier
中文翻译有一个“哇哦”,英文歌词中却没有。歌曲中确实唱有这一句,但英文歌词中却没有写出来,这就导致出错了。
Meet
这个和上面所说的错误类型不太一样,就是时间标签混乱,连网易云音乐客户端都出现错误(如下图),暂时无解。

只能说网易太不上心了……
That Girl
当我看到这个时间标签,只想把网易云的人打一顿,英文和中文翻译的歌词时间标签完全不一致!已经乱套了……
遇到这种情况,只能忽略掉时间标签,将行数相同的合并。
上面提到的的这些问题不仅仅是个例,这样例子还有很多,就不一一列举了。
总而言之,为了这些辣鸡歌词,本来好好的20+的代码就可以实现的功能,硬是写成了130+行,但目前仍有少数歌曲的歌词做不到自动合并。目前想到了个万能的合并算法,但还没写成代码。
与网易云相比,TX音乐的歌词就显得友好了许多。例如上面说到的当在外文歌词中含有作词、作曲等内容时,在网易云中会导致外文与翻译歌词行数的不一致,但在TX音乐中,它使用了两条斜杠占位:
所以在对网易云音乐的各种奇葩歌词做了兼容后,在合并TX音乐的提供的歌词时,基本就没遇到什么问题了。
下一步的工作
目前这个歌词合并应用在了我搭建的在线播放器下,下一步打算应用到更多的地方,例如:
- 外文、翻译及合并后的 .lrc 歌词(批量)下载
- 做一个“歌词自动排版工具 (LyricPress) ”(名称暂定)
参考资料
https://segmentfault.com/a/1190000003603737
https://github.com/mengkunsoft/MKOnlineMusicPlayer
其他
今晚就要开学了,从此开启真·高三生活。 估计整个高三也不会有多少时间打理博客,写写代码了。