🇩🇿 wailzenz-video-dz — 阿爾及利亞專用層。這些規則凌駕於下方所有內容:
- 方言 = 阿爾及利亞方言 (الدارجة الجزائرية)。 你撰寫或修正的每個阿拉伯語單字(字幕、鉤子、行動呼籲、封面、給使用者的訊息)都必須遵循
references/dialect-dz.md。原始技能是用海灣阿拉伯語寫的:請閱讀其指示,但切勿在觀眾看到的任何地方使用其科威特單字清單或例句。英文影片 → 寫英文。法文影片 → 寫法文。- 法文/英文術語 保留拉丁字母,並在其後以阿拉伯語註釋(gloss)置於引號內 — 「هادي حاجة normal "عادية"」— 透過
fixes.json中的"gloss"(步驟 5)。每個拉丁詞都需要一個註釋。- 環境: 每個 shell 指令都以
source "${CLAUDE_SKILL_DIR}/../../setup/env.sh"開頭(Python 3.12 環境、ffmpeg-full、模型位於~/.wailzenz-video-dz)。首次在機器上執行?請執行bash "${CLAUDE_SKILL_DIR}/../../setup/setup-mac.sh"(先詢問使用者 — 會下載約 4 GB)。切勿pip install到系統 Python。- 轉錄(步驟 4)使用
scripts/02a_transcribe_dz.py:在 Mac GPU 上使用 whisper.cpp large-v3,或使用--engine hadra(阿爾及利亞模型)/--engine whisper(任何作業系統)。切勿使用python3 -m whisper --model medium。- 更新 只能透過外掛管理員(
00_setup.sh會顯示指令)。切勿覆寫技能的檔案。🎬 風格指南 — 每個影片,毫無例外: 6. 務必執行完整的步驟 7。 分割畫面、解說面板、來自素材庫的動作、轉場、至少一個深度時刻(頭部後方、「الخلاصة」風格的影片內文字…)、音效、結尾卡。只會把字幕放在臉上的 Reels 永遠不可接受。 7. 切勿重複字幕。 面板不得顯示正在加字幕的詞語 — 不得有當前句子的動態文字,不得有上方的「大字幕」。面板是 視覺元素:圖示、圖表、UI 模型(終端機、時間軸)、隱喻、比較板、
facts.md中的事實。終端機指令、時間軸標籤和卡片標題也不得重複字幕。如果某個句子真的需要大字在螢幕上顯示,請改用nocap:true。 8. 仔細剪輯。01_cut_plan.py僅剪掉 ≥ 0.55 秒的停頓,根據片段本身的噪底測量靜音,在詞語後保留比之前更多的空間,並以自我檢查結束 — 任何「⚠️」表示先修正剪輯。每個剪輯點都從靜音開始並在靜音中結束。猶豫(「الـ…」、「اممم」)僅作為一個整體保留,兩側為靜音;重新開始(「اللي تحتاج… تحتاج」)則保留第二次的取用。最終渲染後,執行19_seam_check.py <work> <final.mp4>並修復任何重複或破損的詞語(在阿拉伯語模式下,它對英文術語的辨識效果較差 — 請使用-l en重新檢查)。 9. 交替面板位置。 混合使用R_DOWN(動畫在上方,臉部在下方)與R_UP(臉部在上方,動畫在底部 —panelIn會自動移動到那裡),再加上R_LOWER(大面板,小臉部)和R_FULL時刻。連續兩個解說場景不得使用相同位置。 10. 將每個場景繫結到單詞時間(caps.json中的單詞),而不是固定的秒數 — 重新剪輯時場景不會被打亂。 11. 特寫構圖: 臉部卡片從studio.json→cardTop裁剪;如果嘴巴低於 y ≈ 1600(Instagram 的字幕區域),則將其提高(≈ 0.3)。R_UP會自動在頭頂顯示更多空間。
從說話影片製作 Reel — 無需剪輯軟體
整個剪輯過程都是程式碼:
- ffmpeg 負責剪輯。
- Whisper 負責以單詞時間戳記進行轉錄。
- 渲染引擎負責組合字幕與動態圖像到影片上。
輸出:一個可直接發布的 MP4 檔案。
路徑: 所有 scripts/、references/ 和 motion/ 都位於此技能的資料夾中:
${CLAUDE_SKILL_DIR}
不是說話影片?請前往正確模式
| 輸入 | 模式 | 請參閱 |
|---|---|---|
| 無對話的片段資料夾(咖啡廳、餐點、產品) | 節奏剪輯 | references/montage.md |
| 同一場次有兩個或更多攝影機 | 播客 → Reels | references/podcast.md |
| 完整的「橫向」或「YouTube」單集 | 16:9 播客 | references/podcast.md(「完整橫向單集」部分) |
| 一小時的單集 → 多個 Reels | 從單集製作 Reels | references/landscape.md(「完整單集」部分) |
| 純文字或點子,無人物 | 動畫解說 | references/motion-mode.md |
| 網站連結或「解釋這個應用程式」 | 網站/應用程式解說 | references/motion-mode.md |
如果為此模式安裝了單獨的技能(dz-motion、dz-podcast 或 dz-montage),則優先使用。
⛔ 不要問「你想要哪種模式?」 — 用一句話告訴他你理解了什麼,然後繼續。
渲染器: 始終使用輕量版(04_render_frames.js),且不要提到「渲染器」這個詞。
- 他想自己修改?為他開啟工作室 →
references/studio.md - 僅當他明確要求時才使用 Remotion →
references/remotion.md
🎬 DaVinci: 要求「用 DaVinci 做」?這個外掛無法在 DaVinci Resolve 內部進行剪輯。用一句話告訴他,然後用我們的渲染器繼續(如果他想要自己完成,可以導出 SRT/FCPXML 檔案)。
🎞️ CapCut 模式: 他說「用 CapCut 做」或「我想自己在 CapCut 裡編輯」?改為輸出可編輯的 CapCut 專案(帶有縮放的片段、CapCut 字幕和文字、語音、特效、背景音樂、透明動畫)→ references/capcut.md(單一腳本 scripts/40_capcut.py)。
⛔ 你與使用者的互動方式
你負責準備,而不是他。 禁止給他一系列要執行的指令。
- 不要問「你有那個嗎?」 — 你自己檢查。 缺少東西?「我現在需要準備兩樣東西給你,需要兩分鐘 — 開始嗎?」
- 不要使用術語: 說「繪製幻燈片的工具」而不是「puppeteer」,說「影片品質」而不是「編解碼器」。
- 告訴他我們在哪個步驟, 並估算時間: 「我移除了停頓 — 影片長度減少了一半。現在我轉錄你的說話內容,大約 3 分鐘。」
- 一次只做一件事。
- 不要在每個重要階段之後,不給他看截圖或摘要就交付。
✅ 在哪裡執行?任何地方 — 手機 · 雲端 · Mac · Windows · Linux · Codex
本機裝置(Mac + Claude Code)最快最強大,但並非必要。禁止對使用者說「這在你的手機或雲端上無法完成」。如果某個工具在該環境中無法執行,請降級使用替代方案,並僅用一行提到你使用了什麼。
請參閱 references/any-environment.md — 提供替代方案(轉錄、人物裁切、動畫渲染…)和手機方法。以及經過測試的詳細食譜(無抖動裁剪、紙片動畫 style、組合)於 references/phone-cloud-playbook.md。
- 在手機上:他將影片附加到對話中,然後在雲端環境中執行,手機可以關閉。
- Windows:使用
python而非python3→references/windows.md。
Windows: 使用 python 而非 python3,路徑為 C:/… → references/windows.md
步驟 0、0.5 和 1 — 工具、品味與身份
請參閱並執行 references/start.md — 所有模式的開頭都相同。
步驟 2 — 從他那裡取得影片
| 方法 | 如何操作 |
|---|---|
| 他裝置上的檔案(最佳) | 複製到 <work>/src.mov |
| Google Drive 連結 | 設為「任何擁有連結的人均可檢視」,然後執行下方指令 |
| Google Drive Connector | 如果檔案是私有的 — 使用工作階段中的 Connector 工具 |
Drive 連結(ID 位於 /d/ 和 /view 之間):
curl -sL "https://drive.usercontent.google.com/download?id=<ID>&export=download&confirm=t" -o <work>/src.mov
- 4K 最好(縮放會從原始解析度裁切)。但 1080p 也有效 — 不要拒絕它,也不要要求重新拍攝。
- 橫向影片(訪談、播客、電視節目)?步驟相同。
步驟 6 會圍繞每個鏡頭的臉部縱向裁剪,而不是拉伸 →
references/landscape.md - 🪝 從單集或訪談製作的 Reel = 必須有書面鉤子。 在
02_captions.py之後:python3 scripts/22_hook.py suggest <work>- 從最有力的台詞(不是他說的第一句話)中寫下 3 個鉤子 →
check→ 他選擇 →apply preview並在完整渲染前閱讀hook_sheet.jpg。
- 在我們引擎之外構建的 Reel(現成的 mp4)?使用
22_hook.py overlay→hook.mov(透明)。 - 規則和格式 →
references/podcast-hook.md
檢查時長:
ffprobe -v error -show_entries format=duration -of csv=p=0 <work>/src.mov
🎞️ 掉幀?
螢幕錄製或非原生相機應用程式(iPhone 在瀏覽器中會丟失 13-54% 的幀)。在剪輯前檢查間隙:
ffprobe -v error -select_streams v -show_entries frame=pts_time -of csv=p=0 <work>/src.mov | python3 -c "import sys;t=[float(x) for x in sys.stdin if x.strip()];g=[(round(a,2),round(b-a,2)) for a,b in zip(t,t[1:]) if b-a>0.07];print(len(g),'間隙',g[:8])"
有間隙?在步驟 3 之前修復:
ffmpeg -i src.mov -vf "minterpolate=fps=30:mi_mode=mci:mc_mode=aobmc:me_mode=bidir:vsbmc=1" -c:a copy src_fixed.mov
並告訴他:「錄製時有掉幀 — 我已修復。下次建議他用相機應用程式拍攝。」
🔬 檢查光線和顏色(幾秒鐘,安靜地)
python3 scripts/25_scopes.py <work>
- 「正常」 ← 不要提及。
- 有問題(太暗、偏黃、暗淡) ← 一句話:「影片有點暗且偏黃 — 需要調整嗎?」
- 用單張截圖向他展示 before/after。
- 同意 → 在
theme.json中設定"grade":"auto"(僅校正色調)。 - 拒絕或保持沉默 → 不要碰它(規則 4)。
步驟 3-11 — 製作流程
3) 剪輯計劃
python3 scripts/01_cut_plan.py <work>
告訴他移除了多少:「我移除了 52 秒的靜音 — 影片從 98 秒變成 46 秒。」
3.5) 音訊增強(可選): 有迴音或噪音,或者他說「增強音訊」?
→ references/audio-enhance.md
bash scripts/02b_enhance_audio.sh <work> --local
4) 按單詞時間戳記轉錄
source "${CLAUDE_SKILL_DIR}/../../setup/env.sh"
ffmpeg -v error -i <work>/src.mov -vn -ac 1 -ar 16000 -y <work>/a.wav
python3 scripts/02a_transcribe_dz.py <work> > <work>/whisper.log 2>&1 # 阿拉伯語 / 達里賈語(預設 --lang ar)
# 英文影片:python3 scripts/02a_transcribe_dz.py <work> --lang en
# 使用阿爾及利亞模型 / 並排比較:--engine hadra | --engine compare(首次執行下載約 1.8 GB)
- 對於 Reel,在 GPU 上需要幾秒鐘到一分鐘。失敗?請檢查
tail -5 <work>/whisper.log - 預設引擎:在 Mac 上使用 whisper.cpp 時為
cpp,否則為whisper。對於新的阿爾及利亞語使用者,請執行一次--engine compare,並保留轉錄稿需要較少修正的引擎(使用--save-default儲存)。
5) 校正與字幕
閱讀 a.json 並修正每個句子 — Whisper 在阿爾及利亞達里賈語方面會出錯(將其轉換為標準阿拉伯語,法語單字拼寫錯誤)。根據 references/dialect-dz.md 進行校正(拼寫,以及使用者選擇的字體來書寫法語單字),如果你不認識某個單詞?問他,不要猜測。寫入 <work>/fixes.json:
{ "fix": [["هادي","حاجة","normal","بزاف"], ["نخدمو","بـ","Claude","Code"]], "hot": ["بزاف"],
"gloss": {"normal": "عادية", "Claude Code": "كلود كود"}, "fx": {"خلاص":"drop"} }
gloss= 放在引號內的阿拉伯語翻譯,跟在每個法語/英語單字後面 — 「normal "عادية"」。鍵是fix中出現的單字(或短語)。拉丁單字會自動套用顏色("hot_latin": false可以停用此功能)。02_captions.py會告訴你遺漏了什麼。hot= 在說話時會加上高亮效果的單字。fx是可選的 →references/word-fx.md- ⛔ 每個句子的單字數量 = Whisper 中該句子的單字數量。 否則時間戳記會錯亂(腳本會阻止你)。
python3 scripts/02_captions.py <work>
5.5) 向他展示文字,讓他移除不喜歡的部分 ← 強制
在設計任何場景之前:
python3 scripts/10_script_edit.py <work> show
- 會列印他的話語,帶有編號和時間戳,並寫入
script.txt。 - 還會在單次執行中列印重複的句子和刪除建議 — 之後不要執行
dupes。 - ⛔ 在聊天中完整列印腳本 並說:「你想移除哪些部分?」— 不要只依賴檔案。
重複的句子: 第一個是錯誤,第二個是修正。 「你把句子說了兩次 — 'قدرنا نحل السبب' 然後 'قدرنا نعرف السبب'。移除第一個?」
python3 scripts/10_script_edit.py <work> drop 6 8 # 從影片和音訊中移除這兩個句子
python3 scripts/10_script_edit.py <work> keep 1 2 5 9 # 僅保留這些
python3 scripts/10_script_edit.py <work> undo
- 所有後續內容都會移動,
cut.json、caps.json和sfx.json會更新。 - 在此處執行此操作。 在場景設計之後刪除會擾亂所有時間。
- 任何刪除後:重新執行步驟 6,並使用
--force進行渲染。
6) 剪輯與縮放
python3 scripts/03_cut_zoom.py <work>
mkdir -p <work>/vfr && ffmpeg -v error -i <work>/cutz.mp4 -vf fps=30 -q:v 3 -y <work>/vfr/%05d.jpg
- 縮放是每個片段固定的(6.0 版本): 首次執行會寫入
cut.json←"zooms": {"25.05": 1.06, …}(鍵是原始時間軸中片段的開始時間)。 移除、添加或分割片段?其餘片段的縮放不會偏移,因此你的渲染座標仍然正確。更改片段的縮放 = 編輯其數值。keep的順序是自由的(可以將後面的片段移到前面)。
6.1) ⛔ 從頭部上方裁剪 — 對任何包含人臉卡片的影片都是強制的(半螢幕、R_DOWN、R_LOWER):
python3 scripts/23_headcrop.py <work> --from <第一張卡片的開始時間>
- 寫入
studio.json←cardTop。 - 裁剪 在整個影片中固定 — 沒有追蹤,沒有攝影機跟隨。
- 從他頭部達到的最高點上方開始,留一個小邊距(1.5%)。
- 不要切到他的頭,也不要顯示空的天花板 — 「頭頂上方空間過大」同樣是錯誤。
- 使用者已經提醒過很多次,並且感到沮喪。
- 用眼睛檢查他靠近相機的鏡頭。
- 他身體下方有固定的文字?使用
theme.json←cardZoom進行縮放(預設值為 1)。
7) 設計場景 ← 最重要的步驟
在設計任何場景之前,請閱讀:
references/motion-rules.md— 身份識別、facts.md中的事實清單、禁止事項。references/scenes.md— 如何編寫場景、動作套件、點子、B-roll。references/moves.md— 動作庫:python3 scripts/35_moves.py plan --title "…" --cues …→ 影片的情節串連圖板(3 個圍繞中心的主題 + 變化)。你是有意識地選擇,使用者無需選擇。
🎯 從初稿就全力以赴(6.0 版本 — 被庫採用並流行的 Reel 風格): 在表演和動作上付出努力 — 豐富、深刻且令人驚喜,而不是平淡的東西。
- 在渲染之前,規劃 2-3 個深度時刻 並用一句話告訴使用者:一個元素 從他頭後經過(
11_behind_text.js person+MV.person)、來自他聲音的波動(37_env.py←MV.env)、他頭後的點狀圖、3D 軌道、客戶身份的形狀 成為動畫(標誌的弧線 = 計數器和筆觸)、One-take 入場(攝影機沉入標誌,然後從下一個鏡頭浮出)。 - 這是你要優先考慮的,並非唯一:卡片、印章和徽章 並非禁止 — 在主題需要時使用它們。
- 動作書寫其文字的句子 = 為它設定
nocap(不要在上方和下方之間分散注意力)。而頭頂書寫在空間允許時效果更好。 - 程式碼食譜 →
references/moves.md§3 及以下。
⛔ 規劃規則(經使用者認可):
| 時刻 | 矩形 | 形狀 |
|---|---|---|
| 無圖形的純說話 | R_FULL | 他的臉填滿螢幕,字幕位於底部 1460 |
| 任何圖形或動作 | R_DOWN | 圖形在上方(y 280-520)← 字幕 ← 他的臉在下方,全螢幕寬度 |
| B-roll 或大型面板 | R_LOWER | 大卡片在上方 ← 字幕 ← 他的小臉在下方 |
| 完整解說(數字、列表) | R_OFF | 沒有臉,只有他的聲音繼續 ← references/explainer-and-pace.md |
- ⛔ 字幕永遠不能寫在說話者的臉上。 在任何包含影片卡片的模式下,所有字幕都在卡片上方,進度條也是。
- 模式的選擇是你根據意義做出的決定。
8) 場景與編寫
python3 scripts/04_scenes.py <work>
python3 scripts/05_layers.py <work>
python3 scripts/06_export.py <work>
⛔ 04_scenes.py 中的規則:
- 每個場景一個想法。 沒有複合面板。
- 不要讓文字說話。 圖示、圖表、模型。
- 字幕與視覺效果之間的距離。 面板內容在時間上與字詞重疊,而不僅僅是同時出現。
facts.md在「關於」部分。 如果他提到了一個數字或事實,並且它存在於facts.md中,則在面板中使用它。- 節奏: 2 秒規則用於短語。長解釋 → 動畫面板。
9) 音效
python3 scripts/07_sfx.py <work>
- 自動:過渡、強調、節奏匹配。
- 可選:
references/sfx.md用於手動覆蓋。
10) 渲染
python3 scripts/04_render_frames.py <work>
ffmpeg -v error -i <work>/frames/%05d.png -i <work>/a_cut.wav -c:v libx264 -pix_fmt yuv420p -preset slow -crf 18 -c:a aac -b:a 192k -y <work>/final.mp4
- 告訴他需要多長時間:「渲染 2000 幀 — 在 Mac 上大約 5 分鐘。」
- 如果他說「太長」? →
references/fast-render.md
11) 最終檢查
python3 scripts/19_seam_check.py <work> <work>/final.mp4
- 修復任何重複或破損的詞語。
- 如果他說「完美」? → 交付。
- 如果他說「改變這個場景」? → 用手動場景編輯編輯
scenes.json,然後從步驟 8 重新開始。
支援的影片類型
| 類型 | 步驟 | 提示 |
|---|---|---|
| 純說話 | 標準流程 | 無需手動調整 |
| 橫向訪談 | 步驟 6 進行縱向裁剪 | 使用 references/landscape.md |
| 多機位播客 | 使用 references/podcast.md | 自動切換攝影機 |
| 螢幕錄製 | 步驟 2 檢查掉幀 | 使用 minterpolate 修復 |
| 手機影片 | 步驟 2 檢查旋轉 | 自動修正方向 |
附錄:用於 fixes.json 的常見修正
| 修正 | 範例 | 原因 |
|---|---|---|
| 標準阿拉伯語 → 達里賈語 | "أريد" → "حاب" | Whisper 傾向於標準阿拉伯語 |
| 法語拼寫 | "normal" → "نورمال" | 保留使用者選擇的字體 |
| 英語技術術語 | "API" → "API" | 保持原樣,添加註釋 |
| 重複 | "هادي" → 移除 | 口誤 |
常見問題
問:我需要安裝任何東西嗎? 答:首次使用,技能會要求你執行設定腳本(約 4 GB 下載)。之後,所有內容都在本機執行。
問:我可以在手機上使用嗎? 答:可以。將影片附加到對話中,技能會使用雲端環境進行處理。你的手機可以關閉。
問:輸出是什麼? 答:一個準備好發布到 Instagram 或 TikTok 的 MP4 檔案。
問:我可以自己編輯嗎? 答:可以。要求 CapCut 模式以獲得可編輯的專案,或 DaVinci 模式以獲得 SRT/FCPXML。
問:它支援英語或法語嗎? 答:可以。技能會自動偵測影片的語言。法語/英語術語會保留原文,並附加阿拉伯語註釋。