通过 yt-dlp 可以区分以下两类字幕:
-
上传字幕:位于
subtitles字段中,通常由作者、频道或内容提供方提供; -
自动生成字幕:位于
automatic_captions字段中,由 YouTube 自动语音识别或自动翻译生成;
注意:存在上传字幕并不代表字幕一定由作者手工制作。
例如,部分新闻视频的字幕可能来自节目源自带的 Closed Captions。
测试视频
有上传字幕:
https://www.youtube.com/watch?v=7ARBJQn6QkM
无上传字幕:
https://www.youtube.com/watch?v=SS5uEinPunc查看字幕列表
yt-dlp \
--js-runtimes node \
--list-subs \
"https://www.youtube.com/watch?v=7ARBJQn6QkM"--list-subs 会分别输出:
Available automatic captions for ...和:
Available subtitles for ...前者是自动生成字幕,后者是上传字幕。
当输出中出现:
[info] Available subtitles for 7ARBJQn6QkM:
Language Name Formats
en English vtt, srt, ttml, srv3, srv2, srv1, json3表示该视频存在语言代码为 en 的上传字幕。
当输出中出现:
SS5uEinPunc has no subtitles表示该视频不存在上传字幕。
这不代表视频一定没有自动生成字幕;自动字幕需要查看 Available automatic captions 部分。
JavaScript 运行时
参数:
--js-runtimes node表示允许 yt-dlp 使用 Node.js 执行 YouTube 的 JavaScript challenge solver。
使用该参数前,需要保证系统已安装兼容版本的 Node.js:
node --version也可以使用其他受 yt-dlp 支持的 JavaScript 运行时。例如,已安装 Bun 时可以使用:
--js-runtimes bun某些情况下不指定 --js-runtimes 仍然可以获取视频信息,但可能出现格式或功能缺失,因此不建议将其作为长期配置。
使用 jq 判断
--list-subs 可能输出大量自动生成和自动翻译字幕。需要在脚本中判断时,推荐读取 yt-dlp 输出的 JSON,而不是解析终端日志。
安装 jq
macOS:
brew install jq判断是否存在上传字幕
yt-dlp \
--js-runtimes node \
--skip-download \
--dump-single-json \
"https://www.youtube.com/watch?v=7ARBJQn6QkM" \
| jq -r '
if ((.subtitles // {}) | length) > 0 then
"有上传字幕:" + ((.subtitles | keys) | join(", "))
else
"没有上传字幕"
end
'可能输出:
有上传字幕:en这里读取的是:
subtitles而不是:
automatic_captions因此不会将 YouTube 自动生成或自动翻译的字幕误判为上传字幕。
使用 grep 判断
临时在 Shell 中检查时,也可以匹配 --list-subs 的输出:
output=$(
yt-dlp \
--js-runtimes node \
--list-subs \
"https://www.youtube.com/watch?v=7ARBJQn6QkM" \
2>&1
)
if echo "$output" | grep -q "Available subtitles for"; then
echo "有上传字幕"
else
echo "没有上传字幕"
fi这种方式依赖 yt-dlp 的终端输出文案,适合临时检查,不建议作为长期工作流的核心判断逻辑。
长期使用时,应优先解析 --dump-single-json 返回的 subtitles 字段。
创建自定义命令
可以将判断逻辑封装为一个全局可用的 Shell 命令。
创建脚本
创建文件:
~/MyFiles/bin/has-youtube-subs内容如下:
#!/usr/bin/env bash
set -euo pipefail
if [[ $# -ne 1 ]]; then
echo "用法:has-youtube-subs <YouTube URL>" >&2
exit 1
fi
yt-dlp \
--js-runtimes node \
--skip-download \
--dump-single-json \
"$1" \
| jq -r '
if ((.subtitles // {}) | length) > 0 then
"有上传字幕:" + ((.subtitles | keys) | join(", "))
else
"没有上传字幕"
end
'增加执行权限
chmod +x ~/MyFiles/bin/has-youtube-subs将脚本目录加入 PATH
打开:
vim ~/.zshrc增加:
export PATH="$HOME/MyFiles/bin:$PATH"使配置立即生效:
source ~/.zshrc执行命令
has-youtube-subs \
"https://www.youtube.com/watch?v=7ARBJQn6QkM"输出:
有上传字幕:en该命令加入 PATH 后,可以在任意目录中执行。
在 YouTube 网页中判断
打开视频播放器,依次点击:
Settings(齿轮)
→ Subtitles/CC出现:
English通常表示该轨道不是 YouTube 自动生成字幕。
出现:
English (auto-generated)则明确表示该字幕由 YouTube 的自动语音识别系统生成。
需要注意:
English只能说明它不是标记为 auto-generated 的字幕轨道,不能据此断定字幕一定由视频作者手工制作。