cvsa/ml/lab/whisperAlignment/srt2lrc.py
alikia2x 636c5e25cb
ref: move ML stuff
add: .idea to VCS, the refactor guide
2025-03-29 14:13:15 +08:00

49 lines
1.5 KiB
Python

import pysrt
def parseTime(object):
return object.hours * 3600 + object.minutes * 60 + object.seconds + object.milliseconds / 1000
def serializeTime(time):
minutes = int(time / 60)
seconds = int(time % 60)
milliseconds = int((time - int(time)) * 1000)
return f"{minutes:02d}:{seconds:02d}.{milliseconds:03d}"
def srt2lrc(lyrics, srt_file, lrc_file, time_offset=0):
subs = pysrt.open(srt_file, encoding='utf-8')
# 加载歌词并按行分割
lyrics_lines = lyrics.splitlines()
# 初始化
aligned_lines = []
current_line = ""
start_time = None
# 遍历 SRT 的每一项
for sub in subs:
word = sub.text.strip()
if not current_line:
start_time = parseTime(sub.start) # 记录行的开始时间
current_line += word
# 如果当前行匹配到歌词中的一行
if lyrics_lines and current_line == lyrics_lines[0]:
end_time = parseTime(sub.end) # 记录行的结束时间
aligned_lines.append(f"[{serializeTime(start_time+time_offset)}] {current_line}\n[{serializeTime(end_time+time_offset)}]")
# 移除已匹配的歌词行并重置
lyrics_lines.pop(0)
current_line = ""
start_time = None
result = []
# 后处理,只留下最后一行的结束时间
for i in range(len(aligned_lines) - 1):
result.append(aligned_lines[i].split('\n')[0])
result.append(aligned_lines[-1])
with open(lrc_file, 'w') as f:
f.write('\n'.join(result))