301 lines
7.9 KiB
Markdown
301 lines
7.9 KiB
Markdown
# 音视频转录与摘要流水线
|
||
|
||
> 文档版本: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
|
||
```
|