关于 video
video 是面向视频和播客内容的摘要 Skill,可从媒体链接提取字幕或转录音频,并生成结构化摘要。它支持多个视频、播客平台及直接媒体链接,适用于需要获取文字稿和重点整理的用户。
主要功能
- 01提取字幕或转录音频
- 02支持多个视频与播客来源
- 03长音频分段并依次转录
- 04按内容类型生成结构化摘要
- 05处理转录错误与限流
适用场景
- 01整理 YouTube 或 Bilibili 视频内容
- 02获取播客的章节摘要和重点
- 03转录没有字幕的媒体音频
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ ibigqiang/ feedgrab --skill video安装后在 Claude Code 中输入/video确认已加载。
详细介绍
视频和播客摘要技能
发送视频/播客链接 → 获取完整转录文本和结构化摘要
支持的平台
| 平台 | 类型 | 字幕 | Whisper 转录 |
|---|---|---|---|
| YouTube | 视频 | ✅ | ✅ |
| Bilibili | 视频 | ✅ | ✅ |
| X/Twitter | 视频 | ❌ | ✅ |
| Xiaoyuzhou (小宇宙) | 播客 | ❌ | ✅ |
| Apple Podcasts | 播客 | ❌ | ✅ |
| 直接链接 (mp3/mp4/m3u8) | 任意 | ❌ | ✅ |
触发条件
检测到媒体 URL 时自动触发:
- YouTube:
youtube.com、youtu.be - Bilibili:
bilibili.com、b23.tv - X/Twitter:
x.com、twitter.com(含视频的推文) - Xiaoyuzhou:
xiaoyuzhoufm.com - Apple Podcasts:
podcasts.apple.com - 直接链接:
.mp3、.mp4、.m3u8、.m4a、.webm
流程
步骤 0:检测媒体类型
| URL 模式 | 类型 | 流程 |
|---|---|---|
xiaoyuzhoufm.com/episode/ | 播客 | → 步骤 1b(Xiaoyuzhou) |
podcasts.apple.com | 播客 | → 步骤 1c(Apple) |
bilibili.com、b23.tv | 视频 | → 步骤 1d(Bilibili API) |
.mp3、.m4a 直接链接 | 音频 | → 步骤 2b(直接下载) |
| 其他 | 视频 | → 步骤 1a(提取字幕) |
步骤 1a:视频 — 提取字幕
rm -f /tmp/media_sub*.vtt /tmp/media_audio.mp3 /tmp/media_transcript*.json /tmp/media_segment_*.mp3 2>/dev/null || true
# YouTube (prefer English, fallback Chinese)
yt-dlp --skip-download --write-auto-sub --sub-lang "en,zh-Hans" -o "/tmp/media_sub" "VIDEO_URL"
# Bilibili
yt-dlp --skip-download --write-auto-sub --sub-lang "zh-Hans,zh" -o "/tmp/media_sub" "VIDEO_URL"
检查字幕:
ls /tmp/media_sub*.vtt 2>/dev/null
- 有字幕 → 读取 VTT 内容,跳至步骤 3
- 无字幕 → 步骤 2a(下载音频)
步骤 1b:Xiaoyuzhou (小宇宙) — 提取音频 URL
AUDIO_URL=$(curl -sL -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
"EPISODE_URL" \
| grep -oE 'https://media\.xyzcdn\.net/[^"]+\.(m4a|mp3)' \
| head -1)
echo "Audio URL: $AUDIO_URL"
curl -L -o /tmp/media_audio.mp3 "$AUDIO_URL"
→ 步骤 2b
步骤 1c:Apple Podcasts — 通过 yt-dlp
yt-dlp -f "ba[ext=m4a]/ba/b" --extract-audio --audio-format mp3 --audio-quality 5 \
-o "/tmp/media_audio.%(ext)s" "APPLE_PODCAST_URL"
→ 步骤 2b
步骤 1d:Bilibili — 通过 API 直接获取音频流
BV="BV1xxxxx"
curl -s "https://api.bilibili.com/x/web-interface/view?bvid=$BV" \
-H "User-Agent: Mozilla/5.0" -H "Referer: https://www.bilibili.com/" \
| python3 -c "import json,sys; d=json.load(sys.stdin)['data']; print(f\"Title: {d['title']}\nDuration: {d['duration']}s\nCID: {d['cid']}\")"
CID=<CID from previous step>
AUDIO_URL=$(curl -s "https://api.bilibili.com/x/player/playurl?bvid=$BV&cid=$CID&fnval=16&qn=64" \
-H "User-Agent: Mozilla/5.0" -H "Referer: https://www.bilibili.com/" \
| python3 -c "import json,sys; print(json.load(sys.stdin)['data']['dash']['audio'][0]['baseUrl'])")
curl -L -o /tmp/media_audio.m4s \
-H "User-Agent: Mozilla/5.0" -H "Referer: https://www.bilibili.com/" "$AUDIO_URL"
ffmpeg -y -i /tmp/media_audio.m4s -acodec libmp3lame -q:a 5 /tmp/media_audio.mp3
→ 步骤 2b
步骤 2a:视频 — 下载音频(无字幕时)
yt-dlp --cookies-from-browser chrome -f "ba[ext=m4a]/ba/b" --extract-audio --audio-format mp3 --audio-quality 5 \
-o "/tmp/media_audio.%(ext)s" "VIDEO_URL"
步骤 2b:检查音频大小并分段
FILE_SIZE=$(stat -f%z /tmp/media_audio.* 2>/dev/null || stat -c%s /tmp/media_audio.* 2>/dev/null)
echo "File size: $FILE_SIZE bytes"
- ≤ 25MB → 步骤 2c(直接转录)
- > 25MB → 拆分为 10 分钟的片段:
DURATION=$(ffprobe -v error -show_entries format=duration -of csv=p=0 /tmp/media_audio.* | head -1)
SEGMENT_SEC=600
SEGMENTS=$(python3 -c "import math; print(math.ceil(float('$DURATION')/$SEGMENT_SEC))")
for i in $(seq 0 $((SEGMENTS-1))); do
START=$((i * SEGMENT_SEC))
ffmpeg -y -i /tmp/media_audio.* -ss $START -t $SEGMENT_SEC -acodec libmp3lame -q:a 5 \
"/tmp/media_segment_${i}.mp3" 2>/dev/null
done
→ 按顺序对每个片段调用步骤 2c(并行处理会触发 Groq 524 超时)
步骤 2c:Whisper 转录
前置条件:GROQ_API_KEY 环境变量
if [ -z "$GROQ_API_KEY" ]; then
echo "❌ GROQ_API_KEY not set. Get one at: https://console.groq.com/keys"
exit 1
fi
curl -s -X POST "https://api.groq.com/openai/v1/audio/transcriptions" \
-H "Authorization: Bearer $GROQ_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "file=@AUDIO_FILE" \
-F "model=whisper-large-v3-turbo" \
-F "response_format=verbose_json" \
-F "language=zh" \
> /tmp/media_transcript.json
python3 -c "import json; print(json.load(open('/tmp/media_transcript.json'))['text'])"
步骤 3:结构化摘要
视频(≤20 分钟):
- 概述(1-2 句话)
- 要点(3-5 个项目符号)
- 值得注意的引述(如有)
- 行动事项(如适用)
播客(>20 分钟):
- 概述(2-3 句话)
- 章节摘要(按主题划分)
- 要点(5-8 个项目符号)
- 值得注意的引述
- 行动事项(如适用)
错误处理
| 情况 | 操作 |
|---|---|
| 无字幕且没有 GROQ_API_KEY | 提示用户设置 API 密钥 |
| 音频 >25MB | 使用 ffmpeg 分段(每段 10 分钟),按顺序转录 |
| 播客 >2 小时 | 警告用户,并在继续前确认 |
| Groq 524 超时 | 不要并行处理——按顺序转录,每次间隔 5-8 秒 |
| Groq 429 速率限制 | 等待 retry-after 标头指定的时间,然后重试 |
| yt-dlp 遇到 Bilibili 412 | 改用 Bilibili API(步骤 1d) |
| yt-dlp 检测到 YouTube 机器人 | 添加 --cookies-from-browser chrome |
| Spotify 链接 | 不支持(受 DRM 保护) |
依赖项
yt-dlp:视频下载和字幕提取ffmpeg:音频转换和分段curl:音频下载、API 调用GROQ_API_KEY:Whisper 转录(在 https://console.groq.com/keys 免费获取)
评论
支持 Markdown