felixzhao1111 发表于 2021-12-25 11:55

提取剪映字幕为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()

felixzhao1111 发表于 2021-12-25 21:18

weliong 发表于 2021-12-25 13:29
论坛里 之前好像见过类似的功能 而且已经有成型软件了。。。

本来就几行代码的事情没必要做成一个软件,那些软件不给你看源代码,除了提取字幕你能保证他不做其他的事情吗,这个东西发出来就是为了学习交流的目的

yjn866y 发表于 2022-1-2 11:46

本帖最后由 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'

weliong 发表于 2021-12-25 13:29

论坛里 之前好像见过类似的功能 而且已经有成型软件了。。。

xyz52pojie 发表于 2021-12-25 13:37

谢谢楼主

xyz52pojie 发表于 2021-12-25 13:57

IndexError: list index out of range
大佬 报错了

felixzhao1111 发表于 2021-12-25 18:36

xyz52pojie 发表于 2021-12-25 13:57
IndexError: list index out of range
大佬 报错了

稍等我看看

felixzhao1111 发表于 2021-12-25 19:17

xyz52pojie 发表于 2021-12-25 13:57
IndexError: list index out of range
大佬 报错了

我这边没有报错,你重新扒一下代码吧,我有些小修改

lxf906 发表于 2021-12-25 20:49

FileNotFoundError: No such file or directory: 'C:/Users/Administrator/AppData/Local/JianyingPro/User Data/Projects/com.lveditor.draft/202112252031\\draft_content.json'

大佬报错!

felixzhao1111 发表于 2021-12-25 21:16

lxf906 发表于 2021-12-25 20:49
FileNotFoundError: No such file or directory: 'C:/Users/Administrator/AppData/Local/Jianyi ...

有可能是路径拼接的函数有问题,我改了一下代码直接拼接字符串,晚点审核过了你再扒一遍试试

xiaozhuge 发表于 2021-12-26 12:11

不错,确实有人做出了软件,但楼主放出代码也非常好啊
页: [1] 2 3
查看完整版本: 提取剪映字幕为srt