首页 / 全部技能 / 内容创作 / 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.

L4 高权限 · 分级授权与审计V1 已固定执行命令联网读写文件Dual-pass Audit
Author nateherkaiGitHub nateherkai/hyperframes-student-kit ↗Stars 1070License NOASSERTION(仓库根 LICENSE,实为 MIT 文本)Commit 0d30152a82
管控等级描述 skill 的能力与建议配套的管控措施,不代表质量或安全认证,也不表示可用或不可用。是否使用由用户和管理者决定。不同 agent 宿主对权限的约束各不相同,请勿假定宿主一定会提供安全兜底。第三方 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外部依赖

KindDependency / Endpoint
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管控建议与判定依据

建议配套管控措施
面向 Agent
分级或逐次授权,建议在沙箱运行
面向管理者
审批流程、可回滚、全程审计
判定依据(文件路径与关键语句摘要)
  • scripts/: 执行本地脚本或命令: node .claude/skills/cut-silences/scripts/cut-silences.mjs <transcript.json>
  • 网络端点: 声明外部网络访问: 前置步骤的对外端点(来自仓库级 helper,非本目录):api.elevenlabs.io/v1/speech-to-text(POST 音频取词级
  • 本地工作目录: 文件读写与工件输出: <stem>.silence-edl.json(keep/delete 区间 + params + 时长)
审计说明: 。判级对象为本 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)、需要保留全部呼吸停顿的访谈原貌,以及期望脚本自己决定“哪里该切”的场景——它只按数值规则办事。
    Install Agent-Ready
    ① Verified Mirror 2026-09-28
    Option A · Direct DownloadDownload cut-silences.tar.gz
    sha256: 484001b000655549…
    Option B · Copy Guide for Agent
    install.json
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 0d30152a82.