荣耀之链论坛

 找回密码
 立即注册
搜索
查看: 477|回复: 0

python调整歌词

[复制链接]

1325

主题

2372

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10262
发表于 2023-8-7 16:03 | 显示全部楼层 |阅读模式

  1. # 将.lrc歌词全部提前或推迟, 并以原文件名覆盖保存
  2. import os
  3. import re

  4. # 文件名
  5. filename = ''

  6. # 歌词
  7. lrc = ''

  8. def readfile():
  9.         """ 打开(.lrc)文件并返回文件内容 """
  10.         global filename
  11.         filename = input('filename(.lrc):')
  12.         filename = filename.replace('"', '', 2)        # 将两个"删去
  13.         if os.path.isfile(filename):
  14.                 if os.path.exists(filename):
  15.                         # file exists
  16.                         try:
  17.                                 with open(filename, 'r', encoding='utf-8') as fp:
  18.                                         return fp.read()
  19.                         except UnicodeDecodeError:
  20.                                 print('\a文件编码不支持!')
  21.                                 os.system('pause')
  22.                                 return 0
  23.                 else:
  24.                         # file not exists
  25.                         return 0
  26.         else:
  27.                 # not a normal file
  28.                 return 0

  29. def change(second):
  30.         """ 修改并写回改变后的内容 """
  31.         global lrc
  32.         # 找到时间标签, 匹配 [01:23.456]
  33.         timestamp = re.findall('\[([0-9]{0,3}\:[0-9]{0,2}\.[0-9]{0,3})\]', lrc)
  34.         timestamp_n = []
  35.         for i in range(len(timestamp)):
  36.                 min = timestamp[i].split(':')
  37.                 second_n = int(min[0]) * 60 + float(min[1]) - second
  38.                 if second_n < 0:        # 避免出现负值
  39.                         second_n = 0
  40.                 min_n = second_n // 60
  41.                 second_n = second_n % 60
  42.                 timestamp_n.append(('%02d' % min_n) + ':' + ('%05.2f' % second_n))
  43.                 lrc = lrc.replace(timestamp[i], timestamp_n[i])
  44.         return lrc

  45. def save():
  46.         """ 覆盖保存文件 """
  47.         with open(filename, 'w', encoding='utf-8') as fp:
  48.                 fp.write(lrc)

  49. def main():
  50.         """ 主函数 """
  51.         global lrc

  52.         # 读取文件
  53.         while True:
  54.                 lrc = readfile()
  55.                 if not lrc:
  56.                         print('\aNot Found!  (文件名为文件夹 或 文件不存在)\n')
  57.                 else:
  58.                         break

  59.         # 询问提前时间
  60.         while True:
  61.                 try:
  62.                         second = float(input('输入歌词要提前的时间(s): '))
  63.                         break
  64.                 # 防止输入非数字导致的程序终止
  65.                 except ValueError:
  66.                         print('请输入数字!\n\a')

  67.         # 修改lrc
  68.         lrc = change(second)

  69.         # 提示保存
  70.         while True:
  71.                 result = input('是否覆盖并保存(Y/N)? ')
  72.                 if result == 'Y' or result == 'y':
  73.                         save()
  74.                         break
  75.                 if result == 'N' or result == 'n':
  76.                         break

  77. if __name__ == "__main__":
  78.         main()


复制代码

将lrc歌词整体提前或推迟
说明
使用方法
代码
想把以前下载的一些歌配上歌词,但有的歌词比歌曲整体慢了几秒,一句句手改就太麻烦了,于是写了这个python脚本,顺便练练手,将lrc中的时间标签全部加或减一点儿。(当然,要手动听一下确认要加还是减,加减的幅度)
本来lrc是支持时间补偿的,就是在前面注释的位置加上 [Offset:毫秒数] 就可以,但我的播放器不支持这样,只好改一下时间标签了。

说明
因为是覆盖保存,使用前请备份您要修改的文件。
如果出现文件编码不支持,请将 .lrc 文件以 UTF-8 保存。用记事本打开>文件>另存为>编码,选择 UTF-8 。


使用方法
输入要修改的 .lrc 文件名,若不在同一目录下,需输入完整路径,带不带引号均可。
例: TheStar-阿泱.lrc,D:\Desktop\TheStar-阿泱.lrc,“D:\Desktop\TheStar-阿泱.lrc” 等。
输入歌词要提前的时间,单位为秒(s),推迟时间用负数。
例: 1,0.5,-2 等。
确认覆盖并保存。
————————————————
版权声明:本文为CSDN博主「mlyde」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mlyde/article/details/116402331




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

荣耀之链

GMT+8, 2025-6-17 21:46 , Processed in 0.013345 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表