# 音视频转录与摘要流水线

> 文档版本：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
```
