通过同步转录文本与视频画面分析YouTube视频,生成详细摘要、分步指南及内容解析。
YouTube视频分析器-Multimodule. 此技能通过两个信息频道对YouTube视频进行深入分析:.是一项面向实际任务的技能,主要用于Audio频道:带有时间戳的转写(什么是SAID).;Visual chan.。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
该技能通过双信息通道对 YouTube 视频执行深度分析:
大多数 YouTube 相关技能仅提取字幕文本。本技能通过将视觉帧与语音内容同步弥补了这一缺口,从而可生成准确的分步操作指南——例如,“点击右上角的蓝色按钮”这一指令,将严格匹配实际截图中对应按钮的位置。
YouTube URL
|
+---> 1. 获取元数据(标题、时长、视频 ID)
|
+---> 2. 提取字幕(yt-dlp --dump-json + curl)
| -> 带时间戳的字幕片段
|
+---> 3. 提取帧(yt-dlp + ffmpeg)
| -> 按策略性时间间隔提取关键帧
|
+---> 4. 同步帧 <-> 字幕
| -> 基于时间戳将帧匹配至对应语音内容
|
+---> 5. 多模态分析
-> 逐帧读取图像,并结合字幕文本进行联合理解
-> 生成结构化输出
VIDEO_URL="" WORK_DIR=$(mktemp -d /tmp/yt-analysis-XXXXXX) mkdir -p "$WORK_DIR/frames"
yt-dlp --print title --print duration --print id "$VIDEO_URL" 2>/dev/null
该命令返回三行内容:标题、以秒为单位的时长、视频 ID。请保存这些值供后续使用。
重要提示:通过 --write-sub 直接下载字幕常触发 YouTube 限流(HTTP 429 错误)。请改用以下可靠两步法。
yt-dlp --dump-json "$VIDEO_URL" 2>/dev/null | python3 -c "
import json, sys
data = json.load(sys.stdin)
auto = data.get('automatic_captions', {})
subs = data.get('subtitles', {})
# 优先级:人工字幕 > 自动字幕;优先匹配用户语言,依次降级。
for source in [subs, auto]:
for lang in ['en', 'de', 'en-orig', 'fr', 'es']:
if lang in source:
for fmt in source[lang]:
if fmt.get('ext') == 'json3':
print(fmt['url'])
sys.exit(0)
# 降级方案:取首个可用自动字幕,提取其 json3 URL
for lang in sorted(auto.keys()):
for fmt in auto[lang]:
if fmt.get('ext') == 'json3':
url = fmt['url']
# 移除翻译参数,还原原始语言
import re
url = re.sub(r'&tlang=[^&]+', '', url)
print(url)
sys.exit(0)
print('NO_SUBS', file=sys.stderr)
sys.exit(1)
" > "$WORK_DIR/sub_url.txt"
curl -s "$(cat "$WORK_DIR/sub_url.txt")" -o "$WORK_DIR/transcript.json3"
验证其是否为有效 JSON(而非 HTML 错误页):
head -c 20 "$WORK_DIR/transcript.json3"
# 应以 { 开头;若以
步骤 3c:将 json3 解析为可读的时间戳字幕片段
python3 -c "
import json
with open('$WORK_DIR/transcript.json3') as f:
data = json.load(f)
for event in data.get('events', []):
segs = event.get('segs', [])
if not segs:
continue
start_ms = event.get('tStartMs', 0)
duration_ms = event.get('dDurationMs', 0)
text = ''.join(s.get('utf8', '') for s in segs).strip()
if not text or text == 'n':
continue
s = start_ms / 1000
e = (start_ms + duration_ms) / 1000
print(f'[{int(s//60):02d}:{int(s%60):02d} - {int(e//60):02d}:{int(e%60):02d}] {text}')
" > "$WORK_DIR/transcript.txt"
查看 $WORK_DIR/transcript.txt 即可获得带时间戳的完整字幕文本。
降级方案:无任何字幕可用
若视频完全无字幕,请告知用户,并继续执行纯视觉分析。
步骤 4:下载视频并提取帧
步骤 4a:下载视频(720p 已足够用于帧分析)
yt-dlp -f "bestvideo[height<=720]+bestaudio/best[height<=720]"
-o "$WORK_DIR/video.mp4" "$VIDEO_URL"
步骤 4b:获取精确时长
DURATION=$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 "$WORK_DIR/video.mp4")
步骤 4c:采用自适应时间间隔策略提取帧
根据视频时长选择间隔:
| 时长 | 间隔 | 约提取帧数 | 依据 |
|---|---|---|---|
| < 5 分钟 | 10 秒 | 20–30 | 密度足够支撑细节分析 |
| 5–20 分钟 | 20 秒 | 15–60 | 覆盖率与数据量的良好平衡 |
| 20–60 分钟 | 30–45 秒 | 30–120 | 聚焦关键节点 |
| > 60 分钟 | 60 秒 | 60–120+ | 询问用户是否希望聚焦特定时间段或章节 |
# 示例:针对 5–20 分钟视频(间隔=20 秒) ffmpeg -i "$WORK_DIR/video.mp4" -vf "fps=1/20" -q:v 3 "$WORK_DIR/frames/frame_%04d.jpg" 2>&1
针对场景变化检测(软件教程、UI 演示):
ffmpeg -i "$WORK_DIR/video.mp4"
-vf "select='gt(scene,0.3)',showinfo"
-vsync vfr -q:v 3 "$WORK_DIR/frames/scene_%04d.jpg" 2>&1
对于固定间隔提取:第 N 帧的时间戳为 (N-1) * 间隔 秒。
frame_0001.jpg -> 0:00 frame_0002.jpg -> 0:20 frame_0003.jpg -> 0:40 ...
对每个已提取的帧执行以下操作:
{timestamp, transcript_text, frame_path}此过程可通过人工判断或简单查表完成,无需额外脚本。
使用 Read 工具(或 view 工具)查看每张帧图像。对每帧需关注:
对每个关键节点,整合音频与视觉内容:
片段 [TIMESTAMP]:
SAID: “点击右上角的蓝色按钮”
SHOWN: 设置页面截图,右上角高亮显示蓝色 “Save” 按钮,
鼠标光标正指向该按钮
SYNTHESIS: -> 在设置页面中,点击右上角的蓝色 “Save” 按钮
标记视觉通道提供但音频未提及的信息点:
根据用户请求生成相应格式:
# [视频标题] — 操作指南 ## 步骤 1:[操作](00:15) [基于字幕与帧分析生成的描述] > 视觉:[该时刻屏幕/图像所呈现的内容] ## 步骤 2:[操作](00:42) [...]
# [视频标题] — 摘要 ## 概述 [2–3 句概括整段视频核心内容] ## 关键章节 ### [章节名称](00:00 – 02:30) [本章节摘要] - 关键视觉:[画面内容描述] - 关键引述:“[重要语音内容]” ### [章节名称](02:30 – 05:00) [...] ## 核心要点 - [要点 1] - [要点 2]
分别分析双通道,并检测不一致项:
# [视频标题] — 技术分析 ## 音频通道分析 [语音内容、关键点、逻辑结构] ## 视觉通道分析 [画面内容、UI 流程、代码、图表] ## 通道同步分析 [音频与视觉互补的具体位置] ## 纯视觉信息 [仅在帧中可见、语音未提及的重要细节]
| 问题 | 解决方案 |
|---|---|
| 字幕下载返回 HTTP 429 | 使用 --dump-json 方法(步骤 3a);若 curl 亦被拦截,等待 10–15 秒后重试,并更换 User-Agent |
| 完全无字幕可用 | 继续纯视觉分析,并通知用户 |
| 原始音频语言未出现在自动字幕列表中 | 原始语言即为源语言——自动字幕均为翻译结果;从任意自动字幕 URL 中移除 &tlang=XX 参数即可还原原始语言 |
transcript.json3 内容为 HTML 而非 JSON |
YouTube 返回了错误页。等待 10 秒后重试: curl -s --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" "$URL" |
| 视频时长 > 60 分钟 | 询问用户是否希望聚焦特定时间段或章节 |
| 视频质量差 / 帧模糊 | 缩短帧提取间隔,增加帧数以补偿 |
| 视频受年龄限制或设为私密 | 告知用户无法访问该视频;如用户有权限,建议使用 --cookies-from-browser |
| yt-dlp 下载失败 | 尝试替代格式:-f "best[height<=720]"(不分离音视频流) |
分析完成后,删除临时文件:
rm -rf "$WORK_DIR"