将视频自动转录并整理为结构化笔记的跨平台技能。
python3 scripts/check_env.py
根据输出安装缺失的工具。
cp config.example.json config.json
# 编辑 config.json,填写你的路径
必填项:
obsidian_vault — Obsidian 库绝对路径(不使用 Obsidian 可留空)
whisper_model — 推荐值:small(平衡)/ medium(高精度)/ tiny(快速测试)
可选项:
extra_paths — 手动指定工具路径(留空则自动从 PATH 检测)
note_format — obsidian(默认)或 file(保存到 temp_dir)
| 工具 | 用途 | 安装方式 |
|------|------|---------|
| Python 3.8+ | 运行脚本 | python.org |
| openai-whisper | 音频转录 | pip install openai-whisper |
| yt-dlp | 视频下载 | pip install yt-dlp |
| ffmpeg | 音频提取 | ffmpeg.org |
| PyTorch CUDA(可选) | GPU 加速 | pytorch.org |
B 站视频:
curl -s "https://api.bilibili.com/x/web-interface/view?bvid=BV1xxxxx"
提取字段:title、duration(秒)、owner.name、subtitle.list
决策:
python3 scripts/download.py "https://www.bilibili.com/video/BV1xxxxx"
也支持 BV 号简写:
python3 scripts/download.py BV1xxxxx
手动方式:
yt-dlp -o "_temp/video.%(ext)s" --no-playlist "URL"
python3 scripts/extract_audio.py "_temp/video.mp4"
支持格式:mp3(默认)、wav、flac、m4a
手动方式:
ffmpeg -i "_temp/video.mp4" -vn -acodec libmp3lame -q:a 2 "_temp/audio.mp3"
python3 scripts/transcribe.py "_temp/audio.mp3"
指定模型和语言:
python3 scripts/transcribe.py "_temp/audio.mp3" -m medium -l zh
手动方式:
python3 -c "
import whisper
model = whisper.load_model('small')
result = model.transcribe('_temp/audio.mp3', language='zh')
with open('_temp/transcript.txt', 'w', encoding='utf-8') as f:
f.write(result['text'].strip())
"
模型选择指南:
| 模型 | VRAM | 速度 | 精度 | 推荐场景 |
|------|------|------|------|---------|
| tiny | ~1 GB | 极快 | 低 | 测试 / 短视频(<5 分钟) |
| small | ~2 GB | 快 | 中 | 日常使用(推荐) |
| medium | ~5 GB | 中 | 高 | 长视频 / 专业内容 |
| large | ~10 GB | 慢 | 很高 | 最高精度需求 |
| turbo | ~5 GB | 快 | 高 | 速度与精度平衡 |
脚本自动检测 GPU(CUDA),无 GPU 自动回退 CPU。
读取转录文本后,按以下模板结构化整理:
# [视频标题]
> 视频来源:[UP 主 / 作者]
> 原视频:[链接]
> 整理时间:[YYYY-MM-DD](基于 Whisper 转录)
---
## 核心内容
### 要点 1:[标题]
[整理后的内容]
### 要点 2:[标题]
[整理后的内容]
---
## 核心洞察
- 洞察 1
- 洞察 2
---
## 实践建议
1. 建议 1
2. 建议 2
---
**笔记整理自:** [作者]《[视频标题]》
**视频链接:** [URL]
**整理日期:** [YYYY-MM-DD]
Whisper 中文常见识别错误修正:
| 错误 | 正确 | | 错误 | 正确 |
|------|------|-|------|------|
| 温馨 | 文献 | | 断路 | 段落 |
| 文件 | 文献 | | 单脸 | 单独 |
| 战线 | 展示 | | 工与商 | 供应商 |
| 耗尸耗利 | 耗时耗力 | | 业伙 | 业务伙伴 |
| 求实 | 权威 | | 提亮 | 提炼 |
| API | APA(格式) | | GBT | GPT |
| 军职 | 均值 | | 围章 | 文章 |
| M学者 | Markowitz | | 中数 | 中文 |
整理原则:
python3 scripts/save_note.py "_temp/note.md" -t "[视频标题]"
根据 config.json 的 note_format 自动选择保存位置:
obsidian → 保存到 obsidian_vault 指定的库
file → 保存到 temp_dir
也可指定目标目录覆盖配置:
python3 scripts/save_note.py "_temp/note.md" -t "[标题]" -d "/自定义/路径"
rm -rf _temp/
Windows:
Remove-Item -Recurse -Force _temp
换更小的模型(large -> medium -> small -> tiny),或在 Python 中设置:
import torch
torch.cuda.set_per_process_memory_fraction(0.5, device=0)
Windows/macOS 下 ffmpeg 将进度信息输出到 stderr,可能导致非零退出码。脚本已处理:只要输出文件存在且大小 > 0 即视为成功。
可能是 Python 弃用警告。脚本通过 --no-playlist 减少多余输出,检查输出文件即可。
使用 scripts/save_note.py 保存(自动 UTF-8 编码),避免直接用 shell 重定向。
-l zh
共 2 个版本