6.7 KiB
6.7 KiB
Cloud Learning 音视频处理流水线
文档版本:2026-04-15 维护者:星枢(xingshu) 状态:✅ 已验证可运行
一、整体架构
NAS 视频源
│
▼
[阶段1] FFmpeg 音频提取
│ MP4 → MP3
▼
NAS MP3 文件库
│
▼
[阶段2] Whisper 转录
│ MP3 → 英文字幕/转写稿
▼
Macmini 本地转写稿
│
▼
[阶段3] Gemini Flash 摘要
│ 转写稿 → 结构化中文笔记
▼
Obsidian 知识库
二、各阶段详解
阶段 1:FFmpeg 音频提取
| 项目 | 说明 |
|---|---|
| 输入 | NAS 上的 .mp4 文件(/volume2/work/Public Cloud Learning Sessions/) |
| 输出 | 同目录下的同名 .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 '/volume2/work/Public Cloud Learning Sessions/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 > '/volume2/work/Public Cloud Learning Sessions/VIDEO.mp3'"
脚本位置: ~/.openclaw/temp/xingshu/scripts/nas_audio_extract_v3.py
阶段 2:Whisper 转录
| 项目 | 说明 |
|---|---|
| 输入 | NAS 上的 .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(英文)
阶段 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
核心逻辑:
- 扫描 NAS 上已完成的
.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/DevOps & SRE/
---
title: "视频标题"
type: cloud-learning
source-type: video
category: "DevOps & SRE/01_AWS-Landing-Zone"
tags:
- AWS
- Landing-Zone
date-added: 2026-04-14
video-source: "nas:///volume2/work/Public Cloud Learning Sessions/VIDEO.mp4"
audio-source: "nas:///volume2/work/Public Cloud Learning Sessions/VIDEO.mp3"
status: summarized # raw → summarized
---
# 视频标题
**Source:** NAS `/volume2/work/Public Cloud Learning Sessions/VIDEO.mp4`
**Type:** VIDEO | **Category:** 01_AWS-Landing-Zone
**Status:** ✅ 已完成
---
## 摘要
> [Gemini Flash 生成的中文摘要]
---
## 关键概念
- **[概念名称]**: [一句话解释]
---
## 相关视频
> [!info]+ 交叉引用
> [[相关视频文件名]] — 关联原因
五、API Key 汇总
| 服务 | Key | 用途 | 状态 |
|---|---|---|---|
| Google Gemini | AIzaSyASNIlSc-YYP1dCqKCzk59e7MXSVrnHba0 |
摘要生成 | ✅ 有效 |
| MiniMax | sk-cp-H0FwKNry9PnMJm... |
Whisper 转录 | ❌ Whisper端点404,token plan不支持模型 |
⚠️ MiniMax API Key 目前不可用(Whisper 端点 404,文本模型 500),Whisper 改用本地模型。
六、费用估算(100个视频,~3000分钟总时长)
| 阶段 | 工具 | 费用 |
|---|---|---|
| 音频提取 | FFmpeg | $0 |
| 语音转录 | Whisper(本地) | $0 |
| 摘要生成 | Gemini Flash | ~$0.15 |
| 合计 | ~$0.15 |
七、已知限制与注意事项
- Gemini API Key 必须有效:每 24 小时检查一次 key 状态
- Whisper 模型选择:
tiny最快但精度低,small平衡,medium/largeMacmini 内存不够 - 音频质量:Whisper 对音质敏感,背景噪音会导致转写质量下降
- 断点续传:脚本使用
.done文件记录已完成的文件,重启不会重复处理 - 文件命名:文件名中的空格和特殊字符(
_、(、))需要正确处理
八、快捷命令速查
# 查看音频提取进度
cat ~/.openclaw/temp/xingshu/logs/nas_audio_v3.log | tail -10
# 查看转录摘要进度
tail -f ~/.openclaw/temp/xingshu/logs/nas_whisper_summarize.log
# 查看 NAS 已完成 mp3 数量
ssh shenwei@192.168.3.17 "ls '/volume2/work/Public Cloud Learning Sessions/'*.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"}]}]}'