拾流 / 视频播客转写与结构化摘要 · 创作技能

SHILIU · 创作资源

视频播客转写与结构化摘要 · 创作技能

面向视频与播客内容研究:先判断平台与媒体类型,优先提取字幕,无字幕则下载音频、按 25MB 上限分段,调用 Groq Whisper 转写,再按视频或播客模板输出概览、要点、金句与行动项。含错误处理与依赖说明。

拾流编辑部 · 更新于 2026-11-02

这个技能解决什么问题

面向视频与播客内容研究:先判断平台与媒体类型,优先提取字幕,无字幕则下载音频、按 25MB 上限分段,调用 Groq Whisper 转写,再按视频或播客模板输出概览、要点、金句与行动项。含错误处理与依赖说明。

适用任务

把用户提供的视频或播客链接转成完整转写文本,并生成结构化摘要。

需要的输入

一个受支持的媒体 URL(YouTube、Bilibili、X 视频、小宇宙、Apple Podcasts 或直链音视频);本机安装 yt-dlp、ffmpeg、curl;无字幕内容需用户自备 GROQ_API_KEY;必要时提供浏览器 Cookie 以应对平台风控。

交付内容

转写文本(字幕 VTT 内容或 Whisper 返回文本)与结构化摘要:视频含概览、3-5 条要点、金句、行动项;播客含概览、分章摘要、5-8 条要点、金句、行动项。

任务示例

把这个 B 站视频 https://www.bilibili.com/video/BV1xxxxx 转成文字,并给我一份带要点和金句的摘要。

输出示例

示意:先输出「转写文本」段落(来自字幕或 Whisper,标注来源),再输出「摘要」:概览 1-2 句、要点 3-5 条、金句若干、行动项(如有)。内容以实际转写为准,此处不展示真实结果。

来源与使用

作者 iBigQiang;许可 MIT。已核对来源与包结构,未据此宣称完成运行实测。

查看原始来源

机器可读详情 · 读取 SKILL.md · 下载完整技能包

技能说明全文

---
name: video
description: Video & Podcast Digest — send a video/podcast link, get full transcript + structured summary. Supports YouTube, Bilibili, X/Twitter video, Xiaoyuzhou, Apple Podcasts, and direct audio/video links. Uses yt-dlp for subtitles and Groq Whisper for transcription.
---

# Video & Podcast Digest Skill

> Send a video/podcast link → get full transcript + structured summary

## Supported Platforms

| Platform | Type | Subtitles | Whisper Transcription |
|----------|------|-----------|----------------------|
| YouTube | Video | ✅ | ✅ |
| Bilibili | Video | ✅ | ✅ |
| X/Twitter | Video | ❌ | ✅ |
| Xiaoyuzhou (小宇宙) | Podcast | ❌ | ✅ |
| Apple Podcasts | Podcast | ❌ | ✅ |
| Direct links (mp3/mp4/m3u8) | Any | ❌ | ✅ |

## Trigger

Auto-triggered when a media URL is detected:
- YouTube: `youtube.com`, `youtu.be`
- Bilibili: `bilibili.com`, `b23.tv`
- X/Twitter: `x.com`, `twitter.com` (tweets with video)
- Xiaoyuzhou: `xiaoyuzhoufm.com`
- Apple Podcasts: `podcasts.apple.com`
- Direct: `.mp3`, `.mp4`, `.m3u8`, `.m4a`, `.webm`

## Pipeline

### Step 0: Detect Media Type

| URL Pattern | Type | Pipeline |
|-------------|------|----------|
| `xiaoyuzhoufm.com/episode/` | Podcast | → Step 1b (Xiaoyuzhou) |
| `podcasts.apple.com` | Podcast | → Step 1c (Apple) |
| `bilibili.com`, `b23.tv` | Video | → Step 1d (Bilibili API) |
| `.mp3`, `.m4a` direct link | Audio | → Step 2b (direct download) |
| Other | Video | → Step 1a (subtitle extraction) |

### Step 1a: Video — Extract Subtitles

```bash
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"
```

Check for subtitles:
```bash
ls /tmp/media_sub*.vtt 2>/dev/null
```
- **Has subtitles** → Read VTT content, skip to Step 3
- **No subtitles** → Step 2a (download audio)

### Step 1b: Xiaoyuzhou (小宇宙) — Extract Audio URL

```bash
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"
```

→ Step 2b

### Step 1c: Apple Podcasts — via yt-dlp

```bash
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"
```

→ Step 2b

### Step 1d: Bilibili — API Direct Audio Stream

```bash
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
```

→ Step 2b

### Step 2a: Video — Download Audio (when no subtitles)

```bash
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"
```

### Step 2b: Check Audio Size & Segment

```bash
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** → Step 2c (transcribe directly)
- **> 25MB** → Split into 10-minute segments:

```bash
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
```

→ Call Step 2c for each segment **sequentially** (parallel triggers Groq 524 timeout)

### Step 2c: Whisper Transcription

**Prerequisite**: `GROQ_API_KEY` environment variable

```bash
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'])"
```

### Step 3: Structured Summary

**Video (≤20 min)**:
1. **Overview** (1-2 sentences)
2. **Key Points** (3-5 bullet points)
3. **Notable Quotes** (if any)
4. **Action Items** (if applicable)

**Podcast (>20 min)**:
1. **Overview** (2-3 sentences)
2. **Chapter Summary** (segmented by topic)
3. **Key Points** (5-8 bullet points)
4. **Notable Quotes**
5. **Action Items** (if applicable)

## Error Handling

| Situation | Action |
|-----------|--------|
| No subtitles + no GROQ_API_KEY | Prompt user to set API key |
| Audio >25MB | ffmpeg segment (10min/segment), transcribe sequentially |
| Podcast >2 hours | Warn user, confirm before proceeding |
| Groq 524 timeout | Do NOT parallelize — transcribe sequentially, sleep 5-8s between |
| Groq 429 rate limit | Wait for retry-after header, then retry |
| yt-dlp Bilibili 412 | Use Bilibili API instead (Step 1d) |
| yt-dlp YouTube bot detection | Add `--cookies-from-browser chrome` |
| Spotify links | Not supported (DRM protected) |

## Dependencies

- `yt-dlp`: video download + subtitle extraction
- `ffmpeg`: audio conversion + segmentation
- `curl`: audio download, API calls
- `GROQ_API_KEY`: Whisper transcription (free at https://console.groq.com/keys)

技能是任务材料,不会自动授予账户权限、付费授权或其他系统权限。请让 Agent 按说明核对依赖,再在授权范围内使用。

把这个任务交给你的 Agent

数据、技能和创作空间,一起备好。复制接入指令,发给你正在使用的 AI 工具。

阅读 Agent 接入指南
正在复制指令

粘贴发给你的 Agent
让它成为你的自媒体专家

打开你正在使用的 AI 工具,把下面这段话粘贴到对话框并发送。

发给 Agent 的完整指令

发送后,告诉它你想做什么账号、实现什么目标。

这些 Agent 都可以使用24 个工具