首页 / 全部技能 / 内容创作 / cut-mistakes
内容创作 · nateherkai/hyperframes-student-kit

cut-mistakes

Agent 2 of the video editing pipeline. Finds and removes spoken mistakes — stutters, repeated words, false starts, and retakes (re-recorded lines) — from a talking-head recording. Use after cut-silences, when asked to cut mistakes, remove stutters / repeats / filler restarts, clean up flubs, or keep the best take. Works review-gated: it proposes every cut with context and a reason for approval, then renders only the approved cuts via ffmpeg. Requires a word-level transcript.

风险提醒:蓝色 · 知晓即可AI 侦查报告
作者 nateherkaiGitHub nateherkai/hyperframes-student-kit ↗Stars 1070许可 NOASSERTION(仓库根 LICENSE,实为 MIT 文本)commit 0d30152a82
agent 宿主通常会约束 skill 执行权限;风险提醒为 AI 侦查观点,不构成质量或安全保证。第三方 skill 仅作拆解与展示,安装使用风险自负,版权归原作者。

1实现原理 · 为什么它能做到

把「口误」拆成三步流水线:机械找候选 → 必经的审查门 → 只渲染被批准的切点。判断留给 LLM/人,算术留给脚本。

.claude/skills/cut-mistakes/SKILL.md
### 1. Find candidates (mechanical) … ### 2. Review (the gate — REQUIRED) … ### 3. Apply approved cuts
注:SKILL.md 的核心设计:检测脚本只产出候选 + 置信度 + 默认建议,批准清单是渲染的唯一输入。

结巴(stutter)判定=相邻两词 token 相同且间隔 <0.5s;默认删前留后。

.claude/skills/cut-mistakes/scripts/find-cut-candidates.mjs
const closeGap = b.start - a.end < 0.5; if (a.token === b.token && closeGap) { … // remove the first utterance, keep the second cut: { start: Number(a.start.toFixed(3)), end: Number(b.start.toFixed(3)) },
注:token 先经 cleanToken() 去首尾非字母数字,所以 "the." 与 "the" 会判为同一 token;候选里带 removes/keeps/context 供人判断。

重录(retake)与假起点的检测不靠规则枚举,而是先按停顿/句末/16s 上限切段,再用停用词过滤后的签名做 Jaccard 相似度比对。

.claude/skills/cut-mistakes/scripts/find-cut-candidates.mjs
if (gap > 0.85 || (sentenceEnd && elapsed >= 7.5) || elapsed >= 16) { … const stop = new Set("a an and are as at be but by for from i if in is it of on or so that this to was we with you your they their there what when where why how like um uh".split(" ")); … const score = jaccard(sigs[i], sigs[j]); const sameOpening = sigs[i].slice(0, 4).filter((t, idx) => t === sigs[j][idx]).length >= 2; if (score >= 0.34 || (score >= 0.24 && sameOpening)) {
注:相似度阈值双轨:score≥0.34 直接算重复,≥0.24 且开头 4 词有 2 词相同也算;比对窗口限制在后 8 段、间隔 ≤75s。

「短的首段 + 很快重启」判定为假起点,并把类型从 retake 改标 false_start。

.claude/skills/cut-mistakes/scripts/find-cut-candidates.mjs
const isFalseStart = sameOpening && firstLen < 6 && segments[j].start - segments[i].end < 12; … type: isFalseStart ? "false_start" : "retake",
注:类型只影响标签与说明文案,切点范围仍由同一段相似度逻辑给出(默认删掉较早那次,保留较干净的重启)。

检测器明确声明「不做决定」,且 SKILL.md 要求逐条读上下文,因为强调式重复与真口误在机械层面同形。

.claude/skills/cut-mistakes/scripts/find-cut-candidates.mjs
This is MECHANICAL detection only. It proposes candidate cut ranges with rich … context + a confidence + a default recommendation, but it does NOT decide.
注:SKILL.md 进一步写:"The mechanical detector cannot tell intentional emphasis/rhetoric from a real flub, so do not trust `recommend` blindly — read `removes` + `context`."

批准清单经 apply-cuts.mjs 转成 EDL + 重定时转录;--apply 时才用 ffmpeg trim/atrim + concat 渲染,默认干跑。

.claude/skills/cut-mistakes/scripts/apply-cuts.mjs
if (approved.some(c => c.start < 0 || c.end > duration)) die('Cut range is outside source duration bounds'); … lines.push(`[0:v]trim=start=${r.start.toFixed(3)}:end=${r.end.toFixed(3)},setpts=PTS-STARTPTS[v${i}];`); … const ff = spawnSync("ffmpeg", ["-y", "-i", videoPath, "-/filter_complex", scriptPath, "-map", "[v]", "-map", "[a]", "-c:v", "libx264", "-preset", "medium", "-crf", "18", "-c:a", "aac", "-b:a", "192k", "-movflags", "+faststart", outputPath], { stdio: ["ignore", "ignore", "inherit"] });
注:同文件先做边界校验(越界即 die),过滤脚本先落盘成 *.mistakes-filter.txt,再经 -/filter_complex 传参;无 --apply 时只打印提示 "re-run with --apply to render"。

2核心能力

01口误候选检测:结巴 / 重录 / 假起点三类,各带置信度与默认建议
02结构化候选 + 人类可读提案双产物(JSON 给 agent,MD 给人看)
03审查门:逐条读上下文再决定,而不是照单执行 recommend
04批准清单 → EDL + 重定时转录(保留 source_start/source_end 便于回查原片)
05渲染/干跑双模式:默认只出 EDL 与转录,--apply 才动 ffmpeg
06借仓库级审查工具生成可点开的 EDL 复核页面
07承认「零切点」是合法结果,不逼agent凑配额

3外部依赖

类型依赖
cliNode.js(跑两个 mjs 脚本)
cliffmpeg(trim/atrim + concat 渲染,libx264/aac)
cliffprobe(转录未带时长时探源片时长)
clinpx serve(只服务本地审查页 HTML,非上传)
clinode scripts/build-edl-review.mjs(仓库级共享复核工具,不在本 skill 目录内)

4风险提醒 风险提醒:蓝色 · 知晓即可

风险提醒:蓝色 · 知晓即可
  • 转录内容会进入 LLM 上下文(间接提示注入面) — 候选的 context/removes/keeps 来自 ASR 文本并被写进 MD 供 agent 逐条阅读;若转录源被污染(远端服务、他人素材),其中的指令式文本可能影响审查判断。脚本本身不执行这些文本。
  • 硬连接(hard join)可能留下可听出的音频接缝 — SKILL.md 自述词间切割是硬连接,紧凑素材建议事后加 20-30ms 淡入淡出——这一步本 skill 不自动完成。
  • 上游转录与成片的对应关系靠人工保证 — 若 转录与视频并非同一版(例如换过源片),切点会整体错位;master 工作流里需要『Match every transcript to its actual video』这条纪律兜底。
  • 写盘不做清理,长期堆积中间产物 — EDL/转录/decisions/filter 脚本/切好的 MP4 都写在项目 assets 目录,脚本无清理逻辑,需靠项目侧 `.gitignore` 与人工整理。
风险提醒:蓝色,知晓即可。判级对象是本 skill 自身目录(SKILL.md + 2 个脚本,共 3 个文件):两个 mjs 全为本地 Node 逻辑,读转录 JSON、写候选/EDL/转录/markdown,唯一的子进程是 ffprobe 与 ffmpeg 两个固定二进制;0 处网络调用、0 处凭证读取、0 处 env 访问,也没有删除或破坏性操作。因此落入蓝色的『仅本地脚本/CLI 与本地读写』。需要说明的相邻面(不改档位,因为不在本 skill 目录内):流程的转录前置由仓库级 `scripts/transcribe-elevenlabs.mjs` 完成,该脚本读 ELEVENLABS_API_KEY(env 或工作区 .env)并把音频上传到 api.elevenlabs.io——这一步有素材出网与额度消耗,但属于本 skill 明确拒绝承担的上游职责(本 skill 只接受任意 word-level 转录,也可用无 key 的本地 Whisper 归一化后喂入)。另外 SKILL.md 指示用仓库级 scripts/build-edl-review.mjs 生成复核页,也是本地脚本。

5第二遍独立确认

  • [ok] 目录文件清单与产物对照 — 3 个文件(SKILL.md、find-cut-candidates.mjs、apply-cuts.mjs);SKILL.md 承诺的 *.cut-candidates.json/.md 与 *.mistakes-edl.json/transcript.json/decisions.md/filter.txt 均在两个脚本的 writeFileSync 目标中逐一定位到。
  • [ok] 网络面反例搜索 — 目录内 0 处 fetch/https 导入;唯一 URL 形态字样是 SKILL.md 的本地命令 `npx serve . -p 8080 -n` 与仓库级脚本名,不构成执行期外发。
  • [ok] 凭证面反例搜索 — 0 处 process.env/API_KEY/TOKEN/.env;spawnSync 列表仅 ffprobe/ffmpeg,环境变量未被子进程继承修改。
  • [ok] 「只渲染已批准切点」是否被代码强制 — apply-cuts.mjs 第 49-51 行以 --cuts 文件为唯一输入并校验数组与非空范围;find-cut-candidates.mjs 不含任何写视频/批准逻辑,两脚本互不自动串接。
  • [ok] 文档参数 vs 脚本 argv — find 脚本解析 <transcript> 与 --out-dir(Usage 行自述一致);SKILL.md 给的命令两种形态都能对上。apply-cuts 解析 --cuts/--video/--output/--out-dir/--apply,与 SKILL.md 的调用示例逐项一致。
  • [ok] 上游转录服务是否被算作本 skill 行为 — SKILL.md 只写「Requires a word-level transcript」,未指名任何服务或 key;ElevenLabs helper 属仓库级 scripts/,故按『判级对象=skill 自身目录』记入 reason/risks 而不改档。

6结论

  • 把「语义判断」和「算术」彻底分权,避免了用正则假装懂人话的常见翻车:脚本只给候选+置信度+建议,SKILL.md 明确要求逐条读 removes/context 再拍板。
  • 重录/假起点用的是分段 + Jaccard 双阈值(0.34 / 0.24+同开头)而非硬编码片语,对真人反复重录的杂乱素材更耐用。
  • 默认干跑、写盘前校验切点边界、并输出 decisions.md 与可点开的复核页,切点决策可审计可回滚。
  • 接管上游已删沉默的时间轴,使转录重定时天然与下游 beat-sync 校验对齐,管线拼接成本低。
  • 对误报和零结果都有明确态度(列出三类典型假阳性;干净素材允许 0 切点),减少过度剪辑冲动。
  • 适合:适合:已有 word-level 转录的 talking-head 长视频二遍精剪(YouTube 口播、教程、访谈自剪),以及把剪辑做成可审计产物的团队流程;也适合想学『脚本做算术、模型做判断』分权设计的人。
    不适合:不适合:需要语义级重写/重组句子结构的剪辑(它只删区间、不改词序)、没有词级时间戳的转录(SRT/段落级不支持)、多机位/多说话人切换,以及期望全自动无人工审查的批处理——审查门是设计上的硬要求。
    安装 agent 直装可复制
    ① 本站镜像 更新 2026-09-28
    方式 A · 人下载镜像包下载 cut-mistakes.tar.gz
    sha256: fca023adfb7af7d9…
    方式 B · JSON 格式安装指南,复制给 agent
    安装指南
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② 上游 GitHub · 原始来源
    能访问 GitHub?直接去上游安装(实时版,可能已更新)GitHub 原始 ↗
    本页镜像锁定 commit 0d30152a82;上游为实时仓库。
    来源信息 GitHub 原始
    作者 / 仓库nateherkai / nateherkai/hyperframes-student-kit
    Stars1070
    最近推送2026-09-28
    本 skill commit0d30152a82
    许可NOASSERTION(仓库根 LICENSE,实为 MIT 文本)
    本站信息
    收录日期2026-09-06
    分类内容创作
    侦查报告AI 侦查 · 2 遍 · 2026-09-06
    本站镜像与 GitHub 原始是不同来源:本站锁定 commit 快照经 /r2 分发;GitHub 为实时上游,内容可能已更新。
    同分类邻近