8.2 KiB
8.2 KiB
音视频转录与摘要流水线
文档版本:2026-04-15 维护者:星枢(xingshu) 状态:✅ 已验证可运行 适用场景:教学视频、讲座、播客、会议录音等任意音视频内容的转录与知识库导入
一、整体架构
视频/音频源(本地或 NAS)
│
▼
[阶段1] FFmpeg 音频提取
│ MP4/AVI/MKV → MP3
▼
本地/共享 MP3 文件库
│
▼
[阶段2] Whisper 转录
│ MP3 → 英文字幕/转写稿
▼
本地转写稿
│
▼
[阶段3] Gemini Flash 摘要
│ 转写稿 → 结构化中文笔记
▼
Obsidian 知识库
二、各阶段详解
阶段 1:FFmpeg 音频提取
| 项目 | 说明 |
|---|---|
| 输入 | .mp4、.avi、.mkv、.mov 等常见视频格式 |
| 输出 | 同目录下的同名 .mp3 文件 |
| 工具 | FFmpeg(Macmini 已安装:/opt/homebrew/bin/ffmpeg) |
| 转码参数 | -vn -acodec libmp3lame -ab 64k -ar 22050 -ac 1(64kbps CBR,针对人声优化) |
| 传输方式 | ssh cat 管道(NAS 不需要挂载) |
| 速度 | ~400x realtime(1小时视频 ≈ 9秒提取) |
命令示例:
# NAS → Macmini FFmpeg → 回写 NAS
ssh shenwei@192.168.3.17 "cat '/path/to/video/VIDEO.mp4'" \
| /opt/homebrew/bin/ffmpeg -i pipe:0 -vn -acodec libmp3lame -ab 64k -ar 22050 -ac 1 -f mp3 pipe:1 \
| ssh shenwei@192.168.3.17 "cat > '/path/to/video/VIDEO.mp3'"
# 本地文件直接转换
/opt/homebrew/bin/ffmpeg -i "/path/to/video/VIDEO.mp4" -vn -acodec libmp3lame -ab 64k -ar 22050 -ac 1 "/path/to/video/VIDEO.mp3"
脚本位置: ~/.openclaw/temp/xingshu/scripts/nas_audio_extract_v3.py
阶段 2:Whisper 转录
| 项目 | 说明 |
|---|---|
| 输入 | .mp3 文件(已由阶段1生成,或直接提供的音频文件) |
| 输出 | 英文字幕/转写稿(纯文本) |
| 工具 | openai-whisper(Python 包,通过 pip install openai-whisper 安装) |
| 模型 | small(精度与速度平衡,M 系列芯片友好) |
| 硬件 | Macmini 本地运行(Neural Engine 加速) |
| 速度 | ~50x realtime(1小时音频 ≈ 40-50秒) |
| 内存 | ~1.5GB(small 模型) |
| 费用 | 完全免费(本地运行,无需 API) |
安装命令:
pip3 install openai-whisper
调用示例:
import whisper
model = whisper.load_model("small")
result = model.transcribe("audio.mp3", language="en", fp16=False)
print(result["text"]) # 英文字幕/转写稿
转写稿长度参考: 1小时音频 ≈ 6000-8000 tokens(英文)
模型选择参考:
| 模型 | 内存占用 | 速度 | 精度 | 适用场景 |
|---|---|---|---|---|
tiny |
~1GB | 极快 | 低 | 快速预览、噪音少的内容 |
small |
~1.5GB | 快 | 中 | 推荐日常使用 |
medium |
~3GB | 慢 | 高 | 重要内容、方言口音重 |
large |
~5GB+ | 很慢 | 最高 | 最高精度要求(Macmini 不推荐) |
阶段 3:Gemini Flash 摘要
| 项目 | 说明 |
|---|---|
| 输入 | Whisper 转写的英文字幕/转写稿 |
| 输出 | 结构化中文笔记(摘要 + 关键概念 + 相关链接) |
| 工具 | Google Gemini API(直接 HTTP 调用,不依赖 summarize CLI) |
| 模型 | gemini-3-flash-preview |
| 费用 | ~0.075$/百万输入 tokens(3000分钟音频 ≈ ~$0.15) |
| API Key | AIzaSyASNIlSc-YYP1dCqKCzk59e7MXSVrnHba0(需有效) |
摘要输出格式:
## 摘要
> [300-500字中文摘要]
---
## 关键概念
- **[概念名称]**: [一句话解释]
---
## 相关笔记
> [!info]+ 交叉引用
> [[相关笔记标题]] — 关联原因
三、全量流水线脚本
脚本位置: ~/.openclaw/temp/xingshu/scripts/nas_whisper_gemini_summarize.py
核心逻辑:
- 扫描指定目录下的
.mp3文件(跳过*.done中已有的) ssh cat下载到 Macmini 本地临时目录- Whisper
small转录 - Gemini Flash 摘要
- 更新 Obsidian 对应笔记(替换
## 摘要到## 相关笔记之间的内容) - 删除本地临时文件
- 写入
.done进度文件(断点续传)
启动命令:
cd ~/.openclaw/temp/xingshu
nohup python3 scripts/nas_whisper_gemini_summarize.py > nas_whisper_summarize_stdout.log 2>&1 &
echo "PID=$!"
查看进度:
tail -f ~/.openclaw/temp/xingshu/logs/nas_whisper_summarize.log
四、Obsidian 笔记模板
笔记文件位于:~/Workspace/nexus/knowledgebase/
---
title: "音视频标题"
type: transcription
source-type: video
category: "你的分类路径"
tags:
- 标签1
- 标签2
date-added: 2026-04-15
audio-source: "/path/to/audio.mp3"
transcript-source: "/path/to/transcript.txt"
status: summarized # raw → summarized
---
# 音视频标题
**Source:** /path/to/video.mp4
**Type:** VIDEO | **Category:** 你的分类
**Status:** ✅ 已完成
---
## 摘要
> [Gemini Flash 生成的中文摘要]
---
## 关键概念
- **[概念名称]**: [一句话解释]
---
## 相关笔记
> [!info]+ 交叉引用
> [[相关笔记标题]] — 关联原因
五、API Key 汇总
| 服务 | Key | 用途 | 状态 |
|---|---|---|---|
| Google Gemini | AIzaSyASNIlSc-YYP1dCqKCzk59e7MXSVrnHba0 |
摘要生成 | ✅ 有效 |
六、费用估算(100个视频,~3000分钟总时长)
| 阶段 | 工具 | 费用 |
|---|---|---|
| 音频提取 | FFmpeg | $0 |
| 语音转录 | Whisper(本地) | $0 |
| 摘要生成 | Gemini Flash | ~$0.15 |
| 合计 | ~$0.15 |
七、已知限制与注意事项
- Gemini API Key 必须有效:每 24 小时检查一次 key 状态
- Whisper 模型选择:
tiny最快但精度低,small平衡,medium/largeMacmini 内存不够 - 音频质量:Whisper 对音质敏感,背景噪音会导致转写质量下降
- 断点续传:脚本使用
.done文件记录已完成的文件,重启不会重复处理 - 文件命名:文件名中的空格和特殊字符(
_、(、))需要正确处理 - 语言参数:默认英文转录,如需其他语言可设置
language="zh"或language="auto" - 视频源路径:根据实际存放位置修改脚本中的
SOURCE_DIR变量
八、快捷命令速查
# 查看音频提取进度
cat ~/.openclaw/temp/xingshu/logs/nas_audio_v3.log | tail -10
# 查看转录摘要进度
tail -f ~/.openclaw/temp/xingshu/logs/nas_whisper_summarize.log
# 查看指定目录下 mp3 数量
ssh shenwei@192.168.3.17 "ls '/path/to/videos/'*.mp3 2>/dev/null | wc -l"
# 查看已处理摘要数量
cat ~/.openclaw/temp/xingshu/nas_whisper_summarize.done | wc -l
# 手动测试 Whisper
python3 -c "import whisper; m=whisper.load_model('small'); print(m.transcribe('test.mp3')['text'][:100])"
# 手动测试 Gemini
curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent?key=AIzaSyASNIlSc-YYP1dCqKCzk59e7MXSVrnHba0" \
-H 'Content-Type: application/json' \
-d '{"contents":[{"parts":[{"text":"say hi in 3 words"}]}]}'
九、配置说明
修改视频源路径
编辑脚本 nas_whisper_gemini_summarize.py,找到以下变量并修改:
# NAS 源视频目录(包含 mp4 文件)
SOURCE_DIR = "/volume2/work/Public Cloud Learning Sessions/"
# NAS 输出音频目录(mp3 输出位置)
AUDIO_DIR = "/volume2/work/Public Cloud Learning Sessions/"
# Obsidian 笔记目录
OBSIDIAN_NOTE_DIR = "/Users/weishen/Workspace/nexus/knowledgebase/"
# NAS SSH 连接信息
NAS_HOST = "192.168.3.17"
NAS_USER = "shenwei"
适配不同视频源
# 方案1: 另一个 NAS 路径
SOURCE_DIR = "/volume2/work/OtherVideos/"
# 方案2: 本地目录(无需 SSH)
SOURCE_DIR = "/Users/weishen/Workspace/videos/"
# 方案3: 另一个服务器
NAS_HOST = "192.168.3.45" # Ubuntu2