watch-video
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese/watch-video — Transcribe and analyze any video at the depth you choose
/watch-video — 按你选择的深度转录并分析任意视频
Replaces and broadens the prior skill. YouTube is now one of many sources; depth is user-controlled.
youtube-transcript替代并扩展了之前的技能。YouTube现在只是众多数据源之一,处理深度由用户自主控制。
youtube-transcriptStep 1 — Parse input
步骤1 — 解析输入
Accept:
- YouTube: full URL, ,
youtu.be/<id>, raw 11-char IDyoutube.com/shorts/<id> - Loom: or
loom.com/share/<id>loom.com/embed/<id> - Vimeo:
vimeo.com/<id> - Riverside: download URL or local file
- Zoom: local from a downloaded recording
.mp4 - X / IG / TikTok video: URL — defers to for metadata, uses yt-dlp for the file
social-fetch - Local file: any path to an /
.mp4/.mov/.webm.mkv
Detect source from URL pattern or file extension. If ambiguous, ask.
支持以下来源:
- YouTube:完整URL、、
youtu.be/<id>、11位原始IDyoutube.com/shorts/<id> - Loom:或
loom.com/share/<id>loom.com/embed/<id> - Vimeo:
vimeo.com/<id> - Riverside:下载URL或本地文件
- Zoom:下载后的本地录制文件
.mp4 - X / IG / TikTok视频:URL — 委托获取元数据,使用yt-dlp获取视频文件
social-fetch - 本地文件:任意/
.mp4/.mov/.webm格式的文件路径.mkv
通过URL模式或文件扩展名检测来源。若存在歧义,则询问用户确认。
Step 2 — Parse depth mode
步骤2 — 解析深度模式
| Invocation | Mode | What you get |
|---|---|---|
| transcript (default) | Clean text, metadata, optional chapters |
| transcript | Same as default |
| visual | Transcript + frames at intervals + Claude vision pass identifying key moments |
| multimodal | Native video to Gemini (if |
If the depth isn't specified and the video is >10 minutes, ask before defaulting (visual/multimodal cost real money on long videos).
| 调用指令 | 模式 | 输出内容 |
|---|---|---|
| transcript(默认) | 清晰文本、元数据、可选章节信息 |
| transcript | 与默认模式一致 |
| visual | 转录内容+定时提取帧+Claude视觉分析识别关键瞬间 |
| multimodal | 原生视频接入Gemini(若已设置 |
若未指定深度模式且视频时长超过10分钟,将在默认前询问用户(视觉/多模态模式处理长视频会产生实际费用)。
Step 3 — Pull metadata
步骤3 — 获取元数据
For URL sources, use yt-dlp:
bash
yt-dlp --print "%(title)s|%(uploader)s|%(duration_string)s|%(upload_date>%Y-%m-%d)s|%(description)s" \
--print "%(chapters)j" --skip-download "<url>"Capture: title, uploader/channel, duration, upload date, description (first paragraph), chapters (JSON or null).
For local files, use ffprobe:
bash
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "<file>"对于URL来源,使用yt-dlp:
bash
yt-dlp --print "%(title)s|%(uploader)s|%(duration_string)s|%(upload_date>%Y-%m-%d)s|%(description)s" \
--print "%(chapters)j" --skip-download "<url>"捕获信息:标题、上传者/频道、时长、上传日期、描述(第一段)、章节(JSON格式或空值)。
对于本地文件,使用ffprobe:
bash
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "<file>"Step 4 — Build workdir
步骤4 — 创建工作目录
~/Documents/videos/<source>-<slug>-<date>/Where:
- :
source/youtube/loom/vimeo/riverside/zoomlocal - : kebab-case of title (first 4–6 words, max 50 chars)
slug - :
dateYYYY-MM-DD
~/Documents/videos/<source>-<slug>-<date>/其中:
- :
source/youtube/loom/vimeo/riverside/zoomlocal - : 标题的短横线命名格式(取前4-6个词,最多50字符)
slug - :
dateYYYY-MM-DD
Step 5 — Get the transcript
步骤5 — 获取转录内容
Backend selection (in order):
-
Platform-provided transcript if it exists and looks complete:
- YouTube:
yt-dlp --write-sub --write-auto-sub --skip-download --sub-lang en --sub-format vtt - Loom: fetch via page metadata or Loom API if
https://www.loom.com/share/<id>set$LOOM_API_KEY - Riverside: built-in transcripts available on the recording's share page
- If platform transcript exists and has timestamps, use it. Skip Whisper.
- YouTube:
-
MLX-Whisper local (default fallback — fast on Mac M-series):bash
# Install once: pip install mlx-whisper python3 -c "import mlx_whisper; mlx_whisper.transcribe('<file>', path_or_hf_repo='mlx-community/whisper-large-v3-turbo')" \ > "<workdir>/transcript-raw.json"Or via the CLI:mlx_whisper <file> --model mlx-community/whisper-large-v3-turbo --output-dir <workdir> -
whisper.cpp (further fallback if MLX unavailable)
Download the video file first if it's a URL (use yt-dlp; Loom/Vimeo/YT all supported):
bash
yt-dlp -f "bv*[height<=720]+ba/b[height<=720]" -o "<workdir>/video.%(ext)s" "<url>"720p is plenty for transcription and frame analysis (smaller download, faster processing).
Clean the transcript (only needed for YouTube auto-subs which have rolling captions; Whisper output is already clean):
bash
undefined后端选择顺序:
-
平台提供的转录内容(若存在且完整):
- YouTube:
yt-dlp --write-sub --write-auto-sub --skip-download --sub-lang en --sub-format vtt - Loom: 通过页面元数据获取,若已设置
https://www.loom.com/share/<id>则使用Loom API$LOOM_API_KEY - Riverside: 录制分享页面提供内置转录内容
- 若平台转录内容存在且带时间戳,则直接使用,跳过Whisper。
- YouTube:
-
本地MLX-Whisper(默认备选方案——在Mac M系列设备上速度极快):bash
# 安装一次:pip install mlx-whisper python3 -c "import mlx_whisper; mlx_whisper.transcribe('<file>', path_or_hf_repo='mlx-community/whisper-large-v3-turbo')" \ > "<workdir>/transcript-raw.json"或通过CLI执行:mlx_whisper <file> --model mlx-community/whisper-large-v3-turbo --output-dir <workdir> -
whisper.cpp(若MLX不可用则进一步备选)
若为URL来源,先下载视频文件(使用yt-dlp;支持Loom/Vimeo/YT等平台):
bash
yt-dlp -f "bv*[height<=720]+ba/b[height<=720]" -o "<workdir>/video.%(ext)s" "<url>"720p分辨率足以满足转录和帧分析需求(下载体积更小,处理速度更快)。
清理转录内容(仅针对YouTube自动字幕,其为滚动字幕;Whisper输出已为清晰格式):
bash
undefinedYouTube VTT cleanup — de-dup rolling captions, strip tags, paragraph-break on cue gaps >2s
YouTube VTT清理 — 去重滚动字幕、移除标签、在间隔超过2秒的字幕段间添加段落分隔
awk '
/^WEBVTT/ || /^Kind:/ || /^Language:/ || /^NOTE/ { next }
/-->/ { in_cue = 1; last = ""; next }
/^$/ { if (last) print last; in_cue = 0; last = ""; next }
in_cue { gsub(/<[^>]+>/, "", $0); last = $0 }
END { if (last) print last }
' "<workdir>/transcript.en.vtt" | awk '!seen[$0]++' > "<workdir>/transcript.txt"
Save final to `<workdir>/transcript.txt`.awk '
/^WEBVTT/ || /^Kind:/ || /^Language:/ || /^NOTE/ { next }
/-->/ { in_cue = 1; last = ""; next }
/^$/ { if (last) print last; in_cue = 0; last = ""; next }
in_cue { gsub(/<[^>]+>/, "", $0); last = $0 }
END { if (last) print last }
' "<workdir>/transcript.en.vtt" | awk '!seen[$0]++' > "<workdir>/transcript.txt"
将最终结果保存至`<workdir>/transcript.txt`。Step 6 — If transcript
mode: stop here
transcript步骤6 — 若为transcript
模式:到此结束
transcriptOutput:
transcript.txtmetadata.json- One-line summary in chat: title, source, duration, word count
- Path to workdir
- (Optional) Step 9 — offer to capture to second-brain
输出内容:
transcript.txtmetadata.json- 聊天窗口中的单行摘要:标题、来源、时长、字数
- 工作目录路径
- (可选)步骤9 — 提供保存至second-brain的选项
Step 7 — If visual
mode: extract frames + vision pass
visual步骤7 — 若为visual
模式:提取帧+视觉分析
visualFrame extraction (ffmpeg)
帧提取(ffmpeg)
Cadence by source heuristic:
| Source type | Frame cadence |
|---|---|
| Screen-share / Loom / demo | 1 frame per 5s (UI changes fast) |
| Talking head / podcast | 1 frame per 30s (slow change) |
| Slide presentation | 1 frame per 10s + force a frame on each detected scene change |
| Default if unsure | 1 frame per 15s |
bash
mkdir -p "<workdir>/frames"
ffmpeg -i "<workdir>/video.mp4" -vf "fps=1/15" "<workdir>/frames/frame-%04d.png" -yFor scene-change detection (slide decks especially):
bash
ffmpeg -i "<workdir>/video.mp4" -vf "select='gt(scene,0.3)',showinfo" -vsync vfr "<workdir>/frames/scene-%04d.png" 2> "<workdir>/scene-detection.log"根据来源类型设置提取频率:
| 来源类型 | 帧提取频率 |
|---|---|
| 屏幕共享 / Loom / 演示视频 | 每5秒1帧(UI变化快) |
| 单人讲话 / 播客 | 每30秒1帧(变化慢) |
| 幻灯片演示 | 每10秒1帧 + 检测到场景变化时强制提取1帧 |
| 不确定时默认 | 每15秒1帧 |
bash
mkdir -p "<workdir>/frames"
ffmpeg -i "<workdir>/video.mp4" -vf "fps=1/15" "<workdir>/frames/frame-%04d.png" -y针对场景变化检测(尤其适用于幻灯片):
bash
ffmpeg -i "<workdir>/video.mp4" -vf "select='gt(scene,0.3)',showinfo" -vsync vfr "<workdir>/frames/scene-%04d.png" 2> "<workdir>/scene-detection.log"Vision pass
视觉分析
Pair each frame with the transcript chunk for the same timestamp window. Then batch-send to Claude vision for synthesis.
Per-frame batch prompt (up to ~10 frames per call):
Here are N frames from a video at timestamps T1..TN. For each frame, describe what's on screen in 1–2 sentences. Flag: (a) UI changes from previous frame, (b) text visible on screen, (c) any moment that looks like a decision, action, or notable event. Also note the transcript text spoken during this window.
Save the output as :
<workdir>/moments.mdmarkdown
undefined将每一帧与对应时间窗口的转录片段配对,批量发送至Claude vision进行合成分析。
每帧批量提示(每次调用最多约10帧):
以下是视频在时间戳T1..TN的N帧画面。请为每一帧用1-2句话描述屏幕内容,并标记:(a) 与上一帧相比的UI变化,(b) 屏幕上可见的文字,(c) 任何看起来是决策、动作或重要事件的瞬间。同时记录该时间窗口内的转录文本。
将输出保存为:
<workdir>/moments.mdmarkdown
undefinedKey moments — <title>
关键瞬间 — <title>
00:00:15 (frame-001.png)
00:00:15 (frame-001.png)
On screen: Login form, email field focused
Transcript: "So you just open it up and..."
Note: Beginning of UI demo
屏幕内容: 登录表单,邮箱输入框处于聚焦状态
转录文本: "So you just open it up and..."
备注: UI演示开始
00:00:45 (frame-002.png)
00:00:45 (frame-002.png)
On screen: Dashboard with 4 cards
Transcript: "And here's where you see all your projects."
Note: Major view change — first time the dashboard appears
undefined屏幕内容: 包含4个卡片的仪表盘
转录文本: "And here's where you see all your projects."
备注: 视图重大变化 — 首次展示仪表盘
undefinedGenerate summary
生成摘要
After moments are identified, synthesize the whole video into :
<workdir>/summary.mdmarkdown
undefined识别关键瞬间后,将整个视频内容合成为:
<workdir>/summary.mdmarkdown
undefinedSummary — <title>
摘要 — <title>
Source: <source URL / file>
Duration: hh:mm:ss
Watched at: <date>
Mode: visual
来源: <来源URL / 文件路径>
时长: hh:mm:ss
处理时间: <日期>
模式: visual
TL;DR
摘要(TL;DR)
<2–4 sentences>
<2-4句话>
Key moments
关键瞬间
- 00:00:15 — <one-line>
- 00:00:45 — <one-line>
- 00:00:15 — <单行描述>
- 00:00:45 — <单行描述>
Action items flagged
标记的行动项
- <item> [timestamp]
- <行动项> [时间戳]
Decisions flagged
标记的决策
- <decision> [timestamp] — consider routing to /decide
- <决策内容> [时间戳] — 建议路由至/decide指令
Quotes worth keeping
值得保留的引用
- "..." [timestamp]
- "..." [时间戳]
Open questions
未解答的问题
- <question raised but not answered>
undefined- <提出但未解答的问题>
undefinedStep 8 — If multimodal
mode
multimodal步骤8 — 若为multimodal
模式
multimodalBackend selection
后端选择
-
Gemini native ifis set (much cheaper + faster than per-frame for long videos):
$GEMINI_API_KEYDefault model:(released May 2026, ~$1.50 input / $9 output per 1M tokens; ~$0.15/sec of video; beats 3.1 Pro on coding/agentic benchmarks at 4× the speed). Override togemini-3.5-flashfor brand audits / high-stakes analysis where details matter;gemini-3.1-profor bulk cheap processing.gemini-2.5-flash-litebash# Step 1: Upload video via Files API FILE_URI=$(curl -s -X POST "https://generativelanguage.googleapis.com/upload/v1beta/files?key=$GEMINI_API_KEY" \ -H "X-Goog-Upload-Command: start, upload, finalize" \ -H "Content-Type: video/mp4" \ --data-binary "@<workdir>/video.mp4" | jq -r '.file.uri') # Wait until file is ACTIVE (Gemini processes the video first) while true; do STATE=$(curl -s "$FILE_URI?key=$GEMINI_API_KEY" | jq -r '.state') [ "$STATE" = "ACTIVE" ] && break sleep 3 done # Step 2: Generate content with the file + multimodal-analysis prompt curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=$GEMINI_API_KEY" \ -H "Content-Type: application/json" \ -d "{ \"contents\":[{ \"parts\":[ {\"file_data\":{\"mime_type\":\"video/mp4\",\"file_uri\":\"$FILE_URI\"}}, {\"text\":\"<multimodal analysis prompt — see Step 7's summary template + use-case extensions>\"} ] }] }"Files persist in Gemini Files API for ~48 hours — useful for re-querying the same video with different prompts. -
Dense Claude vision fallback if no Gemini key:
- Frame cadence: 1 frame per 3s (much denser than visual mode)
- Batch through Claude vision with the multimodal-analysis prompt
- Slower and more expensive than Gemini for long videos — warn the user before running on >10min content
-
Gemini原生处理(若已设置——比逐帧分析更便宜、更快,尤其适用于长视频):
$GEMINI_API_KEY默认模型:(2026年5月发布,每1M输入令牌约1.5美元/输出令牌约9美元;每秒钟视频约0.15美元;在编码/智能体基准测试中表现优于3.1 Pro,速度快4倍)。若为品牌审核/高风险分析等需关注细节的场景,可替换为gemini-3.5-flash;若为批量低成本处理,可使用gemini-3.1-pro。gemini-2.5-flash-litebash# 步骤1: 通过Files API上传视频 FILE_URI=$(curl -s -X POST "https://generativelanguage.googleapis.com/upload/v1beta/files?key=$GEMINI_API_KEY" \ -H "X-Goog-Upload-Command: start, upload, finalize" \ -H "Content-Type: video/mp4" \ --data-binary "@<workdir>/video.mp4" | jq -r '.file.uri') # 等待文件状态变为ACTIVE(Gemini需先处理视频) while true; do STATE=$(curl -s "$FILE_URI?key=$GEMINI_API_KEY" | jq -r '.state') [ "$STATE" = "ACTIVE" ] && break sleep 3 done # 步骤2: 结合文件与多模态分析提示生成内容 curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=$GEMINI_API_KEY" \ -H "Content-Type: application/json" \ -d "{ \"contents\":[{ \"parts\":[ {\"file_data\":{\"mime_type\":\"video/mp4\",\"file_uri\":\"$FILE_URI\"}}, {\"text\":\"<多模态分析提示 — 参考步骤7的摘要模板+用例扩展>\"} ] }] }"文件在Gemini Files API中保留约48小时——便于用不同提示重新查询同一视频。 -
密集型Claude视觉备选(若无Gemini密钥):
- 帧提取频率:每3秒1帧(比visual模式密集得多)
- 结合多模态分析提示批量发送至Claude vision
- 处理长视频比Gemini慢且成本更高——处理超过10分钟的内容前需提醒用户
Multimodal output
多模态输出
Same template as Step 7 + an extended section:
summary.mdmarkdown
undefined使用与步骤7相同的模板,并添加扩展章节:
summary.mdmarkdown
undefinedMultimodal observations
多模态观察
- Body language / delivery: <observations on talking-head video>
- Pacing: <fast/slow/uneven>
- Visual style: <brand audit, ad review, design observations>
- Audio quality / atmosphere: <music, silence, background>
Exact extra sections depend on the use case (brand audit, ad review, talk delivery review, client-call read). Use case is inferred from the source + the user's verbal framing when invoking.- 肢体语言/表达: <对单人讲话视频的观察>
- 节奏: <快/慢/不均匀>
- 视觉风格: <品牌审核、广告评审、设计观察>
- 音频质量/氛围: <音乐、静音、背景音>
额外章节的具体内容取决于使用场景(品牌审核、广告评审、演讲效果评估、客户通话分析)。根据来源和用户调用时的表述推断使用场景。Step 9 — Optional: capture to second-brain
步骤9 — 可选:保存至second-brain
After any mode completes, offer:
"Want to capture this to second-brain? I'll write a(orcall-<slug>.md/meeting-/note-) toresource-with the summary, source URL, and transcript link."${SECOND_BRAIN_VAULT:-$HOME/Documents/SecondBrain}/raw/
Type prefix by source:
| Source | Prefix |
|---|---|
| Loom / Zoom / Riverside / Otter / call recording | |
| Meeting (own notes, not a transcript) | |
| Talk / keynote / conference | |
| Ad / landing-page video / marketing reference / competitor video | |
File body: 1-line source, the summary, link to full workdir.
任意模式完成后,向用户提供选项:
"是否要将内容保存至second-brain?我会将摘要、来源URL和转录链接写入(或call-<slug>.md/meeting-/note-格式),保存至resource-目录。"${SECOND_BRAIN_VAULT:-$HOME/Documents/SecondBrain}/raw/
根据来源设置文件前缀:
| 来源 | 前缀 |
|---|---|
| Loom / Zoom / Riverside / Otter /通话录制 | |
| 会议(自有笔记,非转录内容) | |
| 演讲/主旨发言/会议 | |
| 广告/落地页视频/营销参考/竞品视频 | |
文件内容:单行来源信息、摘要、完整工作目录链接。
Step 10 — Report
步骤10 — 结果反馈
In chat:
- One-line headline:
<source> · <title> · <duration> · <mode> · <word count> words - Workdir path
- For /
visual: brief list of top 3 key momentsmultimodal - For all modes: any action items / decisions flagged for triage
- If captured to second-brain: that path too
在聊天窗口中展示:
- 单行标题:
<来源> · <标题> · <时长> · <模式> · <字数> 字 - 工作目录路径
- 若为/
visual模式:简要列出Top3关键瞬间multimodal - 所有模式:标记出需优先处理的行动项/决策
- 若已保存至second-brain:同时展示该路径
Sources reference
来源参考
| Source | Download | Built-in transcript | Notes |
|---|---|---|---|
| YouTube | | Auto-subs ( | Same as the prior youtube-transcript skill |
| Loom | | Yes — fetch via embed metadata or Loom API | Async screenshare focus — prime use case |
| Vimeo | | Sometimes | Marketing/embed videos |
| Riverside | Direct URL from export, or local file | Yes — Riverside generates them | Podcast episodes |
| Zoom | Local | Sometimes (Zoom audio transcript file) | Client calls |
| X / IG / TikTok | Defer to | No | Short-form |
| Local file | n/a | n/a | Drop a path |
| 来源 | 下载方式 | 内置转录内容 | 备注 |
|---|---|---|---|
| YouTube | | 自动字幕( | 与之前的youtube-transcript技能一致 |
| Loom | | 是 — 通过嵌入元数据或Loom API获取 | 异步屏幕共享场景的首选 |
| Vimeo | | 部分支持 | 营销/嵌入视频 |
| Riverside | 导出的直接URL或本地文件 | 是 — Riverside自动生成 | 播客节目 |
| Zoom | 本地 | 部分支持(Zoom音频转录文件) | 客户通话 |
| X / IG / TikTok | 委托 | 无 | 短视频 |
| 本地文件 | 无需下载 | 无 | 直接提供文件路径 |
Composes with
可组合技能
- — for X/IG/TikTok URL metadata (engagement, author, replies) before video processing
social-fetch - — capture summary as
second-brain,raw/call-<slug>.md,meeting-, ornote-per source typeresource- - — when a video contains a flagged decision, route to
decidefor structured capture/decide - — action items flagged in summary can be triaged to project boards
pm - — talk recordings → outline extraction → deck draft (loop)
slide-deck - — quotes + clip-worthy moments from podcast/talk videos feed BIP/promo posts
jab-hook - — primary use case for
skillify from-videomode on process recordings. the user records themselves doing a workflow (Loom/screen-share), this skill extracts transcript + key visual moments, thenvisualsynthesizes the workflow into a SKILL.md. "Record once, AI converts to skill."skillify
- — 处理X/IG/TikTok URL时,先获取元数据(互动量、作者、评论)再处理视频
social-fetch - — 根据来源类型将摘要保存为
second-brain、raw/call-<slug>.md、meeting-或note-格式resource- - — 当视频中包含标记的决策时,路由至
decide指令进行结构化记录/decide - — 摘要中标记的行动项可分流至项目看板
pm - — 演讲录制内容 → 提取大纲 → 生成演示文稿草稿(循环流程)
slide-deck - — 从播客/演讲视频中提取引用和值得剪辑的片段,用于BIP/推广内容
jab-hook - —
skillify from-video模式的主要用例:用户录制自己的工作流程(Loom/屏幕共享),本技能提取转录内容+关键视觉瞬间,然后visual将工作流程合成为SKILL.md。"一次录制,AI转换为技能文档。"skillify
Error handling
错误处理
| Failure | Response |
|---|---|
| Video unavailable / private / region-locked | Report and stop |
| No subtitles + Whisper not installed | Tell the user: |
| ffmpeg missing (for visual/multimodal) | Tell the user: |
| Vision pass returns empty / unclear | Lower the frame count, retry, or fall back to transcript-only with a note |
Multimodal requested but no | Warn cost, offer to fall back to visual mode |
| |
| 故障场景 | 响应方式 |
|---|---|
| 视频不可用/私密/区域限制 | 告知用户并终止处理 |
| 无字幕且未安装Whisper | 告知用户: |
| 缺少ffmpeg(用于visual/multimodal模式) | 告知用户: |
| 视觉分析返回空内容/结果模糊 | 降低帧数量,重试,或返回仅转录内容并备注 |
请求multimodal模式但未设置 | 提醒成本,提供切换至visual模式的选项 |
缺少 | |
Notes on quality
质量说明
- User picks depth, not the skill. Transcript / visual / multimodal are 3 different cost + latency profiles. Long videos (>10 min) always confirm before spending on visual/multimodal.
- Platform transcript first, Whisper second. YouTube auto-subs, Loom transcripts, Riverside built-in transcripts — all free + instant when they exist. Fall back to MLX-Whisper local only when nothing platform-provided works.
- MLX-Whisper local is the fast path on Mac. M-series machines transcribe faster than real-time. Cloud Whisper is a distant second choice — costs money, network dependency, worse latency on typical durations.
- Frame cadence by source type. Screen-share / demos need 1 frame per 5s (UI changes fast); talking-head podcasts need 1 per 30s (slow change). Default 15s if unsure. Wrong cadence = missed key moments OR wasted vision-pass cost.
- 720p is plenty. Downloading 1080p / 4K for transcription + frame analysis wastes bandwidth + storage. is the default.
yt-dlp -f "bv*[height<=720]+ba/b[height<=720]" - Scene-change detection catches slide transitions. When the video is a slide presentation, add to force a frame on each detected slide change — more reliable than pure time-based sampling.
ffmpeg -vf "select='gt(scene,0.3)'" - Multimodal cost warning is non-optional. Gemini multimodal on a 60-min video is meaningfully expensive. Warn before running; offer transcript-only as fallback if the user isn't sure.
- Summary format includes routing hints. +
## Decisions flaggedsections signal## Action items flaggedand/decidefollow-ups. Downstream composability lives in the summary structure./pm
- 由用户选择处理深度,而非技能自动决定。Transcript/visual/multimodal对应三种不同的成本+延迟方案。处理长视频(>10分钟)时,在启用visual/multimodal模式前必须确认用户意愿。
- 优先使用平台转录内容,其次是Whisper。YouTube自动字幕、Loom转录内容、Riverside内置转录内容——这些均为免费且可即时获取。仅当无平台提供的转录内容时,才使用本地MLX-Whisper。
- 本地MLX-Whisper是Mac设备的快速方案。M系列设备转录速度快于实时。云端Whisper是远次一等的选择——产生费用、依赖网络、在常规时长下延迟更高。
- 根据来源类型设置帧提取频率。屏幕共享/演示视频需每5秒1帧(UI变化快);单人讲话播客需每30秒1帧(变化慢)。不确定时默认15秒。错误的频率设置会导致错过关键瞬间或浪费视觉分析成本。
- 720p分辨率足够。下载1080p/4K视频用于转录+帧分析会浪费带宽和存储空间。默认使用。
yt-dlp -f "bv*[height<=720]+ba/b[height<=720]" - 场景变化检测可捕捉幻灯片切换。若视频为幻灯片演示,添加强制在检测到幻灯片变化时提取帧——比纯基于时间的采样更可靠。
ffmpeg -vf "select='gt(scene,0.3)'" - 多模态模式的成本提醒必不可少。Gemini多模态处理60分钟视频的成本相当可观。运行前必须提醒用户;若用户不确定,提供仅转录模式作为备选。
- 摘要格式包含路由提示。+
## 标记的决策章节为## 标记的行动项和/decide后续操作提供信号。下游可组合性体现在摘要结构中。/pm