Communitygithub.com

Moh4696/cinematic-film

從程式碼生成帶旁白的電影級影片,單一連續鏡頭滑過由照片、文件、卡片、地圖與大數字構成的世界,所有視覺元素精準配合旁白語音。

cinematic-film 是什麼?

這項技能讓你完全透過程式碼(Python 與 Skia)製作帶旁白說明的電影級影片。它建立一個單一連續攝影機鏡頭滑過的世界,所有視覺元素(照片、文件、卡片、地圖路線、數字)都精準對齊旁白的每個詞。支援多種視覺風格(歷史調查、產品發表、科學解說、科技預告),並包含完整工作流程:從劇本編寫、圖片搜尋、語音產生(TTS 或真人錄音)、音效合成到最終渲染與字幕燒錄。主要平台為 Python 3.9+ 環境,依賴 skia-python、numpy、pillow 與 ffmpeg。專案結構乾淨,提供範本與範例,適合建立紀錄片、產品故事、品牌創辦人故事、科學與科技解說、傳記與真實犯罪等內容。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Moh4696/cinematic-skill/tree/HEAD/skills/cinematic-film

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

電影級影片

以這種方式製作的電影,就是一次攝影機運鏡走過一個世界。每張照片、卡片、剪報、地圖與數字都位於一個大版面上,攝影機沿著線、路線與箭頭在它們之間移動,隨著故事推進。每個視覺重點都精準落在旁白說出的詞上。全部都是程式碼(Python 的 Skia),因此每次渲染結果一致,任何主題都適用,換個新聲音就能自動重新調整整部影片的時間。

本技能源自一部關於艾爾·卡彭的 5 分 22 秒紀錄片,隨後開放給任何主題使用。這裡的規則是從製作過程中遇到的問題歸納出來的。

工具

檔案功能
scripts/check_setup.py檢查 Python、skia-python、ffmpeg、字型與記憶體;告知需要安裝什麼
scripts/get_fonts.py下載開放授權字型(Bebas Neue、Homemade Apple),補足本機缺少的文字角色
scripts/new_project.py從 assets/template/(可執行的解說範例)或使用 --example 從紀錄片範例啟動專案
scripts/make_beats.py撰寫 beats.md(你將核准的表格);檢查時間順序、行長度、口語文字中的數字
scripts/tts_say.py免費的草稿語音(macOS say、espeak-ng 或任何 TTS 指令),在最終語音前為影片計時
scripts/split_takes.py將整個段落的錄音切割成每行一個片段,並標記可疑的剪接點
scripts/build_narration.py將各片段合併成 audio/narration.m4a 與 audio/timing.json,這是影片建立的基礎
scripts/fetch_commons.py搜尋 Wikimedia Commons,下載並附帶授權與來源資訊,拒絕非自由檔案,撰寫 credits.md
scripts/make_map.py投影公共領域的邊界(任何國家或地區),用於地圖
scripts/prep_assets.py將每張圖片分級為統一風格(黑白、復古棕或自然色);產生版面紋理
scripts/engine.py電影引擎:攝影機、聚光燈、物品、地圖、外觀、影片完成
scripts/render.py靜止幀、聯絡表、提示列表與平行 MP4 渲染
scripts/build_sfx.py從提示列表合成所有音效(無樣本,無需授權)
scripts/mix_soundtrack.py語音、音效與可選音樂,進行閃避與響度正規化
scripts/burn_captions.py將四種字幕風格之一燒錄到完成的影片中,並撰寫 SRT 檔案

需要 Python 3.9+、pip install skia-python numpy pillow(scipy 為選用)與 ffmpeg。先執行 scripts/check_setup.py;在 Linux 或 Windows 上,每個專案也要執行 scripts/get_fonts.py。所有指令都接受 --project <資料夾> 參數。

選擇影片類型

類型外觀圖片典型物品
歷史、真實犯罪、調查wall、slate歸檔照片與文件,分級為 bw印刷品、撕破的剪報、郵票、紅線、地圖路線
產品發表、品牌或創辦人故事studio、charcoal你的產品照片與團隊照片,分級為 natural卡片、大數字、計數器、箭頭
科學、工程、運作原理blueprint、paper圖表、歸檔或 AI 靜止幀卡片、計數器、筆跡、地圖
科技、太空、預告片night螢幕截圖、渲染圖、AI 靜止幀大文字、計數器、路線、卡片

可以自由混搭:外觀是版面的背景與最終效果,每個物品在任何外觀下都能運作。references/story.md 為每種影片類型提供了故事結構。

規則

  1. 每行一個主角。 每行旁白只有一個攝影機對準的主體。聚光燈會讓其他所有東西變暗。
  2. 重點落在口語單詞上。 郵戳在「起訴」時重擊落下,而不是在行開頭。使用 doc.W(line, "word") 來計時所有事物。
  3. 一個短語只顯示一次。 要嘛在螢幕上打出文字,要嘛在真實文件上顯示,兩者不可並存。文件上的內文是灰色行,絕不填入填充詞。
  4. 開場後時間只向前推進。 冷開場可以跳躍到未來。在一行過渡句(「四年前…」)之後,故事時間只能向前。
  5. 文字要在手機上一秒內能讀完。 大寫的緊湊字體。螢幕上的標籤文字高度約為畫面高度的 3% 或更多。
  6. 少即是多。 線條在節拍過後淡出,舊物品變暗。最終拉遠的畫面應該看起來有條理,而不是雜亂。
  7. 不可發明看起來真實的東西。 真實照片與文件必須附帶來源資訊。由程式碼繪製的文件必須標示為「重構」,並僅引用實際寫下的詞彙。AI 圖片可作為插圖使用,但絕不能作為真實事件或真實人物的證據。

工作流程

在四個關卡(標示為 Gate)停下,等待使用者核准。

  1. 故事。 研究,然後撰寫 script.json:將場景(段落)分行,每行包含 text、spoken(數字轉為文字)、hero 與 typed。同時保留事實註解。60 到 90 秒約 150 到 230 個單詞。詳細資訊在 references/story.md。
  2. 節拍表。 執行 scripts/make_beats.py 並修正所有 lint 警告。Gate: 使用者核准 beats.md,包括其中的事實。
  3. 圖片。 在 photos.json 中列出每張圖片:其 id、類型與來源。
    • 歸檔圖片:使用 fetch_commons.py search、category 與 get。
    • 使用者自己的檔案:放到 <專案>/assets/photos/。
    • AI 靜止幀:以同一風格產生(motion-assets 技能負責規劃與估價)。
    • references/archive.md 涵蓋其他歸檔來源與版權規則。
  4. 草稿語音。 執行 tts_say.py,然後 split_takes.py,再執行 build_narration.py。聆聽 split_takes.py 標記的每行。現在時間點就確定了。
  5. 資產。 如果故事涉及移動,執行 make_map.py,然後執行 prep_assets.py。
  6. 場景。 撰寫 scene.py:依照段落將物品分群組排列在版面上,使用 doc.L/doc.W 時間加入物品,然後設定攝影機與聚光燈關鍵影格(film.shot)。閱讀 references/film.md。兩個已出貨專案展示了模式:assets/template/scene.py(解說片、studio 外觀)與 assets/wright-flyer/scene.py(紀錄片、使用所有物品類型)。
  7. 外觀測試。 以 1280x720 解析度對每行執行 render.py --probe,檢視所有靜止幀,然後對每個大攝影機運鏡執行 --strip。Gate: 向使用者展示開場靜止幀與外觀。
  8. 草稿。 以 1280x720 解析度與草稿語音渲染前 30 秒。Gate: 使用者觀看草稿。
  9. 最終語音。 使用任何 TTS 或真人錄音(references/voice.md)。再次執行分割、建置與探測;場景中沒有任何變動。
  10. 音效。 執行 render.py --cues,然後 build_sfx.py,再執行 mix_soundtrack.py,如需配樂可加入。閱讀 references/sound.md。
  11. 完成。 執行完整渲染,然後執行 burn_captions.py 與 SRT 輸出。在進行 1440p 或 4K 渲染前閱讀 references/performance.md。與影片一同交付 credits.md。

每次自我檢查

在宣稱任何內容可運作之前,先檢視靜止幀。以下是實際渲染時曾出現的錯誤:

  • 深色墨水上深色版面:看不見。在深色外觀上使用淺色文字,或在深色文字後方使用 bar_h=0.92 的全標籤區塊。
  • 攝影機已移動,但聚光燈留在原地,導致畫面變暗。使用 film.shot(),除非它們應該分開移動。
  • 地圖比例太小:整個海岸線比一張照片還小。選取 K 值,讓每個有印刷品的地點都有自己的空間(references/film.md)。
  • 地圖標籤重疊。將標籤放在遠離相鄰標籤的那一側。
  • 物品群組橫跨地圖邊緣。保持物品群組完全在地圖上或完全在地圖外。
  • 高亮標記與文字差幾個像素。使用 PaperDoc.phrase_spans,並使用 doc.on(print, fx, fy) 搭配從圖像網格疊加層讀取的比例。

已出貨專案

  • assets/template/:「從櫻桃到杯中」,一部 25 秒的 studio 外觀解說片,由卡片、箭頭與計數器組成,無需圖片。new_project.py my-film 複製此專案。給予草稿語音即可渲染。
  • assets/wright-flyer/:「十二秒」,一部 90 秒的紀錄片,講述首次飛行以及一位獎金五萬美元、墜毀兩次的競爭對手。使用了七張公共領域照片、美國地圖、兩份排版文件與每一種物品類型。
python3 scripts/new_project.py wright --example
python3 scripts/fetch_commons.py get --project wright
python3 scripts/make_map.py --project wright && python3 scripts/prep_assets.py --project wright
python3 scripts/tts_say.py --project wright && python3 scripts/split_takes.py --project wright && python3 scripts/build_narration.py --project wright
python3 scripts/render.py --project wright --size 1280x720 --out out/draft.mp4 --audio audio/narration.m4a

相關技能

來自 Open 3D Skills:motion-assets 負責規劃與估價 AI 靜止幀(當影片需要插圖時),frame-capture 則錄製網頁而非由程式碼繪製影片。

相關技能