YouTube 视频下载 + 中英双语字幕
目的
下载 YouTube 视频(含字幕),将破碎的自动字幕校对、重排为规范字幕,翻译成中文,
最终交付:①硬字幕版(字幕烧进画面)②软字幕版(多轨可切换,画质无损)③独立 SRT 文件。
环境准备
按顺序检测,缺什么装什么(pip 装包需用户批准沙箱豁免):
- yt-dlp:
<受管python envs>/Scripts/yt-dlp.exe。未安装则
<受管python>/python.exe -m pip install -U yt-dlp(装进受管 venv,勿用全局 pip)。
受管 Python 位于~/.workbuddy/binaries/python/versions/<ver>/,venv 在envs/default。 - ffmpeg:无需单独安装,
pip install imageio-ffmpeg后用其自带静态 ffmpeg:
python -c "import imageio_ffmpeg; print(imageio_ffmpeg.get_ffmpeg_exe())" - JS 运行时:新版 yt-dlp 需
--js-runtimes node(受管 Node),否则部分格式缺失并警告。 - 中文字体:烧录中文字幕用系统字体
Microsoft YaHei(Windows 自带),
通过fontsdir+force_style指定,见下文命令模板。
步骤
1. 下载视频 + 自动字幕
yt-dlp --no-playlist --js-runtimes node \
--write-auto-subs --sub-langs "en-orig,en" --sub-format srt \
--ffmpeg-location <ffmpeg路径> \
-f "bv*[ext=mp4][height<=1080]+ba[ext=m4a]/b[ext=mp4][height<=1080]/bv*[height<=1080]+ba/b" \
--merge-output-format mp4 -o "%(title)s.%(ext)s" "<URL>"
- 必须限制
height<=1080:4K 片源文件巨大且烧录极慢(AV1 软解+x264 4K 编码,4 分钟视频约 17 分钟)。仅当用户明确要求 4K 时解除限制。 - 用户网络无法直连 YouTube 时提示其开代理。
- 下载完成后先
ffprobe(或 ffmpeg -i)确认分辨率/时长,再决定后续参数。
2. 校对自动字幕(关键步骤,不可跳过)
YouTube 自动字幕 cue 互相重叠、句子被切碎、专名识别错误多。必须:
1. 读取原始 srt,按 cue 时间顺序合并还原成完整句子。
2. 按句子边界重新分配时间:句首=c首条 cue 起点,句尾=下句起点(最后一句用视频时长)。
3. 修正专名误识别(医学术语高发,常见错误见 references/mistranscriptions.md;
其他领域同样先怀疑专有名词被音译错,结合上下文和领域知识推断)。
4. 用规范译文翻译成中文(术语按领域标准译名)。
5. 产出三份 SRT(UTF-8 无 BOM):<名>_en.srt、<名>_zh.srt、<名>_bilingual.srt。
双语合并直接运行 scripts/merge_srt.py en.srt zh.srt -o bilingual.srt
(要求两条 srt cue 数与时间轴一致,先写 en/zh 再合并)。
3. 软字幕版(画质无损,三轨可切换)
ffmpeg -i 输入.mp4 -i bi.srt -i en.srt -i zh.srt \
-map 0:v -map 0:a -map 1 -map 2 -map 3 \
-c:v copy -c:a copy -c:s mov_text \
-metadata:s:s:0 language=chi -metadata:s:s:0 title="双语 Bilingual" \
-metadata:s:s:1 language=eng -metadata:s:s:1 title="English" \
-metadata:s:s:2 language=chi -metadata:s:s:2 title="中文" 软字幕版.mp4
4. 硬字幕版(任何播放器可见)
ffmpeg -i 输入.mp4 \
-vf "subtitles=<bilingual.srt>:fontsdir='C\:/Windows/Fonts':force_style='FontName=Microsoft YaHei,FontSize=16,PrimaryColour=&H00FFFFFF,OutlineColour=&H80000000,Outline=1,MarginV=18'" \
-c:v libx264 -crf 22 -preset veryfast -c:a copy 硬字幕版.mp4
- 滤镜字符串内 Windows 盘符冒号必须转义:
C\:/Windows/Fonts。 - 字号按视频分辨率调:480p≈14,1080p≈16,4K≈22。
- 4K/长视频用 run_in_background 执行,避免超时。
- 若烧录非中英语言,换成对应语言的系统字体。
5. 验证 + 清理
- 必须抽帧验证:
ffmpeg -ss <视频中段> -i 硬字幕版.mp4 -frames:v 1 check.png,
用 Read 查看图片,确认双行字幕齐全、中文无乱码/豆腐块。 - 删除中间文件(yt-dlp 的 .fXXX.mp4/.m4a 分轨、原始自动 srt、check.png),保留原片和全部交付物。
- 注意(Windows):沙箱内删除会失败;rm 参数用
C:/Users/...形式的绝对路径并申请沙箱豁免,
相对路径会被安全删除钩子拒绝。
交付
按优先级 present_files:硬字幕版 → 软字幕版 → 三个 SRT。原片保留不删。
告知用户:硬字幕版任何设备可见;软字幕版在 PotPlayer/VLC 等播放器中可切换字幕轨。