You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复youtube-dl下载的混乱YouTube自动字幕.vtt文件?

解决YouTube自动字幕下载后VTT格式混乱的问题

一、直接下载正确分段的自动字幕(推荐)

youtube-dl已停止维护,改用yt-dlp(youtube-dl的活跃分支,支持更多YouTube字幕特性),可直接获取带正常时间轴的自动字幕:

命令行操作

先安装yt-dlp(如pip install yt-dlp),执行以下命令:

yt-dlp --write-auto-sub --sub-format vtt/srt/best https://www.youtube.com/watch?v=Roc89oOZOF4&list=PLJBo3iyb1U0eNNN4Dij3N-d0rCJpMyAKQ&index=45

参数说明:

  • --write-auto-sub:触发自动生成字幕的下载
  • --sub-format vtt/srt/best:指定字幕格式,best会自动选择YouTube提供的分段式字幕(而非带内联时间的混乱版本)
  • 若仅需字幕无需视频,添加--skip-download参数即可

二、修复已下载的混乱VTT文件

如果已经拿到带内联时间标签的混乱VTT,可通过以下方法转换为正常分段格式:

Python脚本解析

这个脚本会提取内联时间标签,将文本拆分为对应时间轴的独立条目:

import re

def fix_malformed_vtt(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 匹配时间轴行和内联时间标签
    timeline_re = re.compile(r'(\d{2}:\d{2}:\d{2}\.\d{3}) --> (\d{2}:\d{2}:\d{2}\.\d{3})')
    inline_time_re = re.compile(r'<(\d{2}:\d{2}:\d{2}\.\d{3})><c>(.*?)</c>')
    
    output_lines = ["WEBVTT\n"]
    current_start, current_end = None, None
    segments = []
    
    for line in content.splitlines():
        line = line.strip()
        # 处理时间轴行
        timeline_match = timeline_re.match(line)
        if timeline_match:
            # 先写入上一组已解析的片段
            if segments and current_start:
                output_lines.append(f"{current_start} --> {current_end}")
                output_lines.append(' '.join([seg['text'] for seg in segments]))
                output_lines.append('')
            current_start, current_end = timeline_match.groups()
            segments = []
            continue
        # 处理带内联时间的文本行
        if current_start:
            # 提取所有内联时间和文本
            matches = inline_time_re.findall(line)
            if matches:
                prev_time = current_start
                for time, text in matches:
                    text = text.strip()
                    if text:
                        segments.append({'start': prev_time, 'text': text})
                        prev_time = time
                # 处理最后一段文本到时间轴结束
                last_text = inline_time_re.sub('', line).strip()
                if last_text:
                    segments.append({'text': last_text})
    
    # 写入最后一组片段
    if segments and current_start:
        output_lines.append(f"{current_start} --> {current_end}")
        output_lines.append(' '.join([seg['text'] for seg in segments]))
    
    # 保存修复后的文件
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write('\n'.join(output_lines))

# 使用示例
fix_malformed_vtt("混乱字幕.vtt", "修复后字幕.vtt")

FFmpeg转换

用FFmpeg直接转换格式,自动清理内联标记:

ffmpeg -i 混乱字幕.vtt -c:s webvtt 修复后字幕.vtt

注意:部分FFmpeg版本对复杂内联时间的处理效果可能不稳定,优先推荐Python脚本方案。

专用工具清理

使用vttclean(轻量VTT清理工具),安装后执行:

vttclean 混乱字幕.vtt 修复后字幕.vtt

该工具会自动移除内联格式标签和冗余时间标记,生成标准分段VTT。

内容的提问来源于stack exchange,提问作者perry_the_python

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:31:11