git:20260521.369ff17 to git:20260523.acb6ae8

115 added, 148 removed. Audit A to A.

---
name: laohan-luping
- description: 录屏视频转口播稿的完整工作流。输入一段电脑录屏视频(mp4),自动完成音频提取→语音转文字→结构化整理→口播稿写作→封面提示词生成。使用场景:(1) 用户有录屏视频想做口播 (2) 用户说"录屏转口播""录屏素材写稿""视频转口播稿" (3) 用户提供了录屏/屏幕录制视频文件并要求写口播稿。触发词:/laohan-luping。输出到 ~/.openclaw/workspace-shared/tasks/task_YYYYMMDD_中文关键词/
+ description: 口播稿转录屏脚本(CLI+浏览器),自动生成ffmpeg录制脚本并输出MP4。Use when 用户说"录屏""录制教程""录视频""录一段""screen record""补录""口播稿转录屏""浏览器录屏""录网页"或提到录制Claude Code画面或浏览器操作。
---
- # 录屏转口播稿(laohan-luping)
-
- 把一段即兴录屏讲解视频,转化为老韩风格的高质量口播稿 + 封面提示词。
-
- ## 使用
-
- ```
- /laohan-luping <视频文件路径>
- ```
-
- ## 完整流程
+ # 录屏自动化:口播稿 → 录屏脚本 → MP4
- ### Step 0:初始化
+ 输入一篇口播稿(或录屏指示),自动生成 bash 录屏脚本。脚本编排 CLI 操作(tmux+Claude Code)和浏览器操作(Playwright headed),ffmpeg 录物理屏幕,输出 1080p MP4。
- 1. 从视频文件名提取主题关键词
- 2. 创建任务目录:
- ```
- ~/.openclaw/workspace-shared/tasks/task_YYYYMMDD_中文关键词/
- ```
- 3. 写入 `goal.md`:标题、视频路径、说明
+ ## 核心理念
- ### Step 1:提取音频
+ **口播稿即脚本蓝图。** 每段口播对应一个屏幕操作(CLI 命令/浏览器导航/静态等待),从口播稿里提取出操作序列和时长,填入录制模板。
- ```bash
- ffmpeg -i "<视频路径>" -vn -acodec libmp3lame -q:a 2 "/tmp/录屏音频_$(date +%s).mp3" -y
- ```
+ **看到什么录什么。** ffmpeg 录物理屏幕,tmux 前台显示终端,Playwright headed 显示浏览器。两种"演员"按口播稿交替出场。
- ### Step 2:语音转文字
+ **录屏是素材,不是生产。** 录制过程中的临时文件全部自动清理,只保留最终 MP4。
- 优先级:
- 1. 硅基流动 API(免费,快):
- ```bash
- curl -s -X POST "https://api.siliconflow.cn/v1/audio/transcriptions" \
- -H "Authorization: Bearer $SILICONFLOW_API_KEY" \
- -F "model=FunAudioLLM/SenseVoiceSmall" \
- -F "file=@<音频文件>" \
- -F "language=zh" -F "response_format=json"
- ```
- 2. whisper-cli(本地快):
- ```bash
- whisper-cli --model /opt/homebrew/share/whisper.cpp/ggml-small.bin --language zh --no-timestamps --output-txt --output-file <prefix> <audio.wav>
- ```
- 3. Python whisper small(最准)
+ ## 工作流
- 转录结果保存为 `task_dir/source.md`
+ ### 1. 输入口播稿
- ### Step 3:结构化整理(虾2进宝工作流)
+ 接收用户提供的:
+ - 口播稿文件路径(`script.md`)
+ - 或录屏指示文件路径(`录屏指示.md`)
+ - 或直接描述要录制什么
- 读取 `references/organize-skill.md`(skill.md v3.4 Layer A/B 结构模板),按模板整理 `source.md` → `organize_output.md`
+ 如果用户提供了口播稿但没有录屏指示 → 根据口播稿内容自动推断每段对应的操作。
+ 如果用户提供了录屏指示 → 直接用指示里的操作序列。
- **必须包含的字段:**
- - 素材基础信息(标题/作者/时长/目标观众)
- - 黄金开局钩子(痛点场景 + 渴望结果 + 核心冲突)
- - 结构化内容模块(每个含:时间坐标/核心观点/论证链路/关键证据/核心原话)
- - 断言台账(≥3条)
- - Layer B:受众痛点映射 + 跨域延伸(含反常识发现)+ 可执行精华收获
- - 核心选题提炼(一句话主题 ≤15字 + 标题底子 + 模块映射 + 裁剪建议)
+ - **完成条件:** 拿到完整的操作序列和每步时长
- ### Step 4:选题确认(动笔前必答)
+ ### 2. 解析口播稿→操作序列
- 读完 organize_output.md 后,回答以下问题(不跳过):
+ 从口播稿/录屏指示中提取。操作分为三种类型:
- 1. 确认主题:adopt organize_output 第3节的一句话主题
- 2. 判断素材类型:技术解读 / 人物访谈 / 新闻盘点 / 悬念推理 → 选择对应开场/结构/结尾
- 3. 黄金开局钩子的三个锚点:痛点场景 / 渴望结果 / 核心冲突
- 4. 裁剪建议
- 5. 读者看完最想分享的一句话 = 全篇论点
- 6. 论点锚定
+ **CLI 操作**(tmux + Claude Code):
- ### Step 5:规划(不写稿)
+ | 口播段落 | 屏幕操作 | 脚本动作 |
+ |---------|---------|---------|
+ | "说「抓今天的AI精选」" | 执行命令 | `send_cmd "抓今天的AI精选"` |
+ | "说「帮我写口播稿」" | 执行命令 | `send_cmd "帮我写口播稿"` |
+ | "展示 output/ 文件夹" | 查看命令 | `send_cmd "ls output/"` |
- 读取 `references/writer-style.md`(老韩口播风格 v3.2),输出 11 项规划:
+ **浏览器操作**(Playwright headed):
- 1. 一句话论点
- 2. 素材类型判断 + 对应结构
- 3. 核心主题贯穿规划(标题关键词出现≥5个位置)
- 4. Layer 精华筛选(必含/选择含/跳过)
- 5. 场景规划(1个核心生活场景 + 代入式互动点)
- 6. 改写策略(comprehensive/angle/structure/depth)
- 7. 目标读者
- 8. 技法选配(#1-#4核心骨架 + 反常识钩子 + #15回环呼应 + #18框架命名 + #19签名互动 + 横向对比 + 3-4条动态技法,总计≥7条)
- 9. 结构错位方案(与原稿重合度<60%)
- 10. 金句/比喻处理清单
- 11. 老韩增量点(≥2处新信息/新视角/新类比)
+ | 口播段落 | 屏幕操作 | 脚本动作 |
+ |---------|---------|---------|
+ | "打开 GitHub 项目页" | 导航到 URL | `browser_goto "https://github.com/..."` |
+ | "看一下 README" | 页面滚动 | `browser_scroll 500` |
+ | "点击安装文档" | 点击链接 | `browser_click "a[href='docs']"` |
+ | "展示项目截图" | 静态展示 | `browser_wait 3000` |
- 规划保存为 `task_dir/plan.md`
+ **静态操作**(纯等待):
- ### Step 6:执行改写
+ | 口播段落 | 屏幕操作 | 脚本动作 |
+ |---------|---------|---------|
+ | 开场白/过渡/结尾 | 静态画面 | `sleep N` |
- 按 style.md 写口播稿,硬性要求:
+ 提取规则:
+ - 引号里的内容(「」或"")→ 直接作为 send_cmd 的参数
+ - 提到 URL / GitHub / 网站 / 文档 → 浏览器操作
+ - 提到终端/命令/CLI → CLI 操作
+ - 纯叙述段落 → 按口播时长估算 sleep 秒数(正常语速约 3 字/秒)
+ - CLI 命令需要等 Claude 完成的 → 加 `wait_for_claude`
+ - 浏览器页面需要阅读时间的 → 加 `browser_wait`
- - 固定开场白:「你有没有这种感觉,」(8字固定)
- - 5秒内给锚点(结论/反直觉观点/愣住的事实)
- - 开场≤120字
- - 第一行 `# 标题`(<30字,两段式)
- - 短句比例≥60%,关键节奏点≤15字
- - 标题关键词正文≥5次
- - 每个核心论点后有场景或互动
- - 转场用转场句式库,禁"首先其次最后"
- - 冒号→逗号,双引号→「」
- - #19 签名互动「是不是有点意思」3-5次
- - ≥4种废话感元素(不出现在开场和告别语)
- - 节奏快慢交替
+ - **完成条件:** 生成结构化的操作列表,每条含类型(cli/browser/static)、内容、等待方式、标签
- 口播稿保存为 `task_dir/script.md`
+ ### 3. 环境检测
- ### Step 7:质量检查(六关)
+ ```bash
+ which ffmpeg && which tmux && which node
+ ffmpeg -f avfoundation -list_devices true -i "" 2>&1 | grep "Capture screen"
+ node -e "require('playwright')" 2>/dev/null && echo "playwright OK" || echo "playwright missing"
+ ```
- **E. 内容底线**(命中任一 = 不通过):
- - Layer A 覆盖<80% / 无反常识 / 无可执行收获 / 标题关键词<5次 / 偏离主题 / 无生活场景
+ - 缺工具 → 提示安装
+ - 多屏幕 → 让用户确认索引
+ - 缺 Playwright → `npm install playwright`
+ - **完成条件:** 确认屏幕索引 + Playwright 可用(如需浏览器段)
- **D. 二创脱敏**(最高优先级。注:教程型(模式 A)天然不存在二创痕迹问题,按步骤教学的内容可跳过此检查):
- - 结构重合>60%(非信息密集型)/ 替换比喻更弱 / 老韩增量<2 / 整段搬运>3句
+ ### 4. 生成录制脚本
- **A. 正则检查**:
- - 禁模板连接词、AI填充、夸大意义、模糊归因、标题党、通用结尾、空洞大词
- - 禁词:意味着什么/本质上/换句话说/不可否认/综上所述/值得注意的是/赋能/抓手/赛道/壁垒/痛点
+ 基于 `scripts/record_template.sh` 模板生成。模板包含:
+ - ffmpeg 录屏启动/停止
+ - tmux 会话管理(CLI 段)
+ - Playwright 浏览器控制(浏览器段)
+ - `send_cmd()`、`wait_for_claude()`、`browser_*()` 函数
+ - 1080p 转码 + 临时文件清理
- **B. 禁区**:禁用词 + 冒号→逗号 + 双引号→「」 + 禁"首先其次最后"
+ 填充内容:
+ - **CLI 段**:命令序列块(send_cmd + wait_for_claude)
+ - **浏览器段**:导航 JSON 文件(`browser_actions.json`)
+ - **切换时机**:口播稿段落顺序决定 CLI/浏览器交替
- **B2. AI味**:禁体制化开头/空心强化/三连排比/冒号堆砌/过度总结/假设复数
+ 如果只有 CLI 段 → 纯 CLI 模式(不启动浏览器)。
+ 如果只有浏览器段 → 纯浏览器模式(不启动 tmux)。
+ 两者都有 → 混合模式。
- **C. 技法**:核心骨架#1-#4全含 + 反常识钩子 + #15回环 + #18框架命名(≥3次) + #19签名互动(3-5次) + 横向对比(≥1次) + 动态技法(3-4条) = 总计≥7条
+ 生成脚本写到用户指定目录(或当前目录),文件名格式:`record_<教程名>.sh`
- 不通过则重写(最多2轮)。
+ ### 5. 交付+指导
- ### Step 8:封面提示词
+ 输出:
+ 1. 生成的 `record_xxx.sh` 脚本(含 `browser_actions.json` 如有浏览器段)
+ 2. 运行命令:`bash record_xxx.sh`
+ 3. 提醒:
+ - 终端全屏(Cmd+Enter)
+ - 开勿扰模式
+ - 按回车后别碰键盘鼠标
+ - Gate 确认框按回车继续
- 读取 `~/.agents/skills/laohan-fengmianqiuzhi/SKILL.md`(封面提示词生成规则),基于 script.md 生成封面提示词。
+ **不自动执行脚本** — 录屏需要用户手动在终端启动。
- 从 script.md 第一行提取标题,生成 3 种风格 × 3 种比例 = 9 个 Gemini 提示词。
+ ## 操作规则
- 输出到:
- ```
- {task_dir}/<标题>_prompts.md(与 script.md 同级)
- ```
+ - **口播稿驱动** — 每个操作都能追溯到口播稿的某一段
+ - **不自动执行录屏脚本** — 涉及屏幕接管,必须用户手动运行
+ - **屏幕索引需确认** — 不同机器配置不同,不能硬编码
+ - **CLI/浏览器交替自然** — 切换时加短暂 sleep(1-2s),模拟自然切换
+ - **浏览器滚动模拟真人** — 分段滚动 200-400px,间隔 500-800ms
+ - **静态段落用 sleep** — 开场/过渡/结尾等无操作段落,按口播字数÷3估算秒数
+ - **临时文件全部清理** — Claude 工作目录 + raw 文件 + browser JSON,只保留最终 MP4
- ### Step 9:幻灯片图片素材(NotebookLM)
+ ## 不适用场景
- 读取 `~/.agents/skills/laohan-notebooklm/SKILL.md`(NotebookLM 幻灯片生成规则),基于 script.md 生成幻灯片图片。
+ - 录制桌面应用(非终端非浏览器) → 用 OBS
+ - 带声音解说 → 需额外配置音频输入
+ - 实时直播 → 这是录制方案不是直播方案
+ - 需要登录态的浏览器操作 → 用 opencli Browser Bridge
- 1. 从 script.md 路径提取标题(`task_YYYYMMDD_` 后面部分,下划线转空格)
- 2. `mkdir -p ~/Desktop/<标题>_slides`
- 3. `cp script.md ~/Desktop/<标题>_slides/script.md`
- 4. 创建笔记本:`nlm notebook create "<标题>PPT"`
- 5. 上传口播稿原文:`nlm source add NOTEBOOK_ID --file ~/Desktop/<标题>_slides/script.md`
- 6. 触发生成:`echo "y" | nlm slides create NOTEBOOK_ID --language zh-CN --length default`
- 7. 后台轮询+下载+转图片(轮询间隔30秒,最多20轮;下载重试3次;`pdftoppm -png -r 200` 转 PNG)
+ ## 浏览器操作 JSON 格式
- 输出到:
- ```
- ~/Desktop/<标题>_slides/
- ├── script.md
- ├── <标题>.pdf
- ├── slide-01.png
- ├── slide-02.png
- └── ...
+ ```json
+ {
+ "viewport": { "width": 1920, "height": 1080 },
+ "steps": [
+ { "action": "goto", "url": "https://github.com/xxx", "label": "打开项目页" },
+ { "action": "wait", "ms": 3000 },
+ { "action": "scroll", "pixels": 600, "smooth": true },
+ { "action": "wait", "ms": 2000 },
+ { "action": "click", "selector": "a[href='/xxx/docs']", "label": "点击文档" },
+ { "action": "wait", "ms": 3000 }
+ ]
+ }
```
- ### Step 10:输出汇总
-
- 最终产出文件清单:
-
- | 文件 | 说明 |
- |------|------|
- | `task_dir/goal.md` | 任务目标 |
- | `task_dir/source.md` | 原始转录文本 |
- | `task_dir/organize_output.md` | Layer A/B 结构化素材 |
- | `task_dir/plan.md` | 规划文档 |
- | `task_dir/script.md` | 口播稿 |
- | `task_dir/<标题>_prompts.md` | 封面提示词 |
- | `~/Desktop/<标题>_slides/slide-*.png` | 幻灯片图片素材(剪映用) |
-
- ## 依赖
-
- - ffmpeg:音频提取
- - 硅基流动 API($SILICONFLOW_API_KEY)或 whisper-cli:语音转文字
- - nlm CLI v0.5.25 + poppler:NotebookLM 幻灯片生成
- - style.md / skill.md / 封面规则:references 目录下
+ 支持的 action:`goto`、`wait`、`scroll`、`click`。
- ## 参考文件加载时机
+ ## 踩坑速查
- | 文件 | 何时读取 |
- |------|---------|
- | `references/organize-skill.md` | Step 3 整理时 |
- | `references/writer-style.md` | Step 5-6 写稿时 |
- | `~/.agents/skills/laohan-fengmianqiuzhi/SKILL.md` | Step 8 封面时 |
- | `~/.agents/skills/laohan-notebooklm/SKILL.md` | Step 9 幻灯片时 |
+ | 问题 | 原因 | 解决 |
+ |------|------|------|
+ | 录错屏幕 | 多显示器索引不对 | `ffmpeg -list_devices` 确认 |
+ | tmux 里 claude 立即退出 | 网络/初始化偶发问题 | 重跑 |
+ | 画面静止 | claude 等待输入 | 手动按回车 |
+ | 视频太大 | CRF 值太低 | 改 `-crf 23` |
+ | 命令没发完 | 超时 | 增大 `max_wait` |
+ | 浏览器窗口尺寸不对 | viewport 不匹配 | JSON 里设 viewport |
+ | Playwright 启动失败 | 未安装 | `npm install playwright` |