Files
hmo 04db423416 Initial commit: skills library
- 70 skills with code and documentation
- Add .gitignore (ignore __pycache__, output/, temp/, venv/)
- Clean up test intermediates and caches
2026-04-26 19:27:40 +08:00

277 lines
9.7 KiB
Markdown
Raw Permalink 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.
---
name: piano-lesson-highlight-generator
description: 钢琴课精华宣传视频自动生成工具,支持从配套PPT/PDF提取知识点和音乐术语库,自动完成视频剪辑、语音转录、三级字幕纠错、添加标题和转场,生成高质量课程宣传视频。触发词:钢琴课精华、钢琴宣传视频、课程精华剪辑、钢琴课剪精华
---
# 钢琴课精华视频生成技能
## 功能说明
从钢琴课直播/录播视频中提取知识点,自动生成带字幕、标题卡、转场效果的精华宣传视频。
## 适用场景
- 钢琴课课后精华片段制作
- 钢琴培训机构宣传视频生成
- 课程知识点切片归档
- 同类型音乐/艺术类课程视频剪辑
---
## 🚨 环境配置(最重要,先看这里)
### 必须使用的 Python 环境
```
D:\ProgramData\anaconda3\envs\py312_cuda\python.exe
```
### ⚠️ 两个容易混淆的 conda 安装
| 路径 | PyTorch | CUDA | 能用吗? |
|------|---------|------|---------|
| `D:\AI\Miniconda3\python.exe` | 2.11.0+**cpu** | **False** | ❌ **不能用**,转录会超时 |
| `D:\ProgramData\anaconda3\envs\py312_cuda\python.exe` | 2.5.1+**cu121** | **True** | ✅ **用这个** |
> **关键区别**Miniconda 的 PyTorch 是纯 CPU 版本,转录 100 分钟视频会超时(30+ 分钟)。必须用 `py312_cuda` 环境。
### 验证环境
```bash
"D:/ProgramData/anaconda3/envs/py312_cuda/python.exe" -c "import torch; print(torch.cuda.is_available())"
# 必须输出 True
```
### 模型路径
```
D:/AI/LM-Models/faster-whisper/large-v3/
```
包含 5 个文件:config.json, model.bin, preprocessor_config.json, tokenizer.json, vocabulary.json
### 完整依赖清单
| 包 | 版本 | 用途 |
|---|------|------|
| Python | 3.12.13 | 运行时 |
| torch | 2.5.1+cu121 | GPU 加速 |
| faster-whisper | 1.2.1 | Whisper 转录 |
| zhconv | 1.4.3 | 繁体转简体 |
| pypinyin | 0.55.0 | 拼音转换(AI 纠错) |
| pyyaml | 6.0.3 | 配置文件解析 |
### 如果环境不存在,重建步骤
```bash
# 1. 创建环境
"D:/ProgramData/anaconda3/Scripts/conda.exe" create -n py312_cuda python=3.12 -y
# 2. 安装 CUDA PyTorch
"D:/ProgramData/anaconda3/envs/py312_cuda/python.exe" -m pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# 3. 安装依赖
"D:/ProgramData/anaconda3/envs/py312_cuda/python.exe" -m pip install faster-whisper zhconv pypinyin pyyaml
```
---
## 调用方式
```bash
cd .opencode/skills/piano-lesson-highlight-generator
# 步骤1:知识点提取 + config 生成(含 GPU 转录,约 20-30 分钟)
"D:/ProgramData/anaconda3/envs/py312_cuda/python.exe" scripts/extract_terms_from_ppt.py <pptx路径> <视频路径> <config输出路径>
# 步骤2:精华视频生成(复用转录,约 2-3 分钟)
"D:/ProgramData/anaconda3/envs/py312_cuda/python.exe" scripts/generate_highlights.py --config <config路径>
```
### 完整示例
```bash
cd .opencode/skills/piano-lesson-highlight-generator
# 提取知识点(自动转录视频 + 匹配时间戳 + 生成 config)
"D:/ProgramData/anaconda3/envs/py312_cuda/python.exe" scripts/extract_terms_from_ppt.py ^
"D:/F/NewI/opencode/daily-workspace/projects/piano-lesson-highlights/data/lesson3/course.pptx" ^
"D:/F/yc/课程上架/福田商圈夜校/课程视频/直播回放-03月30日.mp4" ^
"D:/F/NewI/opencode/daily-workspace/projects/piano-lesson-highlights/cases/lesson3/config.yaml"
# 生成视频
"D:/ProgramData/anaconda3/envs/py312_cuda/python.exe" scripts/generate_highlights.py ^
--config "D:/F/NewI/opencode/daily-workspace/projects/piano-lesson-highlights/cases/lesson3/config.yaml"
```
---
## 项目目录结构
```
projects/piano-lesson-highlights/
├── data/ # 原始输入数据(只读)
│ ├── lesson2/
│ │ ├── video.mp4
│ │ └── course.pptx
│ └── lesson3/
│ └── ...
└── cases/ # 每个案例的工作区(独立)
├── lesson2/
│ ├── config.yaml # 自动生成的配置
│ ├── intermediates/
│ │ └── full_transcript.json # 完整转录(可复用)
│ └── output/
│ ├── v1_final.mp4 # 最终视频
│ ├── subs/
│ │ ├── v1_original.srt
│ │ ├── v1_terms.srt
│ │ └── v1_ai.srt
│ └── intermediates/
│ ├── clip1.mp4 ~ clipN.mp4
│ ├── clip1_fade.mp4 ~ clipN_fade.mp4
│ ├── clip1.json ~ clipN.json
│ └── concated.mp4
└── lesson3/
└── ...
```
**铁律**:每次处理新视频时,必须创建新的独立目录,不得复用旧的 intermediates 或 subs 文件夹。
---
## 工作流程
### 步骤1:知识点提取(extract_terms_from_ppt.py
1. **从 PPT 提取知识点**:解析 PPTX XML,找到"本课主要知识点"页面
2. **GPU 转录整段视频**:每 5 分钟一段,使用 faster-whisper large-v3 + CUDA
- 转录前自动清理残留 Python 进程,释放 GPU 显存
- 转录完成后显式释放模型(`del model` + `gc.collect()` + `torch.cuda.empty_cache()`
3. **定位教学锚点**:找到知识点首次出现时间,作为教学开始
4. **定位作业锚点**:用"作业"词密度定位,而非固定引导语
5. **匹配知识点到时间戳**
- 使用完整关键词 + 核心子词 + 相关词映射 + 数字归一化
- 评分综合考量:出现次数、文本量、讲解密度、孤立程度
- 排除导读区(无讲解特征 + segment ≤ 2 个 → 跳过)
- 排除回顾区(靠近作业时间惩罚 + 回顾性语言检测)
6. **匹配作业片段**
- 模糊匹配 30+ 种口语化结束表达
- 检测到结束语言后 +30s 兜底
- 无结束语言时用 45s 间隔截断
7. **生成 config.yaml**
### 步骤2:精华视频生成(generate_highlights.py
1. **提取视频片段**:按 config 时间点截取,添加 1s 淡入淡出
- 自动修复重叠:调整前一个片段的 end 使其等于后一个的 start
2. **转录片段**:优先复用 `full_transcript.json`,按时间切片映射
- 时间戳限制在 clip 实际时长范围内
- 内容验证:先应用术语纠正再匹配关键词
3. **三级字幕**
- v1_original:原始转录 + 繁简转换
- v1_terms:术语库纠正(黑剑→黑键、副点→附点等)
- v1_ai:AI 上下文纠错(语义异常 + 拼音推断 + 专有名词补全)
4. **视频合成**:标题卡 + 字幕烧录 + 片段合并
---
## 配置文件格式(YAML
```yaml
video_src: "视频文件路径.mp4"
output_dir: "输出目录路径"
# 知识点片段
clips:
- title: "八分音符"
start: 2332
end: 2362
- title: "作业"
start: 6515
end: 6997
# 术语纠正表
term_corrections:
黑剑: 黑键
负点: 附点
副点: 附点
实质: 时值
演音: 延音
言音: 延音
阅历: 乐理
# 视频参数
video_params:
fade_duration: 1
title_duration: 3
title_fontsize: 90
title_color: FFFF00
subtitle_fontsize: 24
subtitle_color: FFFFFF
whisper_model: large
use_fast_whisper: true
whisper_model_path: "D:/AI/LM-Models/faster-whisper/large-v3"
```
---
## 知识点匹配架构
### 相关度评分
| 匹配类型 | 分数 | 示例 |
|---------|------|------|
| 完整关键词 | 3.0 | "附点音符" 匹配 "附点音符" |
| 数字归一化 | 2.5 | "十六分音符" 匹配 "16分音符" |
| 核心子词 | 2.0 | "双音的支撑" 匹配 "双音支撑" |
| 相关词映射 | 1.5 | "升降记号" 匹配 "升号"/"降号" |
| 前缀匹配 | 1.5 | "附点音符" 匹配 "附点" |
| 核心词 | 1.0 | 3-4 字核心词匹配 |
### 教学特征识别
| 特征 | 检测方式 |
|------|---------|
| 实际教学 | 讲解词占比高(因为/所以/就是/什么意思/为什么/怎么/弹/按/练) |
| 导读提及 | 无讲解特征 + segment ≤ 2 个 → 跳过 |
| 回顾总结 | 靠近作业时间 + "刚才"/"今天学了" → 降权 |
| 推迟预告 | "等下再说"/"后面讲" → 大幅降权 |
### 作业结束检测(模糊匹配 30+ 种表达)
| 类型 | 匹配模式 | 示例 |
|------|---------|------|
| 明确下课 | `下课``拜拜``再见` | "下课" |
| 作业完成 | `作业.*就这样``作业.*就这些``作业.*讲到这里` | "今天的作业就这样" |
| 通用结束 | `就到这里``就这样了``说完了``没什么.*说的` | "就这些了" |
| 群发通知 | `发群``到时候.*发` | "到时候我发群里" |
---
## 验证标准
- [ ] GPU 加速下,转录 100 分钟视频约 20-30 分钟
- [ ] 最终视频总时长建议 < 15 分钟
- [ ] 每个知识点开头显示 3 秒黄色标题卡(90 号字,黑边,居中)
- [ ] 字幕为简体中文,24 号白字黑边,位于底部
- [ ] 片段间有 1 秒淡入淡出转场
- [ ] 输出文件真实存在且可播放
---
## 已知限制
1. **Python 版本**:必须 3.123.13 不支持 CUDA 版 PyTorch
2. **GPU 依赖**:必须 GPU 加速,CPU 转录 100 分钟视频需要 100+ 分钟
3. **转录精度**:Whisper 对专业音乐术语可能有识别误差(如"附点"→"副点"),依赖术语纠正表修正
4. **数字识别**:Whisper 可能将中文数字识别为阿拉伯数字("十六"→"16"),已内置数字归一化匹配
5. **中文字体**:标题卡需要 Windows 系统字体 `C:/Windows/Fonts/msyh.ttc`(微软雅黑)
---
## 重新生成机制
如果用户发现字幕错误:
1. 告知具体错误内容 + 需要基于哪个版本修改
2. 直接修改对应的 srt 文件
3. 使用 ffmpeg 重新烧录:`ffmpeg -i concated.mp4 -vf "subtitles=修改后的.srt:force_style='...'" -c:a copy new_version.mp4`