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

cut-silences

Agent 1 of the video editing pipeline. Removes silences and dead air from a talking-head recording. Use when asked to cut silences, trim pauses, remove dead air / gaps, or tighten the pacing of a raw video, given a word-level transcript. Produces an edit list (EDL), a re-timed transcript for downstream agents, and optionally the cut video via ffmpeg. Does NOT cut mistakes, repeats, or false starts — that is the cut-mistakes agent.

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

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

整条链路是确定性算法而非模型判断:只处理 head/tail 死气与超过 --gap 的词间停顿,一句话都不改。

.claude/skills/cut-silences/scripts/cut-silences.mjs
Pure pause/silence trimmer. Takes any word-level transcript (ElevenLabs Scribe … shape, or { words: [{ text, start, end }] }) and removes silences only:
注:同一段注释还显式划界:It does NOT cut repeats, false starts, or mistakes — that is Agent 2's job. 因此输出天然可复现,适合当管线第一环。

头尾死气按 --head-pad / --tail-pad 直接砍掉,作为两个独立删除区间进入合并。

.claude/skills/cut-silences/scripts/cut-silences.mjs
// head + tail dead air const headEnd = words[0].start - opts.headPad; if (headEnd > 0) deleteRanges.push({ start: 0, end: headEnd, reason: "head trim before first word" });
注:默认 head-pad 0.22s、tail-pad 0.34s,来自 SKILL.md 的参数表;没视频时以转录自带 audio_duration_secs 或最后一个词的 end 兜底时长。

词间停顿不是砍到 0,而是按上下文保留一口“自然呼吸”:长停顿 0.24s、句末 0.20s、其余 0.14s。

.claude/skills/cut-silences/scripts/cut-silences.mjs
if (gap < opts.gap) continue; … const sentenceBreak = /[.!?]$/.test(prev.text ?? ""); const keep = gap >= 2 ? 0.24 : sentenceBreak ? 0.2 : 0.14;
注:低于 --gap(默认 0.55s)的停顿完全不碰,这是“保留口语节奏”的开关;调小 --gap 会切得更紧但更容易切碎。

保留的呼吸被有意偏向后句首:前句末端多留 55%、后句开头少留 45%。

.claude/skills/cut-silences/scripts/cut-silences.mjs
// Bias the kept breath slightly toward the end of the previous phrase. const delStart = prev.end + keep * 0.55; const delEnd = next.start - keep * 0.45;
注:这是听感细节处理:把余量留在上一句尾音后,避免下一句起音被切掉。

删除区间先合并再做补集得到 keep ranges,并丢掉小于 40ms 的碎片区间。

.claude/skills/cut-silences/scripts/cut-silences.mjs
if (cursor < duration) keepRanges.push({ start: cursor, end: duration }); const usableKeepRanges = keepRanges.filter((r) => r.end - r.start >= 0.04);
注:补集思路让 EDL 既是删除表也是保留表;40ms 下限防止 ffmpeg 生成无意义的极短切片。

转录按同一套删除表重定时到剪辑轴,并保留 source_start/source_end 供回查原片。

.claude/skills/cut-silences/scripts/cut-silences.mjs
const editedWords = []; for (const word of words) { if (inDeleted(word)) continue; … start: Number((word.start - removedBefore(word.start)).toFixed(3)),
注:removedBefore(t) 累加 t 之前被删的秒数,等价于线性映射;下游 beat 时间与 validate-beat-sync.mjs 因此无需二次换算。

渲染走 ffmpeg trim/atrim + concat 的 filtergraph,先落盘成 *.silence-filter.txt 再用 -/filter_complex 传入;默认只算不渲。

.claude/skills/cut-silences/scripts/cut-silences.mjs
lines.push(`[0:v]trim=start=${r.start.toFixed(3)}:end=${r.end.toFixed(3)},setpts=PTS-STARTPTS[v${i}];`); … const ffArgs = [ "-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, ];
注:视频与音频用同一组区间同步裁切,避免 A/V 漂移;无 --apply 时只打印 hint: re-run with --apply to render the cut video。

2核心能力

01砍掉头尾死气与超阈值词间停顿(纯沉默,不动一个字)
02按上下文保留“自然呼吸”(长停顿/句末/其余三档),而非硬零间隔
03输出 EDL(删除区间 + 保留区间 + 参数 + 时长),可直接被下游或人工复核
04产出重定时转录,交给 Agent 2 与节拍校验,无需再对齐时间
05人读决策摘要(含被削掉的最大 15 个停顿),便于抽查是否切过头
06dry-run 与渲染分离:默认只写 EDL/转录/摘要并打印 ffmpeg 命令,--apply 才动视频
07参数化调优(--gap / --head-pad / --tail-pad / --output / --out-dir)并给出经验值
08兼容多种词级转录形状(ElevenLabs Scribe / 泛型),并按 type 过滤非词事件

3外部依赖

类型依赖
cliNode.js(跑 cut-silences.mjs)
cliffmpeg(trim/atrim + concat 重编码,仅 --apply 时执行)
cliffprobe(无 audio_duration_secs 时探源片时长)
apiElevenLabs Scribe(**前置步骤**:由仓库级 scripts/transcribe-elevenlabs.mjs 上传音频取词级时间戳;本次侦察未在本 skill 目录内发现任何调用代码)
cli本地 Whisper / whisper.cpp(文档列出的无 key 替代转录路线)

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

风险提醒:蓝色 · 知晓即可
  • 前置转录步的素材出网与计费(不在本 skill 目录,但由 SKILL.md 指引) — Prerequisites 指向仓库级 scripts/transcribe-elevenlabs.mjs,该 helper 读 ELEVENLABS_API_KEY 并把音频 POST 到 api.elevenlabs.io;愿意的话可换 OpenAI Whisper(另一 key)或本地 Whisper/whisper.cpp(无 key,需本地算力)。本 skill 自身脚本不参与这一步。
  • 切太快会变成“喘不上气”的播客式节奏 — --gap 调小会让停顿被大量削掉;SKILL.md 给的经验是 0.55 约削 15-20% 纯沉默,明显偏离这个区间就该抽查 decisions.md 里的 top15 停顿。
  • 转录与源片不一致时整条链会系统性错位 — 所有区间都建立在转录时间戳上;若转录来自另一个版本的素材(或时长字段与实际不符),切点会整体偏移而不报错——脚本只在 duration 缺失时才 ffprobe 兜底。
  • 硬编码阈值对非英语/快语速素材未必合适 — 0.55s 阈值与 0.20s 句末呼吸是按英语 talking-head 调的;中文/快节奏口播可能需要重调参数,且脚本没有自动标点感知之外的语义判断。
风险提醒:蓝色,知晓即可。判级对象为本 skill 自身目录(SKILL.md + 1 个 11.8KB 的 mjs):唯一可执行代码是纯本地 Node 脚本,读 word-level 转录、算区间、写 EDL/转录/摘要/filter,唯一子进程是 ffprobe 与 ffmpeg 两个固定二进制;0 处网络调用、0 处凭证读取、0 处 env 访问、0 处删除或破坏性操作。需要写清但**不据此抬档**的相邻面:SKILL.md 的 Prerequisites 指向仓库级 `scripts/transcribe-elevenlabs.mjs` 取转录,该 helper 读 ELEVENLABS_API_KEY 并把音频上传到 api.elevenlabs.io(有素材出网与额度消耗)——它不在本 skill 目录内,且本 skill 只要求『任何 word-level 转录』并明确接受泛型 `{ words: [...] }` 与无 key 的本地 Whisper 路线,转录被视为上游产物而非本 skill 的职责。与同批 edit-video(🟠)的区别正在这里:edit-video 的 SKILL.md 把服务调用写进自己主流程第 2 步、并自带成本与授权说明。

5第二遍独立确认

  • [ok] 目录文件清单与 Outputs 表对照 — 目录仅 SKILL.md + scripts/cut-silences.mjs;SKILL.md 列出的 5 类产物中 3 类无条件写、filter.txt 与 mp4 受 --video/--apply 门控,与源码 writeFileSync/spawnSync 分支一致。
  • [ok] 网络面反例搜索 — 目录内 0 处 fetch/URL/网络模块导入;SKILL.md 出现的 `node scripts/transcribe-elevenlabs.mjs ...` 是仓库级前置命令,文件名不含 http,且未被本脚本引用。
  • [ok] 凭证面反例搜索 — 0 处 process.env/API_KEY/TOKEN/.env;脚本对 process 的导入仅 argv/exit(`import { argv, exit } from "node:process";`)。
  • [ok] 「只删沉默」是否被代码强制 — 删除区间只由 head/tail pad 与 gap>opts.gap 的停顿生成三处 push 产生,源码无重复词/相似度/语义判断,与文档声明一致,无夸大。
  • [ok] 重定时映射正确性 — start = word.start - removedBefore(word.start),removedBefore 只累加严格位于其前的删除量,因此不会出现负值或跳变;edited_duration = duration - removedTotal 与被删总量自洽。
  • [ok] 文档参数 vs 脚本 argv — --video/--out-dir/--output/-o/--gap/--head-pad/--tail-pad/--apply 全部在 argv 解析中定位到,未知 --flag 会 die,与 SKILL.md 表格一致。

6结论

  • 纯确定性算法、零模型判断,第一环就可以完全复现与回归测试;换谁跑结果都一样。
  • 听感处理到得很细:按上下文保留 0.24/0.20/0.14 秒呼吸,并把余量偏向后句首(55%/45%),比“切到零间隔”的粗暴做法自然得多。
  • 产物自带可审计信息:EDL 含 params/removed/removedPct,decisions.md 列出被削掉的 top15 停顿,人可快速抽查是否切过头。
  • 重定时转录把时间轴成本收敛在第一环,下游节拍与交付校验无需再对齐。
  • 给足调参旋钮与经验值(--gap 0.55 约削 15-20% 纯沉默),并提示过激时的两个修正方向。
  • 适合:适合:有词级转录的 talking-head 长视频第一遍粗剪(自动化去掉 15-20% 纯沉默)、把剪辑产物做成可复核 EDL 的流水线,以及作为多代理剪辑管线的确定性起点。
    不适合:不适合:没有词级时间戳的转录(段落级/SRT 不行)、需要删口误或重录(那是 cut-mistakes)、需要保留全部呼吸停顿的访谈原貌,以及期望脚本自己决定“哪里该切”的场景——它只按数值规则办事。
    安装 agent 直装可复制
    ① 本站镜像 更新 2026-09-28
    方式 A · 人下载镜像包下载 cut-silences.tar.gz
    sha256: 484001b000655549…
    方式 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 为实时上游,内容可能已更新。
    同分类邻近