如何修复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
相关产品推荐
相关产品推荐

