name: cut-story description: 此技能應在使用者要求於實際機械式剪輯前決定影片的真正內容時使用 - 「建構故事」、「影片中應該要有什麼」、「什麼可以拿掉」、「哪些主題要保留」、「將此縮短至 6 分鐘」、「從中製作一個短影片」、「鉤子在哪裡」、「整理主題」、「這到底是關於什麼」、「build the story」、「decide what stays」、「structure this」、「cut this down to N minutes」、「find the hook」、「reorder the topics」。這是決定內容的環節,會寫入 project.json 中的「story」區塊;它在轉錄之後、粗剪之前執行。 argument-hint: [project-slug] [target-minutes] arguments: [project, target]
cut-story
決定影片是什麼。機械式剪輯僅能緊縮已所述內容的順序;而此環節決定哪些主題區塊存活、以何種順序呈現,以及鉤子在哪裡。這是唯一能將 25 分鐘的漫談轉變為 6 分鐘影片的階段,也是最決定是否有人觀看的階段。
引數:$project 是專案 slug,$target 是選擇性的目標長度(分鐘)。完整請求文字位於 $ARGUMENTS。若未提供 slug,則使用來自 session hook 的 PIPELINE_STATE 中命名的專案,並說明你選擇了哪一個。
下方的動詞名稱遵循建構合約。如果 python engine/ve.py --help 不一致,則以 CLI 為準 - 使用其名稱並提及不一致之處。
前置條件
projects/$project/project.json存在且stage為transcribed或更後面的階段。transcript.path可解析且transcript.word_count已設定。- 如果
stage仍為intake,則停止並先執行轉錄技能。
切勿靜默地執行此環節兩次。如果 story.blocks 已存在,請先顯示目前的決定,並詢問是要修改還是取代。
步驟 1 - 取得可讀的文字記錄
逐詞的 JSON 無法閱讀。請先將其扁平化:
python engine/ve.py transcript flatten $project --numbered
這會將單詞以連續文字輸出,並每 25 個字插入一個詞索引標記。詞索引是 story 區塊儲存的錨點 - 切勿儲存秒數或時間碼。
步驟 2 - 當文字記錄過長時調度 transcript-analyst
如果 word_count > 2500(大約 15 分鐘的德語口語),請調度 transcript-analyst 代理程式,而不是內聯讀取文字記錄。
原因:一份 5000 詞的文字記錄會耗盡你本次對話所需的上下文,而分析器只回傳約 40 行。自己閱讀也會使你產生偏見 - 剛讀完每個句子,會覺得每件事都很重要。一個全新的上下文則能更果斷地刪減,這是正確的做法。
提供給代理程式:扁平化的文字記錄路徑、目標長度、來自 output.platform 的平台,以及使用者在 $ARGUMENTS 中提供的任何指示。它會回傳候選區塊及其決定和理由。你仍然擁有最終決定權 - 審查其刪除的區塊,如果使用者明確要求保留,則否決其刪除。
低於 2500 詞,請自行閱讀文字記錄。
步驟 3 - 用一句話為影片命名
在做出任何區塊決定之前,先用一句德語句子說明觀眾在結尾時會相信什麼,而他們在一開始時並不信。向使用者展示這句話。
如果這句話無法寫出,表示素材中尚未包含一個影片。請直說並停止 - 建議進行補錄,而不是組裝一個無形狀的東西。這是一個真實的結果,誠實地交付比一個整齊但空洞的 6 分鐘影片更有用。
此後的每個決定都必須符合這句話。
步驟 4 - 為文字記錄分塊
一個區塊是一個可以被移動的意義單位:30 秒到 3 分鐘,一個要點。區塊是連續的詞範圍,無間隙、無重疊地覆蓋整個文字記錄。
不要在停頓處切分區塊。要在主題改變的地方切分 - 說話者自己的標誌性詞語在德語中很可靠:also、jetzt zum Thema、das andere ist、kurz noch、um nochmal zurückzukommen、was viele nicht wissen。
步驟 5 - 決定,並傾向於刪除
預設期望:刪除 40-60% 的記錄詞語。 如果超過 70% 的素材被保留,則表示尚未做出決定 - 回去更嚴格地應用刪除測試。
刪除測試,依序應用:
- 信念測試。 移除該區塊。觀眾在結尾時所相信的內容會改變嗎?如果不會,就刪除它。這是主要測試;其餘只是它的捷徑。
- 第二範例測試。 同一個要點的兩個例子:保留更具體的那一個,刪除另一個。說話者重複是為了思考,而不是為了教學。
- 孤兒測試。 已刪除的鋪墊所對應的結果現在變成了雜訊。刪除它,並在每次其他刪除後重新檢查 - 孤兒會以連鎖反應出現。
- 熱身測試。 幾乎任何錄音的前 60-90 秒都是清喉嚨。預設刪除它,並告知使用者你這麼做了。僅此一條規則改善的影片,比所有移除填充詞的規則加起來還要多。
- 回顧測試。 口頭總結剛剛說過的話(「再簡短總結一次」)是一種說話習慣,而不是結構。除非影片是真正具有教育意義且篇幅很長,否則刪除。
保留信號,最強的先:一個數字、一個名字、一個日期、一個說話者承認的具體錯誤、一個具體的實作範例。具體性是所有保留信號中最強的。 抽象的框架很廉價,可以在十秒內重新錄製;一個具體的軼事則無法複製。
對於命運取決於最終長度的區塊,使用 "decision": "maybe"。將 maybe 保持在區塊數量的 20% 以下 - 超過此比例就是優柔寡斷,而非細微差別,使用者就必須自己做你被要求做的工作。
如果設定了 $target,請進行合理性檢查:將保留區塊的詞數總和除以說話者的實測速率(word_count / 原始時長(分鐘))。在寫入任何內容之前,先報告預估值。德語談話式口語約為每分鐘 130-160 詞。
步驟 6 - 找到鉤子
鉤子幾乎從不在錄音的開頭。人們會在暖身並停止表演之後,才姍姍來遲地進入正題。
優先搜尋最後三分之一。 尋找:一個聽起來錯誤直到被解釋的主張、一個比預期更大或更小的數字、一個承認的失敗、一個利害關係(「這花了我兩週時間」)。挑選 15-25 秒 - 一兩句話,而不是一個段落。
將其寫入 story.hook,並附上 word_range 和一個德語的 note,說明為何要移動它。將鉤子移到前面是少數幾乎總是正確的重新排序。
步驟 7 - 排序,且僅在你能說出理由時才重新排序
重新排序的合法理由只有兩個:
- 鉤子移到最前面。
- 一個區塊回答了後一個區塊提出的問題,因此它必須在其之前。
其他一切都保持錄製順序。重新排序口語素材會破壞向後引用,而且你在渲染之前不會發現這個斷裂 - 屆時已經執行了三個階段。
引用完整性檢查,每個被移動的區塊都必須執行。 重新讀取被移動區塊的前兩個句子,檢查是否有向後引用。在德語中,這些會靜默地中斷:also、deswegen、deshalb、dadurch、dabei、wie gesagt、das、dieser/diese/dieses、außerdem、trotzdem、andererseits、wie eben erwähnt。如果被移動的區塊以此開頭,要麼將該區塊的起始點向後推一句,要麼將其標記為 maybe 並告知使用者需要一句銜接台詞。不要移動它並期望沒事。
步驟 8 - 寫入 story 區塊
將 story.blocks[] 和 story.hook 寫入 projects/$project/project.json,格式必須完全符合 docs/edl-schema.md 中定義的結構:id、word_range(半開區間,以詞索引表示)、label(德語)、decision(keep|drop|maybe)、order(輸出順序,可能與錄製順序不同)、rationale。
不可協商的規則:
- 沒有任何東西被刪除。 被刪除的區塊仍保留在陣列中,並帶有
"decision": "drop"。每個決定都必須可以透過翻轉一個欄位來逆轉。使用者會不同意你的一些刪除,並且必須能夠在不重新執行此環節的情況下撤銷它們。 rationale是一個德語子句,說明 WHY(原因),而不是 WHAT(內容)。 「支援核心論點」是有用的;「談論關於 Frame-Snapping」是一個標籤,而不是一個理由。- 保留區塊的
order從 0 開始緊密排列。 被刪除的區塊取得其錄製順序的索引;它們是無效的,但不得衝突。 - 將
stage設定為"story"。不要碰segments[]- 那是 cut-rough 的領域。
然後向使用者顯示一個簡潔的表格:順序、標籤、決定、估計分鐘數。這個表格才是交付物,而不是 JSON。
步驟 9 - 交接
明確說明機械式剪輯現在將僅在保留的區塊內部執行,這既是正確的,也更節省成本 - 對即將被刪除的素材進行填充詞和重拍偵測是浪費工作。然後提供 cut-rough 技能。
失敗模式
| 症狀 | 原因 | 修復 |
|---|---|---|
| 每件事看起來都很重要 | 文字記錄過長時內聯閱讀 | 調度 transcript-analyst;全新的上下文能更果斷地刪減 |
| 保留了 85% 的素材 | 未做出任何編輯決策 | 對每個區塊重新應用信念測試 |
| 重新排序後影片跳躍異常 | 向後引用中斷 | 對每個移動的區塊執行步驟 7 的檢查 |
word_range 有空隙或重疊 | 區塊未平鋪 | 區塊必須連續且為半開區間 |
| 使用者拒絕大部分刪除 | 步驟 3 中的句子錯誤 | 與使用者一起重寫一句話論點,然後重做 |