電影級影片
以這種方式製作的電影,就是一次攝影機運鏡走過一個世界。每張照片、卡片、剪報、地圖與數字都位於一個大版面上,攝影機沿著線、路線與箭頭在它們之間移動,隨著故事推進。每個視覺重點都精準落在旁白說出的詞上。全部都是程式碼(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 為每種影片類型提供了故事結構。
規則
- 每行一個主角。 每行旁白只有一個攝影機對準的主體。聚光燈會讓其他所有東西變暗。
- 重點落在口語單詞上。 郵戳在「起訴」時重擊落下,而不是在行開頭。使用
doc.W(line, "word")來計時所有事物。 - 一個短語只顯示一次。 要嘛在螢幕上打出文字,要嘛在真實文件上顯示,兩者不可並存。文件上的內文是灰色行,絕不填入填充詞。
- 開場後時間只向前推進。 冷開場可以跳躍到未來。在一行過渡句(「四年前…」)之後,故事時間只能向前。
- 文字要在手機上一秒內能讀完。 大寫的緊湊字體。螢幕上的標籤文字高度約為畫面高度的 3% 或更多。
- 少即是多。 線條在節拍過後淡出,舊物品變暗。最終拉遠的畫面應該看起來有條理,而不是雜亂。
- 不可發明看起來真實的東西。 真實照片與文件必須附帶來源資訊。由程式碼繪製的文件必須標示為「重構」,並僅引用實際寫下的詞彙。AI 圖片可作為插圖使用,但絕不能作為真實事件或真實人物的證據。
工作流程
在四個關卡(標示為 Gate)停下,等待使用者核准。
- 故事。 研究,然後撰寫
script.json:將場景(段落)分行,每行包含text、spoken(數字轉為文字)、hero與typed。同時保留事實註解。60 到 90 秒約 150 到 230 個單詞。詳細資訊在references/story.md。 - 節拍表。 執行
scripts/make_beats.py並修正所有 lint 警告。Gate: 使用者核准beats.md,包括其中的事實。 - 圖片。 在
photos.json中列出每張圖片:其 id、類型與來源。- 歸檔圖片:使用
fetch_commons.py search、category與get。 - 使用者自己的檔案:放到
<專案>/assets/photos/。 - AI 靜止幀:以同一風格產生(
motion-assets技能負責規劃與估價)。 references/archive.md涵蓋其他歸檔來源與版權規則。
- 歸檔圖片:使用
- 草稿語音。 執行
tts_say.py,然後split_takes.py,再執行build_narration.py。聆聽split_takes.py標記的每行。現在時間點就確定了。 - 資產。 如果故事涉及移動,執行
make_map.py,然後執行prep_assets.py。 - 場景。 撰寫
scene.py:依照段落將物品分群組排列在版面上,使用doc.L/doc.W時間加入物品,然後設定攝影機與聚光燈關鍵影格(film.shot)。閱讀references/film.md。兩個已出貨專案展示了模式:assets/template/scene.py(解說片、studio 外觀)與assets/wright-flyer/scene.py(紀錄片、使用所有物品類型)。 - 外觀測試。 以 1280x720 解析度對每行執行
render.py --probe,檢視所有靜止幀,然後對每個大攝影機運鏡執行--strip。Gate: 向使用者展示開場靜止幀與外觀。 - 草稿。 以 1280x720 解析度與草稿語音渲染前 30 秒。Gate: 使用者觀看草稿。
- 最終語音。 使用任何 TTS 或真人錄音(
references/voice.md)。再次執行分割、建置與探測;場景中沒有任何變動。 - 音效。 執行
render.py --cues,然後build_sfx.py,再執行mix_soundtrack.py,如需配樂可加入。閱讀references/sound.md。 - 完成。 執行完整渲染,然後執行
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 則錄製網頁而非由程式碼繪製影片。