提取剪映字幕为srt
本帖最后由 felixzhao1111 于 2021-12-25 21:14 编辑目前仅支持Windows平台2.5.1以及之前版本的剪映
主要功能是可以配合剪映的识别字幕功能
将剪映最后一次打开的项目中的字幕转换为srt字幕并保存
# -*- coding: utf-8 -*-
"""
本程序基于Python3编写,已适配2.5.1版本剪映
"""
from getpass import getuser
from os import path, walk
from json import load
from re import compile
# 自定义srt字幕的保存路径包括文件名
SAVE_FILE_PATH = '剪映提取字幕.srt'
def _formatting_time(time_int):
# 使用正则表达式处理时间格式化问题
if time_int == 0:
return '00:00:00,000'
p = compile(r'(\d*)(\d{3})\d{3}')
res = p.findall(str(time_int))
if res == '':
hms = '00:00:00'
else:
h = 0
m = 0
s = int(res)
while s >= 60:
m += 1
s -= 60
while m >= 60:
h += 1
m -= 60
while h >= 24:
exit('暂不支持超过24小时的字幕文件转换')
hms = ':'.join((str(h).zfill(2), str(m).zfill(2), str(s).zfill(2)))
return ','.join((hms, res))
def formatting_time(start, end):
# 拼接时间格式化后的字符串
return ' --> '.join((_formatting_time(start), _formatting_time(end)))
def main():
# 取得电脑的用户名,用来获取剪映缓存文件夹的绝对路径
username = getuser()
# 拼接出剪映缓存文件夹的绝对路径
jy_cache_path = f'C:/Users/{username}/AppData/Local/JianyingPro/User Data/Projects/com.lveditor.draft'
# 拿到最后一次打开的项目文件信息(内含字幕信息)
info_file_path = ''
if path.exists(jy_cache_path):
tup = walk(jy_cache_path)
for dirpath, dirnames, filenames in tup:
if 'root_meta_info.json' in filenames:
info_file_path = f'{jy_cache_path}/root_meta_info.json'
elif 'root_draft_meta_info.json' in filenames:
info_file_path = f'{jy_cache_path}/root_draft_meta_info.json'
if info_file_path:
with open(info_file_path, 'r', encoding='utf-8') as f:
sub_file_path = (load(f)['all_draft_store']['draft_fold_path'])
# 打开json文件并将其转换为srt文件
if path.exists(sub_file_path):
with open(f'{sub_file_path}/draft_content.json', 'r', encoding='utf-8') as f:
sub_file_json = load(f)
time_list = []
content_list = []
for i in sub_file_json['tracks']['segments']:
start_time = int(i['target_timerange']['start'])
end_time = int(i['target_timerange']['start'] + i['target_timerange']['duration'])
time_list.append(formatting_time(start_time, end_time))
for i in sub_file_json['materials']['texts']:
content_list.append(i['content'])
index = 0
# 保存字幕信息到文件中
with open(SAVE_FILE_PATH, 'w', encoding='utf-8') as srt:
while index < len(time_list):
srt.write(f'{index + 1}\n{time_list}\n{content_list}\n\n')
index += 1
if __name__ == '__main__':
main()
weliong 发表于 2021-12-25 13:29
论坛里 之前好像见过类似的功能 而且已经有成型软件了。。。
本来就几行代码的事情没必要做成一个软件,那些软件不给你看源代码,除了提取字幕你能保证他不做其他的事情吗,这个东西发出来就是为了学习交流的目的 本帖最后由 yjn866y 于 2022-1-2 11:50 编辑
lxf906 发表于 2021-12-25 20:49
FileNotFoundError: No such file or directory: 'C:/Users/Administrator/AppData/Local/Jianyi ...可能是程序没提取到文件,,也可能是,你还没有使用剪映提取字幕,因些没有文件,
你可以看一下下面的路径对不对,里面有没有文件,
没有话就去运行剪映,提取一下字幕,有文件了就不会报错了
红字的路径要改成你自己的用户名
C:/Users/Administrator(这里换成你自己的用户名)/AppData/Local/JianyingPro/User Data/Projects/com.lveditor.draft/202112252031\\draft_content.json' 论坛里 之前好像见过类似的功能 而且已经有成型软件了。。。 谢谢楼主 IndexError: list index out of range
大佬 报错了 xyz52pojie 发表于 2021-12-25 13:57
IndexError: list index out of range
大佬 报错了
稍等我看看 xyz52pojie 发表于 2021-12-25 13:57
IndexError: list index out of range
大佬 报错了
我这边没有报错,你重新扒一下代码吧,我有些小修改 FileNotFoundError: No such file or directory: 'C:/Users/Administrator/AppData/Local/JianyingPro/User Data/Projects/com.lveditor.draft/202112252031\\draft_content.json'
大佬报错! lxf906 发表于 2021-12-25 20:49
FileNotFoundError: No such file or directory: 'C:/Users/Administrator/AppData/Local/Jianyi ...
有可能是路径拼接的函数有问题,我改了一下代码直接拼接字符串,晚点审核过了你再扒一遍试试 不错,确实有人做出了软件,但楼主放出代码也非常好啊