HBTech's Blog
把外文歌词和翻译歌词合并

效果如图

https://hbtech.oss-cn-shenzhen.aliyuncs.com/blog/TIM截图20180826200119.png

访问 http://tools.hbtech.ml/music/ 即可体验。

开发经过

第一次有这个想法的时候,觉得实现这个应该很简单,想了一个(伪)流程图:

开始 -> 获取外文、翻译歌词 -> 分别正则匹配外文翻译、歌词的时间标签,歌词内容 -> 循环判断时间标签是否相等,如果相等把两者连接 -> 输出

如果外文和翻译歌词是一一对应的,即每一行外文歌词都有对应的翻译,那么按这个流程下来,理论上是能得到合并歌词的。事实也证明这个方案确实可行,但在处理网易云音乐的一些歌词的时候出了岔子,因为有些歌词的外文和翻译并非一一对应。

下面给出一些这类歌词的例子。

Faded
https://hbtech.oss-cn-shenzhen.aliyuncs.com/blog/faded.png
如图所示,在外文歌词中,开头的两行作曲、作词的内容在这里以两行歌词的形式来显示了。这无可厚非,的确也是常规操作,但这两行内容占用了外文歌词中的两个时间标签,在翻译中却没有这两个时间标签,这便会导致程序出错。也就是说,当外文与翻译歌词行数的不一致时,就无法正常合并。

与之类似的还有:

Way Back Into Love
https://hbtech.oss-cn-shenzhen.aliyuncs.com/blog/waybackintolove.png
这首歌的英文歌词中出现了空行,翻译却没有也用空行来占行。

对于以上这种情况,我想到的解决方法是,针对外文和翻译歌词使用两个不同的循环变量,将外文与翻译分成两部分进行循环判断。当有一部分与另一部分时间标签对应不上时,该部分的循环变量会 +1 ,再继续判断。

Soldier
https://hbtech.oss-cn-shenzhen.aliyuncs.com/blog/Soldier.png
中文翻译有一个“哇哦”,英文歌词中却没有。歌曲中确实唱有这一句,但英文歌词中却没有写出来,这就导致出错了。

Meet
https://hbtech.oss-cn-shenzhen.aliyuncs.com/blog/meet.png
这个和上面所说的错误类型不太一样,就是时间标签混乱,连网易云音乐客户端都出现错误(如下图),暂时无解。

https://hbtech.oss-cn-shenzhen.aliyuncs.com/blog/Screenshot_2018-07-21-13-11-43-550_com.netease.cl_.jpg

只能说网易太不上心了……

That Girl
https://hbtech.oss-cn-shenzhen.aliyuncs.com/blog/thatgirl.png
当我看到这个时间标签,只想把网易云的人打一顿,英文和中文翻译的歌词时间标签完全不一致!已经乱套了……

遇到这种情况,只能忽略掉时间标签,将行数相同的合并。

上面提到的的这些问题不仅仅是个例,这样例子还有很多,就不一一列举了。

总而言之,为了这些辣鸡歌词,本来好好的20+的代码就可以实现的功能,硬是写成了130+行,但目前仍有少数歌曲的歌词做不到自动合并。目前想到了个万能的合并算法,但还没写成代码。

与网易云相比,TX音乐的歌词就显得友好了许多。例如上面说到的当在外文歌词中含有作词、作曲等内容时,在网易云中会导致外文与翻译歌词行数的不一致,但在TX音乐中,它使用了两条斜杠占位:
https://hbtech.oss-cn-shenzhen.aliyuncs.com/blog/tx.png
所以在对网易云音乐的各种奇葩歌词做了兼容后,在合并TX音乐的提供的歌词时,基本就没遇到什么问题了。

下一步的工作

目前这个歌词合并应用在了我搭建的在线播放器下,下一步打算应用到更多的地方,例如:

  • 外文、翻译及合并后的 .lrc 歌词(批量)下载
  • 做一个“歌词自动排版工具 (LyricPress) ”(名称暂定)

参考资料

https://segmentfault.com/a/1190000003603737
https://github.com/mengkunsoft/MKOnlineMusicPlayer

其他

今晚就要开学了,从此开启真·高三生活。 估计整个高三也不会有多少时间打理博客,写写代码了。最后还是 念两句诗 给自己送一副对联:

看今日寒窗苦读埋首书案
待他朝蟾宫折桂一飞冲天

HBTech's Blog

把外文歌词和翻译歌词合并
效果如图 访问 http://tools.hbtech.ml/music/ 即可体验。 开发经过 第一次有这个想法的时候,觉得实现这个应该很简单,想了一个(伪)流程图: 开始 -> 获取外文、翻…
扫描二维码继续阅读
2018-07-21