python3脚本调整歌词文件时间戳

news/2024/9/23 9:30:31

场景:截取部分音乐文件,对应歌词的时间要做相应调整。

例如:下方歌词文件,只需要 [00:28] 及以后的内容,而且将第一句 ( [00:28]月光 把天空照亮 )的时间改成 [00:01],那么第二句的时间应该是 [00:06],第三句的时间应该是 [00:12],以此类推 

 

歌词文件中,时间的格式有 [mm:ss] 、[mm:ss:xx] 、[mm:ss:xxx] 

[mm:ss] :这是最基本的时间戳格式,只包含分钟和秒。例如:[03:25] 表示第3分钟25秒。

[mm:ss:xx] :这个格式在分钟和秒的基础上增加了十进制的十分之一秒(即百分之一秒或10毫秒的精度)。例如:[03:25:45] 表示第3分钟25秒450毫秒。

[mm:ss:xxx] :这个格式提供了更高的精度,即毫秒级别的精度。xxx 的取值范围是 000 到 999,直接代表毫秒数。例如:[03:25:450] 也表示第3分钟25秒450毫秒。

 

脚本需要能兼容处理这3种时间格式,处理后的时间统一格式(我统一为[mm:ss:xx])

 1 import re
 2 import argparse
 3 
 4 def adjust_lrc_from_starting_line(lrc_content, starting_line_index, new_starting_time, remove_pre_data=False):  
 5     lines = lrc_content.split('\n')  
 6   
 7     if starting_line_index < len(lines):  
 8         # 编译正则表达式以匹配时间戳  
 9         time_stamp_pattern = re.compile(r"^\[(\d+):(\d+(\.\d+)?)\s*\]")  
10   
11         # 查找并更新起始行的时间戳  
12         start_match = time_stamp_pattern.search(lines[starting_line_index])  
13         if start_match:  
14             start_minutes, start_seconds_str = start_match.groups()[:2]  
15             start_seconds = float(start_seconds_str) if '.' in start_seconds_str else float(start_seconds_str) + 0.00  # 确保秒数有小数部分  
16             new_minutes, new_seconds = map(float, new_starting_time.split(':'))  
17   
18             time_difference = (new_minutes * 60 + new_seconds) - (float(start_minutes) * 60 + start_seconds)  
19   
20             # 更新起始行的时间戳,并确保格式正确  
21             lines[starting_line_index] = time_stamp_pattern.sub(  
22                 f"[{new_minutes:02.0f}:{new_seconds:05.2f}]",  
23                 lines[starting_line_index],  
24                 count=1  
25             )  
26   
27         # 更新后续行的时间戳  
28         for i in range(starting_line_index + 1, len(lines)):  
29             match = time_stamp_pattern.search(lines[i])  
30             if match:  
31                 minutes, seconds_str = match.groups()[:2]  
32                 seconds = float(seconds_str) if '.' in seconds_str else float(seconds_str)  
33                 total_seconds = float(minutes) * 60 + seconds  
34                 adjusted_seconds = total_seconds + time_difference  
35                 adjusted_minutes, adjusted_seconds = divmod(adjusted_seconds, 60)  
36                 adjusted_time_str = f"[{adjusted_minutes:02.0f}:{adjusted_seconds:05.2f}]"  
37   
38                 # 只替换时间戳部分,而不是整行  
39                 prefix, content = lines[i].split(']', 1)  
40                 lines[i] = adjusted_time_str  + content  
41     # 在处理完所有行后,根据remove_pre_data的值决定是否移除起始行之前的数据
42     if remove_pre_data:
43         lines = lines[starting_line_index:]
44     return '\n'.join(lines)  
45 
46 def main():
47     parser = argparse.ArgumentParser(description="Adjust the timestamps in an LRC file starting from a given line.")
48     parser.add_argument("lrc_file", help="Path to the LRC file.")
49     parser.add_argument("starting_line_index", type=int, help="The starting line index (0-based) for adjustment.")
50     parser.add_argument("new_starting_time", help="New timestamp for the starting line, format 'mm:ss.xx'.")
51     parser.add_argument("--remove-pre-data", "-r", action="store_true", help="Remove data before the starting line index.", default=False)
52 
53     args = parser.parse_args()
54 
55     with open(args.lrc_file, 'r', encoding='utf-8') as file:
56         lrc_content = file.read()
57     
58     new_lrc_content = adjust_lrc_from_starting_line(lrc_content, args.starting_line_index, args.new_starting_time, args.remove_pre_data)
59     print(new_lrc_content)
60 
61 if __name__ == "__main__":
62     main()
调整歌词时间.py

脚本的参数:歌词文件路径、起始调整行索引、调整后的时间、是否移除起始调整行之前的数据

使用效果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/31257.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

GPU算子计算与调度技术

GPU算子计算与调度技术 9.4.1 GPU内核驱动分析概述 不同CPU相比,GPU中包含了大量的并行计算单元,适合处理像素,矩阵,坐标等大量同类型的数据,因此,很多LINUX上的应用程序为了能够利用GPU的加速功能,都试图和GPU直接打交道,因此,系统中可能有多个组件或者程序同时使用G…

读人工智能时代与人类未来笔记02_技术变革

读人工智能时代与人类未来笔记02_技术变革1. 目标 1.1. AlphaZero的目标是在遵守规则的前提下赢得国际象棋比赛 1.2. 发现Halicin的人工智能的目标是灭杀尽可能多的致病菌:它在不伤害宿主的情况下灭杀的致病菌越多,就越成功 1.2.1. 人工智能…

Golang初学:高并发时写入数据到不同的map

go version go1.22.1 windows/amd64 Windows 11 + amd64 x86_64 x86_64 GNU/Linux ---序章 多个 给 map 写入数据。 1、基本的map:make(map[any]any) 失败。 2、sync.Map 成功。测试场景: 1K 个 goroutines 给同一个 map 各自写入 1W 数据,总1KW数据。测试#1:普通map 代码:…

Cocos Creator 3.8.x 透明带滚动功能的容器

ScrollView 是一种带滚动功能的容器 1、删除ScrollView下Sprite组件的SpriteFrame 2、ScrollView下scrollBar的Sprite组件的Color设为:FFFFFF00 3、ScrollView下view的Graphics组件的FillColor设为:FFFFFF00

TACO编译器张量与科学计算SpMV

TACO编译器张量与科学计算SpMV 定义张量 声明张量 taco::Tensor对象,对应于数学张量,构成了taco C++API的核心。可以通过指定新张量的名称、包含张量每个维度大小的向量,以及将用于存储张量的存储格式来声明新张量: // Declare a new tensor "A" of double-preci…

让创意在幻觉中肆虐: 认识Illusion Diffusion AI

人工智能新境界在不断发展的人工智能领域,一款非凡的新工具应运而生,它能将普通照片转化为绚丽的艺术品。敬请关注Illusion Diffusion,这是一个将现实与想象力完美融合的AI驱动平台,可创造出迷人的视错觉和超现实意境。 AI算法的魔力所在Illusion Diffusion 的核心是借助先进的…

nfs服务器安装

安装NFS服务 sudo apt-get update sudo apt install nfs-kernel-server检查服务支持的版本 sudo cat /proc/fs/nfsd/versions上面显示支持3/4/4.1/4.2版本,并不支持2版本,在比较新的ubuntu系统上面已经不支持2版本了,如果在挂载nfs服务时相关挂载的版本比较旧时,需要增加参…

自定义bmp图像缩放及在lcd显示屏任意位置显示

在LCD上任意位置显示一张任意大小并且宽高变为原来1/n大小的色深为 24bit的bmp图片 头文件 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <…