# 音视频转录与摘要流水线 > 文档版本: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秒提取)| **命令示例:** ```bash # 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)| **安装命令:** ```bash pip3 install openai-whisper ``` **调用示例:** ```python 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`(需有效)| **摘要输出格式:** ```markdown ## 摘要 > [300-500字中文摘要] --- ## 关键概念 - **[概念名称]**: [一句话解释] --- ## 相关笔记 > [!info]+ 交叉引用 > [[相关笔记标题]] — 关联原因 ``` --- ## 三、全量流水线脚本 **脚本位置:** `~/.openclaw/temp/xingshu/scripts/nas_whisper_gemini_summarize.py` **核心逻辑:** 1. 扫描指定目录下的 `.mp3` 文件(跳过 `*.done` 中已有的) 2. `ssh cat` 下载到 Macmini 本地临时目录 3. Whisper `small` 转录 4. Gemini Flash 摘要 5. 更新 Obsidian 对应笔记(替换 `## 摘要` 到 `## 相关笔记` 之间的内容) 6. 删除本地临时文件 7. 写入 `.done` 进度文件(断点续传) **启动命令:** ```bash cd ~/.openclaw/temp/xingshu nohup python3 scripts/nas_whisper_gemini_summarize.py > nas_whisper_summarize_stdout.log 2>&1 & echo "PID=$!" ``` **查看进度:** ```bash tail -f ~/.openclaw/temp/xingshu/logs/nas_whisper_summarize.log ``` --- ## 四、Obsidian 笔记模板 笔记文件位于:`~/Workspace/nexus/knowledgebase/` ```markdown --- 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** | --- ## 七、已知限制与注意事项 1. **Gemini API Key 必须有效**:每 24 小时检查一次 key 状态 2. **Whisper 模型选择**:`tiny` 最快但精度低,`small` 平衡,`medium`/`large` Macmini 内存不够 3. **音频质量**:Whisper 对音质敏感,背景噪音会导致转写质量下降 4. **断点续传**:脚本使用 `.done` 文件记录已完成的文件,重启不会重复处理 5. **文件命名**:文件名中的空格和特殊字符(`_`、`(`、`)`)需要正确处理 6. **语言参数**:默认英文转录,如需其他语言可设置 `language="zh"` 或 `language="auto"` 7. **视频源路径**:根据实际存放位置修改脚本中的 `SOURCE_DIR` 变量 --- ## 八、快捷命令速查 ```bash # 查看音频提取进度 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`,找到以下变量并修改: ```python # 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" ``` ### 适配不同视频源 ```python # 方案1: 另一个 NAS 路径 SOURCE_DIR = "/volume2/work/OtherVideos/" # 方案2: 本地目录(无需 SSH) SOURCE_DIR = "/Users/weishen/Workspace/videos/" # 方案3: 另一个服务器 NAS_HOST = "192.168.3.45" # Ubuntu2 ```