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、文字式剪輯、
# 建議的緊湊剪輯、渲染。間隙中的語音會被保留,可手動標記移除
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 也會寫入:DaVinci Resolve 時間軸,
# 片段對應完整來源,拉動邊界即可顯示被剪掉的內容
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) | 腳本 |
| whisper 轉錄的填充詞(嗯、啊、嘿)與結巴(「我我」、「和和」) | 單詞時間戳記(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}]}。規則:本檔案下方的「THE RETRACTION-DETECTION RUBRIC」,涵蓋以下口語案例:
- 失誤開頭「我要…我們來看看」:從「我要」開始,到重新開始的句子之前結束。
- 詞語改寫「這是個東西,一個工具…」:僅在第二個詞完全取代第一個詞時(而非補充說明時)才剪掉第一個詞。
- 從頭重新開始的句子,包括在離題之後:剪掉第一次嘗試的整個句子。
- 對著鏡頭說的場務指示(「這個拿掉」、「不在麥克風範圍內,不對」、「保留」):這些是指令,不是內容。先執行指令,再將它們剪掉。IMG_4566:最後 40 秒包含 3 個失誤開頭與 2 個指示。
- 不要剪輯:強調性重複(「永遠、永遠」)、列舉、具有補充意義的「其實」、表達性的停頓、幽默的自動修正(「21 和 22 世紀。不對,是 21 世紀」)。
- 邊界設定(從
words讀取):start= 最後一個保留詞的結束與第一個被放棄詞的開始之間的中點;end= 第一個保留詞的開始 − 0.04 秒。若要剪到影片結尾:end= 影片總長度。
對於較長的轉錄(超過 1000 個詞),可委派給子代理程式來讀取並產生 JSON,然後對照 words 重新檢查其邊界。
在渲染前檢查(重新推導,非重新辨識)
render 會執行機械檢查並寫入 cuts.md。你需要仔細閱讀的內容:
cuts.md的 diff 區塊(原始轉錄 → 輸出轉錄)。每個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)之前的間隙包含了「ès」這個音。任何觸及縮寫或
.com的間隙:請聆聽該時間窗口,若有任何疑慮,請不要剪輯。包含數字的標記(「5h」、「J3」)是內插值,從未真實對齊。 - 同步:
cuts.md會提供影音偏差值。超過 40 ms 時,請檢查影片。 - 填寫
cuts.md中的「主題」行。
THE RETRACTION-DETECTION RUBRIC
你(呼叫此技能的代理程式)閱讀 derush words <STEM>,並將以下 JSON 寫入 $DERUSH_OUT_ROOT/<STEM>/retraction_cuts.json,此檔案將由 derush render 讀取:
偵測器輸出規範
{
"retraction_cuts": [
{
"start": 6.4,
"end": 9.8,
"cue_text": "這個不算",
"rationale": "修復前部分 '每次用戶開啟檔案時執行' + 提示 '這個不算';修復內容 '它實際上是在會話啟動時執行' 被保留。"
}
]
}
start= 被放棄的想法(修復前部分) 的開始位置。這是語義判斷;它可能位於句子中間。請從derush words的單詞時間戳記中讀取確切時間(參見下方的「邊界錨定」)。時間單位為來源影片的秒數。end= 撤回提示(中斷期) 的結束位置。修復前部分 + 提示都會被剪掉;之後的修復內容則被保留。實務上,end應落在修正後話語開始的邊界上。- 空列表
{"retraction_cuts": []}:當沒有真正的撤回時使用。偽裝的撤回與主題轉換不會產生剪輯。
自我修正模型(Levelt / Clark & Wasow)
[修復前部分] [中斷期/提示] [修復內容]
被放棄 提示 替代內容
剪掉 剪掉 保留
剪輯範圍 = 修復前部分 + 提示。修復內容則被保留。
正向測試(要剪輯):所有條件皆須成立
- 說話者正在否定先前的內容(表示其錯誤、無效或不相關),且
- 他們替換或放棄該內容:後續有修正版本,或想法被放棄,且
- 轉錄稿中實際存在一個修復前部分可供移除(只有提示而沒有先前話語 → 不剪輯;請參見下方的邊界案例)。
負向測試(不要剪輯):任何一個條件成立即拒絕該候選項
這些情況表面上類似提示,但並非撤回:
- 時間限定式主題轉換:「先別管預算一下/暫時」、「預算的事先放一邊」。其中的「一下/暫時」限定詞(通常伴隨後續的延後說明,如「我們下週再談」)表示先前的內容仍然有效,只是暫時擱置。不剪輯。
- 補充性升級:「其實這樣更好」、「不對,等等,這個更厲害」。「其實」/「不對」在此是強化先前的論點;它仍然成立。不剪輯。
- 肯定:「不對,就是這樣」、「事實上,這是個好觀點」。「不對」/「事實上」在此是強化同意,而非修正。不剪輯。
- 程序性停頓:「等等,我示範給你看」。說話暫停以進行示範;沒有撤回任何內容。不剪輯。
- 細微差別/範圍修正:「這其實更細微」、「好吧,有點複雜」。先前的陳述被補綴/延伸,而非否定。不剪輯。
- 話題結束:「總之,挺複雜的」、「無論如何」。結束一個話題,但未否定其內容。不剪輯。(「總之」有歧義:僅在後續跟隨實際的放棄行為,如「總之,不管什麼標準」時才需剪輯。)
修復前部分的起始點應回溯多遠?
起始邊界是一個語義判斷:
- 問問自己:說話者正在替換什麼? 修復前部分從被放棄的想法首次偏離正確替代內容的地方開始。
- 重新開始標記(「我重來」、「讓我重新開始」、「不對等等我重新來」)→ 更廣的修復前部分:回溯到重做段落的起點。
- 修正轉折點(「不對其實」、「actually no」、「wait no」)→ 狹窄的修復前部分:僅限於緊鄰的前一個謂語/子句。
- 自然主題邊界規則:切勿越過一個不同的主體進行剪輯。一個有效的、為錯誤版本與正確版本所共同建立的共同主題介紹應保留(例如,「針對這個聲音安裝專案…」的介紹應保留;僅剪掉其後錯誤的技術陳述)。
- 「設定」與「闡述」測試(保留最後一個仍為真的事實)。當一個設定/介紹仍為真,而僅有後續的闡述、列舉、清單或細節被放棄時,修復前部分應從闡述開始,而非從設定開始。關鍵問題是:「說話者是在否定這個子句,還是只否定它之後的內容?」 如果該子句在修復後仍然為真,則保留它;從被修復內容所無效化的第一個子句開始剪輯。
- 「它使用四個標準:A、B、C、D。總之,別管標準了:重要的是 X。」→ 設定「它使用四個標準」仍然為真(它確實使用標準);只有列舉「A、B、C、D」被放棄。剪輯從列舉開始,而非從「它使用四個標準」開始。保留設定是強制性的:剪掉它就是誤剪真實內容。
- 對比:如果說話者否定了設定本身(「它使用四個標準…其實不對,它一個都沒用,它是個固定規則」),那麼設定本身就是修復前部分,剪輯應從那裡開始。請閱讀修復內容真正替代的是什麼。
- 最小剪輯/保守原則:當不確定應回溯多遠時,傾向於選擇較狹窄的剪輯。保留一個略微不精確的先前子句,遠比剪掉一個正確的句子要好得多。
- 多句子修復前部分:當被放棄的想法橫跨多個句子或
derush words的多行時,剪輯應涵蓋所有這些內容。 - 邊界錨定:使用單詞時間戳記,絕不使用算術推斷。
derush words <STEM>會以單詞@起始-結束的格式列印每個單詞(單詞後加上?表示邊界為內插值,未對應音訊;將其視為較不精確)。基於這些進行錨定:start= 你保留的最後一個單詞的結束與第一個被放棄單詞的開始之間的中點。end= 你保留的第一個單詞(修復內容的開頭)的開始減去 0.04 秒。修復前部分與提示被剪掉,修復內容的開頭絕不碰觸。若要剪到影片結尾,end= 影片總長度。- 提示與修復內容開頭在同一個句子中(由「但是」、「就是」、「it's」、逗號、破折號分隔):剪輯在提示的最後一個單詞處結束,不往後延伸。使用提示後的第一個標點符號,切勿使用修復子句內後方的逗號。當提示帶有尾隨逗號時(「不對等等,」、「scratch that,」),其後的單詞即為修復內容,應保留。
- 修復前部分在一行結尾,而提示在下一行開頭:剪輯在修復前部分的結尾結束,不要向前延伸去包含提示。留下一個簡短的提示殘餘(如「不對等等」)是無害的;吃掉修復內容的開頭才是不可饒恕的錯誤。
- 內插邊界(
?):向內取整(見下文)。