mlyde 发表于 2021-5-4 20:02

将lrc歌词整体提前或推迟

本帖最后由 mlyde 于 2021-5-4 21:55 编辑

将lrc歌词整体提前或推迟

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

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

#### 使用方法
输入要修改的 .lrc 文件名,若不在同一目录下,需输入完整路径,带不带引号均可。
例: `TheStar-阿泱.lrc`,`D:\Desktop\TheStar-阿泱.lrc`,`“D:\Desktop\TheStar-阿泱.lrc”` 等。
输入歌词要提前的时间,单位为秒(s),推迟时间用负数。
例: `1`,`0.5`,`-2` 等。
确认覆盖并保存。

#### 代码

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

# 文件名
filename = ''

# 歌词
lrc = ''

def readfile():
      """ 打开(.lrc)文件并返回文件内容 """
      global filename
      filename = input('filename(.lrc):')
      filename = filename.replace('"', '', 2)      # 将两个"删去
      if os.path.isfile(filename):
                if os.path.exists(filename):
                        # file exists
                        try:
                              with open(filename, 'r', encoding='utf-8') as fp:
                                        return fp.read()
                        except UnicodeDecodeError:
                              print('\a文件编码不支持!')
                              os.system('pause')
                              return 0
                else:
                        # file not exists
                        return 0
      else:
                # not a normal file
                return 0

def change(second):
      """ 修改并写回改变后的内容 """
      global lrc
      # 找到时间标签, 匹配
      timestamp = re.findall('\[({0,3}\:{0,2}\.{0,3})\]', lrc)
      timestamp_n = []
      for i in range(len(timestamp)):
                min = timestamp.split(':')
                second_n = int(min) * 60 + float(min) - second
                if second_n < 0:      # 避免出现负值
                        second_n = 0
                min_n = second_n // 60
                second_n = second_n % 60
                timestamp_n.append(('%02d' % min_n) + ':' + ('%05.2f' % second_n))
                lrc = lrc.replace(timestamp, timestamp_n)
      return lrc

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

def main():
      """ 主函数 """
      global lrc

      # 读取文件
      while True:
                lrc = readfile()
                if not lrc:
                        print('\aNot Found!(文件名为文件夹 或 文件不存在)\n')
                else:
                        break

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

      # 修改lrc
      lrc = change(second)

      # 提示保存
      while True:
                result = input('是否覆盖并保存(Y/N)? ')
                if result == 'Y' or result == 'y':
                        save()
                        break
                if result == 'N' or result == 'n':
                        break

if __name__ == "__main__":
      main()

纸飞机文案 发表于 2021-5-4 21:33

其实这个可以搜索下语句就可以更改下的
按规则来修改就可以了

芽衣 发表于 2021-5-4 21:39

旧版百度音乐有这个歌词编辑器……以前我用百度音乐制作歌词

冰楓丶殘瀷 发表于 2021-5-4 21:39

你先把lrc转ass然后丢进aegisub修改会方便很多

yeqin 发表于 2021-5-5 16:08

很有用的创意!

希望有EXE文件,方便我等不玩python的筒子使用。

mlyde 发表于 2021-5-7 18:41

yeqin 发表于 2021-5-5 16:08
很有用的创意!

希望有EXE文件,方便我等不玩python的筒子使用。
exe的话,编译出来文件有点大,从github上下载吧。
下载Windows命令行程序https://github.com/mlyde/lrc-timetag-change/raw/main/lrc-timetag-change.exe
(用 pyinstaller 编译为exe,大小:6.53MB,无python环境可下载运行)

yeqin 发表于 2021-5-7 19:32

mlyde 发表于 2021-5-7 18:41
exe的话,编译出来文件有点大,从github上下载吧。
下载Windows命令行程序https://github.com/mlyde/lrc ...

已经顺利将相册音乐字幕改变,加了10秒{:1_896:}
页: [1]
查看完整版本: 将lrc歌词整体提前或推迟