Files
nexus/openclaw/xingshu/cloud-learning-audio-pipeline.md

301 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 音视频转录与摘要流水线
> 文档版本2026-04-15
> 维护者星枢xingshu
> 状态:✅ 已验证可运行
> 适用场景:教学视频、讲座、播客、会议录音等任意音视频内容的转录与知识库导入
---
## 一、整体架构
```
视频/音频源(本地或 NAS
[阶段1] FFmpeg 音频提取
│ MP4/AVI/MKV → MP3
本地/共享 MP3 文件库
[阶段2] Whisper 转录
│ MP3 → 英文字幕/转写稿
本地转写稿
[阶段3] Gemini Flash 摘要
│ 转写稿 → 结构化中文笔记
Obsidian 知识库
```
---
## 二、各阶段详解
### 阶段 1FFmpeg 音频提取
| 项目 | 说明 |
|---|---|
| **输入** | `.mp4``.avi``.mkv``.mov` 等常见视频格式 |
| **输出** | 同目录下的同名 `.mp3` 文件 |
| **工具** | FFmpegMacmini 已安装:`/opt/homebrew/bin/ffmpeg` |
| **转码参数** | `-vn -acodec libmp3lame -ab 64k -ar 22050 -ac 1`64kbps CBR针对人声优化|
| **传输方式** | `ssh cat` 管道NAS 不需要挂载)|
| **速度** | ~400x realtime1小时视频 ≈ 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`
---
### 阶段 2Whisper 转录
| 项目 | 说明 |
|---|---|
| **输入** | `.mp3` 文件已由阶段1生成或直接提供的音频文件|
| **输出** | 英文字幕/转写稿(纯文本)|
| **工具** | `openai-whisper`Python 包,通过 `pip install openai-whisper` 安装)|
| **模型** | `small`精度与速度平衡M 系列芯片友好)|
| **硬件** | Macmini 本地运行Neural Engine 加速)|
| **速度** | ~50x realtime1小时音频 ≈ 40-50秒|
| **内存** | ~1.5GBsmall 模型)|
| **费用** | 完全免费(本地运行,无需 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 不推荐)|
---
### 阶段 3Gemini Flash 摘要
| 项目 | 说明 |
|---|---|
| **输入** | Whisper 转写的英文字幕/转写稿 |
| **输出** | 结构化中文笔记(摘要 + 关键概念 + 相关链接)|
| **工具** | Google Gemini API直接 HTTP 调用,不依赖 summarize CLI|
| **模型** | `gemini-3-flash-preview` |
| **费用** | ~0.075$/百万输入 tokens3000分钟音频 ≈ ~$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
```