Ernestpneug 发表于 4 天前

必剪软件字幕提取工具

应 ak360 建议,加了一种格式



必剪字幕提取工具.zip(247.8 KB, 下载次数: 393)2025-4-11 11:30 上传
点击文件名下载附件












------------------------------------------------------------------------老板看中个演讲视频,想把里面的内容提取成文本,百度了一下,发现哔哩上有个软件,但是要收费,
所以有了这个软件,无非是json的解析,技术难度不大,希望能给同样需求的伙伴提供些帮助


转换精度有限,取决必剪,不过大部分还可以,稍加改动即可.

1.使用必剪软件识别字幕

2.看下草稿的保存路径

3.到相应文件夹下,找到字幕文件

4.随便选择个比较大的文件,拖入软件进行转换

寒哥Gh61ac8 发表于 4 天前

为啥没反应

寒哥Gh61ac8 发表于 4 天前

问了DS,他给了这段代码,测试一下很好用,给需要的朋友。

import os
import json
from datetime import datetime

def find_target_json():
    base_dir = r"C:\Users\174501259\Documents\Bcut Drafts"
    target_files = []
   
    for root, dirs, files in os.walk(base_dir):
      for file in files:
            if file.lower().endswith(".json") and file.lower() != "draftinfo.json":
                full_path = os.path.join(root, file)
                mtime = os.path.getmtime(full_path)
                size = os.path.getsize(full_path)
                target_files.append((full_path, mtime, size))
   
    if not target_files:
      return None

    # 按修改时间降序和文件大小降序排序
    target_files.sort(key=lambda x: (-x, -x))
    return target_files

def parse_subtitles(json_path):
    with open(json_path, 'r', encoding='utf-8') as f:
      data = json.load(f)
   
    subtitles = []
    for track in data.get('tracks', []):
      if track.get('BTrackType') == 0:# 只处理字幕轨道
            for clip in track.get('clips', []):
                asset = clip.get('AssetInfo', {})
                content = asset.get('content', '')
                in_point = clip.get('inPoint', 0)
                duration = clip.get('duration', 0)
               
                # 假设时间单位为毫秒
                start = in_point
                end = in_point + duration
               
                subtitles.append({
                  'start': start,
                  'end': end,
                  'content': content
                })
   
    # 按开始时间排序
    subtitles.sort(key=lambda x: x['start'])
    return subtitles

def ms_to_srt_time(ms):
    hours = ms // 3600000
    ms %= 3600000
    minutes = ms // 60000
    ms %= 60000
    seconds = ms // 1000
    milliseconds = ms % 1000
    return f"{hours:02d}:{minutes:02d}:{seconds:02d},{milliseconds:03d}"

def create_srt(subtitles):
    srt_content = []
    for i, sub in enumerate(subtitles, 1):
      start = ms_to_srt_time(sub['start'])
      end = ms_to_srt_time(sub['end'])
      srt_content.append(f"{i}\n{start} --> {end}\n{sub['content']}\n")
   
    return "\n".join(srt_content)

def main():
    if os.path.exists("subtitles.srt"):
      return
   
    json_path = find_target_json()
    if not json_path:
      return
   
    subtitles = parse_subtitles(json_path)
    if not subtitles:
      return
   
    srt_content = create_srt(subtitles)
    with open("subtitles.srt", 'w', encoding='utf-8-sig') as f:
      f.write(srt_content)

if __name__ == "__main__":
    main()

寒哥Gh61ac8 发表于 4 天前

下载学习下,感谢分享

风之影赫 发表于 4 天前

感谢分享

huoxianghui913 发表于 4 天前

我记得剪映也有,也是免费提取和导出,现在也是收费了?

风之影赫 发表于 4 天前

很不错的提取字幕软件,感谢分享

风之影赫 发表于 4 天前

能加上时间吗

huoxianghui913 发表于 4 天前

剪映没用过不太清楚

风之影赫 发表于 4 天前

有加时间的选项啊
页: [1] 2
查看完整版本: 必剪软件字幕提取工具