名称: TubeScribe
描述: "YouTube 视频摘要工具,具备说话人检测、格式化文档和音频输出功能。开箱即用,支持 macOS 内置 TTS。可选推荐工具(pandoc、ffmpeg、mlx-audio)可提升质量。访问 YouTube 需要网络。无需付费 API 或订阅。当用户发送 YouTube 链接或要求总结/转录 YouTube 视频时使用。"
元数据:
{
"openclaw":
{
"emoji": "🎬",
"requires": { "bins": ["summarize"] }
}
}
将任何 YouTube 视频转化为精美的文档 + 音频摘要。
只需提供一个 YouTube 链接 → 即可获得一份精美的转录稿,包含说话人标签、关键引述、可跳转回视频的时间戳,以及一份可供随时收听的音频摘要。
当用户发送 YouTube 链接时:
1. 立即 启动一个包含完整处理管道的子代理
2. 回复:"🎬 TubeScribe 正在处理 — 完成后我会通知您!"
3. 继续对话(无需等待!)
4. 子代理完成后会通过通知告知,包含视频标题和详细信息
切勿阻塞 — 立即启动子代理并继续对话。
运行设置脚本以检查依赖项并配置默认值:
python skills/tubescribe/scripts/setup.py
此脚本检查:summarize CLI、pandoc、ffmpeg、Kokoro TTS
启动一个执行完整管道的子代理:
sessions_spawn(
task=f"""
## TubeScribe: 处理 {youtube_url}
⚠️ 重要:请勿安装任何软件。
禁止使用 pip、brew、curl、venv 或下载二进制文件。
如果缺少某个工具,请停止并报告所需内容。
运行完整的处理流程 — 直到所有步骤完成前不要停止。
### 步骤 1:提取
```bash
python3 skills/tubescribe/scripts/tubescribe.py "{youtube_url}"
注意脚本打印的 源文件 和 输出 路径。后续步骤请使用这些确切路径。
从步骤 1 的输出中读取源文件路径,并记录:
- metadata.title (用于文件名)
- metadata.video_id
- metadata.channel, upload_date, duration_string
写入到步骤 1 的输出路径:
# **<标题>**## **参与者** — 带粗体标题的表格:| **姓名** | **角色** | **描述** |
|----------|----------|-----------------|## **摘要** — 3-5 段文字总结## **关键引述** — 5 条最佳引述,附带可点击的 YouTube 时间戳。每条格式如下:"另一条引述。" - 25:10
``
使用普通短横线-,而非长破折号—。不要使用块引用>`。仅使用普通段落。
## **观众情绪** (如果存在评论)## **精选评论** (如果存在评论) — 前 5 条,评论间无空行:- ▲ 123 @作者名
下一条评论内容。
- ▲ 45 @另一位作者
``
署名行:短横线 + 斜体。评论间仅用空行分隔,不要使用---` 分隔符。
## **完整转录稿** — 合并片段,包含说话人标签和可点击时间戳清理标题以用作文件名(移除特殊字符),然后:
pandoc <输出路径> -o ~/Documents/TubeScribe/<安全标题>.docx
将摘要文本写入临时文件,然后使用 TubeScribe 内置的音频生成功能:
# 将摘要写入临时文件(使用 python3 写入,避免 shell 转义问题)
python3 -c "
text = '''你的摘要文本'''
with open('<临时目录>/tubescribe_<视频ID>_summary.txt', 'w') as f:
f.write(text)
"
# 生成音频(自动从配置中检测引擎、语音、格式)
python3 skills/tubescribe/scripts/tubescribe.py \
--generate-audio <临时目录>/tubescribe_<视频ID>_summary.txt \
--audio-output ~/Documents/TubeScribe/<安全标题>_summary
此命令读取 ~/.tubescribe/config.json,并自动使用配置的 TTS 引擎(mlx/kokoro/builtin)、语音混合和语速。输出格式(mp3/wav)来自配置。
python3 skills/tubescribe/scripts/tubescribe.py --cleanup <video_id>
open ~/Documents/TubeScribe/
告知创建了哪些文件:DOCX 文件名、MP3 文件名 + 时长、视频统计信息。
""",
label="tubescribe",
runTimeoutSeconds=900,
cleanup="delete"
)
**启动子代理后,立即回复:**
> 🎬 TubeScribe 正在处理 - 完成后我会通知您!
然后继续对话。子代理完成时会通过通知告知。
## 配置
配置文件:`~/.tubescribe/config.json`
```json
{
"output": {
"folder": "~/Documents/TubeScribe",
"open_folder_after": true,
"open_document_after": false,
"open_audio_after": false
},
"document": {
"format": "docx",
"engine": "pandoc"
},
"audio": {
"enabled": true,
"format": "mp3",
"tts_engine": "mlx"
},
"mlx_audio": {
"path": "~/.openclaw/tools/mlx-audio",
"model": "mlx-community/Kokoro-82M-bf16",
"voice": "af_heart",
"lang_code": "a",
"speed": 1.05
},
"kokoro": {
"path": "~/.openclaw/tools/kokoro",
"voice_blend": { "af_heart": 0.6, "af_sky": 0.4 },
"speed": 1.05
},
"processing": {
"subagent_timeout": 600,
"cleanup_temp_files": true
}
}
| 选项 | 默认值 | 描述 |
|---|---|---|
output.folder |
~/Documents/TubeScribe |
文件保存位置 |
output.open_folder_after |
true |
完成后打开输出文件夹 |
output.open_document_after |
false |
自动打开生成的文档 |
output.open_audio_after |
false |
自动打开生成的音频摘要 |
| 选项 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
document.format |
docx |
docx, html, md |
输出格式 |
document.engine |
pandoc |
pandoc |
DOCX 转换器(失败时回退到 HTML) |
| 选项 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
audio.enabled |
true |
true, false |
是否生成音频摘要 |
audio.format |
mp3 |
mp3, wav |
音频格式(mp3 需要 ffmpeg) |
audio.tts_engine |
mlx |
mlx, kokoro, builtin |
TTS 引擎(mlx 在 Apple Silicon 上最快) |
| 选项 | 默认值 | 描述 |
|---|---|---|
mlx_audio.path |
~/.openclaw/tools/mlx-audio |
mlx-audio venv 位置 |
mlx_audio.model |
mlx-community/Kokoro-82M-bf16 |
使用的 MLX 模型 |
mlx_audio.voice |
af_heart |
语音预设(当未设置 voice_blend 时使用) |
mlx_audio.voice_blend |
{af_heart: 0.6, af_sky: 0.4} |
自定义语音混合(加权混合) |
mlx_audio.lang_code |
a |
语言代码(a=美式英语) |
mlx_audio.speed |
1.05 |
播放速度(1.0=正常,1.05=快 5%) |
| 选项 | 默认值 | 描述 |
|---|---|---|
kokoro.path |
~/.openclaw/tools/kokoro |
Kokoro 仓库位置 |
kokoro.voice_blend |
{af_heart: 0.6, af_sky: 0.4} |
自定义语音混合 |
kokoro.speed |
1.05 |
播放速度(1.0=正常,1.05=快 5%) |
| 选项 | 默认值 | 描述 |
|---|---|---|
processing.subagent_timeout |
600 |
子代理运行超时(秒)(长视频可增加) |
processing.cleanup_temp_files |
true |
完成后清理 /tmp 文件 |
| 选项 | 默认值 | 描述 |
|---|---|---|
comments.max_count |
50 |
获取的评论数量 |
comments.timeout |
90 |
评论获取超时(秒) |
| 选项 | 默认值 | 描述 |
|---|---|---|
queue.stale_minutes |
30 |
在此时间(分钟)后,将处理任务视为过期 |
~/Documents/TubeScribe/
├── {视频标题}.html # 格式化文档(或 .docx / .md)
└── {视频标题}_summary.mp3 # 音频摘要(或 .wav)
生成后,会自动打开文件夹(而非单个文件),方便您访问所有内容。
必需:
- summarize CLI — brew install steipete/tap/summarize
- Python 3.8+
可选(提升质量):
- pandoc — DOCX 输出:brew install pandoc
- ffmpeg — MP3 音频:brew install ffmpeg
- yt-dlp — YouTube 评论:brew install yt-dlp
- mlx-audio — Apple Silicon 上最快的 TTS:pip install mlx-audio(使用 MLX 后端运行 Kokoro)
- Kokoro TTS — PyTorch 备用方案:参见 https://github.com/hexgrad/kokoro
TubeScribe 按顺序检查以下位置:
| 优先级 | 路径 | 来源 |
|---|---|---|
| 1 | which yt-dlp |
系统 PATH |
| 2 | /opt/homebrew/bin/yt-dlp |
Homebrew (Apple Silicon) |
| 3 | /usr/local/bin/yt-dlp |
Homebrew (Intel) / Linux |
| 4 | ~/.local/bin/yt-dlp |
pip install --user |
| 5 | ~/.local/pipx/venvs/yt-dlp/bin/yt-dlp |
pipx |
| 6 | ~/.openclaw/tools/yt-dlp/yt-dlp |
TubeScribe 自动安装 |
如果未找到,设置脚本会下载一个独立的二进制文件到工具目录。
工具目录的版本不会与系统安装的版本冲突。
当用户在处理一个视频时发送多个 YouTube 链接:
python skills/tubescribe/scripts/tubescribe.py --queue-status
# 添加到队列,而不是启动并行处理
python skills/tubescribe/scripts/tubescribe.py --queue-add "新链接"
# → 回复:"📋 已添加到队列(位置 2)"
# 检查队列中是否还有更多任务
python skills/tubescribe/scripts/tubescribe.py --queue-next
# → 自动弹出并处理下一个链接
| 命令 | 描述 |
|---|---|
--queue-status |
显示正在处理的任务和队列中的项目 |
--queue-add URL |
将 URL 添加到队列 |
--queue-next |
处理队列中的下一个项目 |
--queue-clear |
清空整个队列 |
python skills/tubescribe/scripts/tubescribe.py url1 url2 url3
按顺序处理所有 URL,并在最后提供总结。
脚本会检测并清晰地报告以下错误:
| 错误 | 提示信息 |
|---|---|
| 无效 URL | ❌ 不是有效的 YouTube URL |
| 私享视频 | ❌ 视频为私享 — 无法访问 |
| 视频已删除 | ❌ 视频未找到或已删除 |
| 无字幕 | ❌ 此视频无可用字幕 |
| 年龄限制 | ❌ 年龄限制视频 — 未登录无法访问 |
| 地区限制 | ❌ 视频在您所在地区被屏蔽 |
| 直播流 | ❌ 不支持直播流 — 请等待直播结束 |
| 网络错误 | ❌ 网络错误 — 请检查您的连接 |
| 超时 | ❌ 请求超时 — 请稍后重试 |
发生错误时,向用户报告并停止处理该视频。
tubescribe url1 url2 url3