derush 是做什么的?
口播镜头的自动「跳切」剪辑。只进行剪辑和导出:不添加字幕。本技能内置了下面的撤回规则;脚本(fillers, prune, cut)位于仓库中。
视频文件存放在 $DERUSH_OUT_ROOT/<STEM>/ (默认为 ~/Movies/Derush,详见 derush config show)。
纯音频文件(m4a, mp3, wav, aiff, caf)会经过相同的处理流程:剪辑输出为 <STEM>.derush.m4a,导出为 <STEM>.export.m4a(-14 LUFS);fcpxml、徽标和视觉效果不适用于音频。
三个命令
derush prep "<video>" # 将源文件整理到 $DERUSH_OUT_ROOT/<STEM>/ 目录下,进行音频提取、静音检测、转录(qwen)、
# 对齐、填充词检测、间隙检测、间隙校验。耗时约为视频时长的1.5倍
derush words <STEM> # 生成带时间戳的逐字转录:第6步基于此进行操作
derush studio # 在浏览器中完成所有操作:拖入原始视频,进行衍生处理,通过文本进行剪辑,
# 提出紧凑剪辑方案,进行渲染。间隙中的语音会被保留,但可以手动删除
derush edit <STEM> # 通过文本剪辑:本地页面,删除单词(Delete键),恢复呃/静音(Enter键),
# 确认后生成 retraction_cuts.json + restore.json
# 「提出紧凑剪辑方案」:Claude 提出剪辑建议(重复、题外话、重述),以橙色标记,未经确认不会实际剪辑
derush render <STEM> # 执行合并 + 保留 + 剪辑 + 重新转录输出 + cuts.md
derush logos <STEM> # 可选:根据 logos.json 生成 <STEM>.logos.mp4,如果文件存在,导出步骤会自动使用它
derush fcpxml <STEM> # 生成 <STEM>.fcpxml,render 命令也会写入此文件:用于达芬奇的时间线,剪辑覆盖整个源文件,
# 拖动边缘可以恢复被剪掉的内容
derush export <STEM> # 生成 <STEM>.reel.mp4:1080x1920,30 fps,-14 LUFS,可直接发布
徽标(derush logos):$DERUSH_OUT_ROOT/<STEM>/logos.json = {"cues":[{"logo":"canva","t":14.27}]},t 从 derush words 读取(源文件时间码,由 keep.json 转换)。徽标文件位于 $DERUSH_OUT_ROOT/_logos/src/<logo>.svg|png(已抠图,透明背景;若无文件,则生成文字提示)。白色圆角卡片,宽度为画面的30%,默认位于左上角(面部出镜时,人脸占据画面顶部三分之一区域),持续2秒,淡入淡出0.2秒;列表快速排列时,卡片并排显示。控制方法:为每个提示提取一张图片并「查看」它。IMG_4596 (2026-10-11):Canva×2,Microsoft 365,Gamma,Higgsfield(转录中写作「Xfield」:需要向它询问名称,whisper 有一半不认识)。
derush 是仓库中的 bin/derush。prep 的选项:--lang en、--noise -40(弱声音)、--min 0.3 --pad 0.08(更紧凑)、--min 0.8 --pad 0.2(更宽松)。处理两个视频:可以依次在后台运行 prep,同时阅读 words。
剪掉的内容,以及由谁决定
| 层面 | 信号 | 谁决定 |
|---|---|---|
| 静音 | 波形,silencedetect(不使用 whisper 间隙,过于粗糙) | 脚本 |
| (先决条件) 真实的单词边界 | CTC 对齐音频 (align_words.py) | 脚本 |
| 转录出的呃 / 嗯 / 哼、口吃「我我」、「和和」 | 单词时间戳 (detect_fillers.py) | 脚本 |
| 未转录出的呃 / 嗯(大多数情况) | 两个词之间的非静音间隙 (gap_fillers.py) | 脚本 |
| 假开头、重复的句子、「不等等」、未说完的词、对着镜头的指示 | 阅读转录内容 | 你,第6步 |
本技能的首要原则:错误地剪掉真实内容是最大的错误。 有疑问时,就保留,并在 cuts.md 中说明(「特意保留」)。
第6步:唯一的手动步骤——假开头
阅读 derush words <STEM>(格式:单词@开始时间-结束时间,? 表示插值边界,非对齐)并编写 $DERUSH_OUT_ROOT/<STEM>/retraction_cuts.json = {"retraction_cuts":[{start,end,cue_text,rationale}]}。规则:下面的「假开头检测规则表」,包含以下口播场景:
- 假开头「我要……我们来看」:剪掉「我要」直到修正版本开始处。
- 重新措辞「这是一个东西,一个工具,可以」:仅当第二个词替换第一个时才剪掉第一个(而不是补充说明)。
- 完全重新开始说一句话,包括在题外话之后:剪掉第一次尝试的整个部分。
- 对着镜头的导演指示(「删掉这个」、「不在我的麦克风里,不」、「保留」):这些是指令,不是内容。先执行指令,然后剪掉它们。 IMG_4566:最后40秒包含3个假开头和2条指令。
- 不要剪掉:强调性重复(「总是,总是」)、列举、「事实上」表示补充、有表现力的停顿、喜剧性自我纠正(「21世纪和22世纪。不,是21世纪」)。
- 边界,从
words读取:start= 最后一个保留词结束和第一个放弃词开始之间的中点;end= 第一个保留词开始 − 0.04秒。要一直剪到视频结束:end= 视频时长。
对于较长的转录(> 1000个单词),委托子代理阅读并返回 JSON,然后对照 words 复核其边界。
在渲染前检查(重新推导,而非识别)
render 执行机械检查并写入 cuts.md。你要复核的是:
cuts.md中的差异部分(源转录 → 输出)。每个delete都应该是预期的剪辑。奇怪的replace/insert(如「是是是」)通常是 whisper 的循环错误:在指责剪辑之前,重新转录该区域。- 标记为「间隙中有语音」的间隙(由
gap_check在prep末尾报告):监听该窗口。如果是假开头,剪辑正确。如果是内容,在render之前将此间隙从_work/gap_cuts.json中移除。 - 被转录出来的呃、嗯是内容。「沉默,那些嗯」、「特别是在那些呃上」:这个词是句子的对象,应该保留。在「这些」、「那些」、「一个」、「在那些」后面紧跟着呃/嗯/哼时,监听并移除覆盖它的间隙。永远不要将「在那些」视为假开头:句子在呃处结束。 (2026-10-27, A001_10272011_C008.)
- 转录:自2026-11-04起默认使用 Qwen3-ASR(
transcribe_qwen.py,使用DERUSH_ASR=whisper回退;qwen 不可用或故障时回退到 whisper,日志中有说明)。Qwen 能转录出 whisper 会合并的口吃和假开头(C010:「一些一些东西」,「我没有,我没有,我所有的」),因此它们会出现在derush words和derush edit中。但 Qwen 仍然不会转录出呃:gap_fillers.py仍然需要。在专有名词上较弱(「claudito」→「claudio」)。 - 被 whisper 淡化的假开头:whisper 可能只转录了一次被说了两次的句子。IMG_4543:「我给你一些……我要给」被转录为「我要给」。输出中听起来别扭的接合点 = 在该位置逐字重新转录源视频。
- 缩写、域名、数字:CTC 对齐拼写的字母效果不佳。IMG_4549:在「SI」之前(SpaceX SI)的间隙包含了「es」。任何触及缩写或
.com的间隙:重新转录该窗口,有疑问时不要剪掉。包含数字的标记(「5h」、「J3」)是插值的,从不对齐。 - 同步:
cuts.md提供 A/V 偏移。超过 40 毫秒,检查视频。 - 填写
cuts.md中的「主题」行。
假开头检测规则表
你(调用技能的语言模型)阅读 derush words <STEM> 并将以下 JSON 写入 $DERUSH_OUT_ROOT/<STEM>/retraction_cuts.json,这是 derush render 读取的文件:
检测器输出合同
{
"retraction_cuts": [
{
"start": 6.4,
"end": 9.8,
"cue_text": "Scratch that",
"rationale": "保留的部分 'runs every time the user opens a file' + 提示 'Scratch that';修正部分 'it actually runs on session start' 被保留。"
}
]
}
start= 被放弃的思想(reparandum)开始的位置。这是语义判断;它可能落在句子中间。从derush words的单词时间戳中读取确切时间(参见下方的「边界锚定」)。时间单位为源视频的秒。end= 撤回提示(interregnum)的结束时间。reparandum 和 cue 都被移除;紧随其后的修正部分被保留。实际上,end落在修正语句开始的位置。- 空列表
{"retraction_cuts": []}表示没有真实的撤回。假提醒和话题转移不产生剪辑。
自我修正模型 (Levelt / Clark & Wasow)
[REPARANDUM] [INTERREGNUM/CUE] [REPAIR]
被放弃的 提示符 替代词
剪掉 剪掉 保留
被剪掉的内容 = reparandum + cue。修正部分被保留。
肯定测试(剪掉):必须全部满足
- 说话者正在否定之前的内容(否定、删除或判断其错误/不连贯),并且
- 他们替换或放弃它:后面跟着修正版本,或者思想被放弃,并且
- 转录中确实存在一个要移除的 reparandum(只有提示而没有前置的语音 → 不剪掉;参见下面的边界情况)。
否定测试(不剪掉):满足任意一条即拒绝
这些表面上类似提示,但不是撤回:
- 带时间限定的话题转移:「暂时/先忘掉预算」、「oublie le budget deux secondes」。其中的“暂时/先”限定词(通常后面跟着延迟声明,如“我们下周会讨论”)意味着之前的内容仍然有效,只是被推迟了。不剪掉。
- 递进式升级:「实际上,这更棒」、「不,等等,这更强大」。这里的“实际上”/“不”升级了之前的断言,断言仍然成立。不剪掉。
- 肯定:「不,正是这样」、「实际上,这是个好观点」。这里的“不”/“实际上”加强了同意,而非纠正。不剪掉。
- 程序性暂停:「等等,我给你演示」/「wait, let me show you」。说话暂停以进行演示,没有撤回任何内容。不剪掉。
- 细微差别/范围细化:「这比那更微妙」、「总之,这有点更复杂」。之前的断言被限定/扩展,而非抛弃。不剪掉。
- 话题结束语:「总之,这很复杂」、「无论如何」。结束一个思路而未否定它。不剪掉。(
bref在法语中模棱两可:仅当后面跟着实际的放弃行为,如「总之,标准不重要」时,才进行剪辑。)
Reparandum 从哪里开始?
开始边界是一个语义判断:
- 考虑说话者在替换什么。 Reparandum 从被放弃的想法首次偏离正确替换的地方开始。
- 重新开始标记(「我重新开始」、「让我重新开始」、「不等等我重来」)→ 更宽的 reparandum:回到被重做段落开始的地方。
- 纠正转折词(「不实际上」,「actually no」,「wait no」)→ 窄的 reparandum:仅包括紧挨着的前一个谓词/从句。
- 自然话题边界规则:永远不要剪过一个不同的主题。一个有效的、共同的话题介绍(错误和正确版本都基于它)应被保留(例如,“对于声音装置项目……”的介绍保留;只有其后错误的技术声明被剪掉)。
- 设置与详述测试(保留最后一个仍然真实的声明)。 当一个设置/介绍声明在修正后仍然为真,并且只有其后的详述、列举、列表或细节被放弃时,reparandum 从详述开始,而不是从设置开始。决定性问题是:“说话者是在否定这个从句,还是仅仅否定它之后的内容?” 如果该从句在修正后仍然为真,则保留它;从修正使其无效的第一个从句开始剪辑。
- “它使用四个标准:A、B、C、D。总之,标准不重要:重要的是X。” → 设置“它使用四个标准”仍然为真(它确实使用标准);只有列举“A、B、C、D”被放弃。剪辑从列举开始,而不是从“它使用四个标准”开始。保留设置是强制性的:剪掉它是对真实内容的错误剪辑。
- 对比:如果说话者否定了设置本身(“它使用四个标准……实际上不,它不用,它是一个固定规则”),那么设置本身就是 reparandum,剪辑从那里开始。阅读修正替换了什么。
- 最小剪辑 / 保守原则:不确定多远时,选择较窄的剪辑。留下一个稍欠精确的先前从句,远比剪掉一个正确的句子要好。
- 多句子 Reoranda:当被放弃的想法跨越
derush words中的多个句子或行时,剪辑覆盖所有这些句子/行。 - 边界锚定:使用单词时间戳,永远不要计算。
derush words <STEM>将每个单词输出为单词@开始时间-结束时间(单词后的?表示此边界是插值计算的,未对齐音频;视为精确度较低)。锚定在这些时间戳上:start= 你保留的最后一个单词的结束与第一个被放弃单词的开始之间的间隙的中点。end= 你保留的第一个单词(修正的头)的开始减去 0.04 秒。Reparandum 和 cue 被剪掉,修正的头永远不会被触碰。要一直剪到视频结束,end= 视频的时长。- 同一句子中的提示和修正头(由“但是”、“是”、“it's”、逗号、破折号分隔):在提示的最后一个词处结束剪辑,不要更晚。使用紧随提示之后的第一个标点符号,而不是修正从句内更靠后的逗号。当提示带有尾随逗号时(“不等等,”,“scratch that,”),其后的词语是修正部分,应保留。
- Reparandum 在一行的末尾,而提示在下一行的开头:在 reparandum 的末尾结束剪辑,而不是向前延伸去抓取提示。一个短暂的残余提示(“不等等”)是无害的;吃掉修正的头是大忌。
- 插值边界(
?):向内取整(见下方)。
S
…
[翻译截断]