Reels 建構工具
引擎:$(reelsmith root)/engine/(build.py、template.html、music.py、pull_vo.py、capcut.py、fonts/)。每個 Reels 一個資料夾:<reel-dir>/reel.json → <reel-dir>/out/reel.mp4。如果 reelsmith 顯示未設定,請先執行 reelsmith setup 一次。
reelsmith new reels/my-reel # 建立包含 src/、vo/ 與範本 reel.json 的資料夾
reelsmith sheet reels/my-reel/src/* # 生成素材聯繫表 → 為每個片段挑選 ss
reelsmith build reels/my-reel --stills # 約 1 分鐘:產生幀、逐字時間碼、字幕、out/qa_sheet.jpg
reelsmith stills reels/my-reel 0.5,7.8,21.3 # 額外檢查幀
reelsmith build reels/my-reel # 完整渲染(60 秒約需 4–5 分鐘)
務必先執行 --stills:閱讀印出的字幕清單,並查看 out/qa_sheet.jpg(紅色區域 = Reels/TikTok UI 安全區,重要內容不可位於紅色區域內)。修正 reel.json 後再執行完整建構。檢查結尾印出的音量數據(−14 LUFS ±1,峰值 ≤ −1 dB)。然後在交付前,檢視最終 MP4 中每個效果與轉場附近的關鍵幀。
工作流程(創作者操作時間 ≈ 每個 Reels 10 分鐘)
- 腳本:
reel-script技能 → 創作者批准。用<em>…</em>標記重點詞;保留數字以利顯示。 - 配音:可使用創作者自己的錄音(
vo/vo.mp3)或 ElevenLabs(詳見docs/voice.md):TTS 文字 = 無標籤的腳本,數字拼寫為文字,品牌名稱用拼音表示。免費方案在 ElevenLabs 網頁 UI 中生成(Chrome 中的 Claude 可操控),然後執行reelsmith voice <reel-dir>將最新的兩個錄音拉入vo/並附上時長。將兩者轉錄,保留清晰的那個作為vo/vo.mp3。語速較慢時:在vo中加入"speed": 1.07。 - 素材:
footage-scout技能 — 僅使用最新素材(檢查used_footage.md)、聯繫表、隱私檢查。片段時長總和需等於配音結束時間 + 約 2 秒。 - 剪輯計畫:
reel-director技能為此故事挑選 3–5 個效果,並決定轉場位置。 - 編寫 reel.json →
--stills→ 修正 → 建構 → 交付out/reel.mp4+out/cover.jpg+out/caption.txt。 - 可選的 CapCut 音效優化:
reel-capcut技能(使用素材庫音效 + 依聽感選擇音樂)。
reel.json
{
"vo": {"file": "vo/vo.mp3", "offset": 0.25, "speed": 1.07, "gaps": [[5.73, 0.8]]},
"script": "我花了三個月改寫指南,昨天又換了封面字型<em>第四次</em>。…",
"hook": {"tag": "永無止境的草稿情境", "lines": ["指南快完成了。", "<em>已經三個月了</em>"], "out": 5.55},
"end": {"from": 55.6, "lines": ["你的那份", "<em>等了多久?</em>"], "lines_at": [55.75, 56.6],
"sub": "留言告訴我", "sub_at": "@comments", "handle": "@yourhandle", "handle_at": 58.6},
"cover": {"from": 0, "to": 4.35, "title": "草稿", "left": "No.4 · 十月", "right": "@yourhandle", "top": 330},
"cover_t": 2.0,
"stamps": [{"seg": ["I", "J"], "text": "tanya · 草稿兩年"}],
"punch": [[3.02, 4.4], ["@thousand", 9.0]],
"segments": [
{"id": "A", "clip": "src/night_desk.mp4", "ss": 9.5, "dur": 2.5, "crop": [0, 0.196, 0.75], "cut": true},
{"id": "B", "clip": "src/keys.mp4", "ss": 1.3, "dur": 1.9, "move": "none"},
{"id": "E", "clip": "src/phone_walk.mov", "ss": 0.8, "dur": 4.5, "cut": true, "in": "zoom"},
{"id": "I", "clip": "src/cafe.mp4", "ss": 0.3, "dur": 3.2, "look": "bw"},
{"id": "K", "clip": "src/walk.mov", "ss": 14.0, "dur": 4.95, "look": "burst"},
{"id": "N", "clip": "src/breakfast.mov", "ss": 0.0, "dur": 3.45, "rate": 0.4},
{"id": "Q", "clip": "src/meadow.mov", "ss": 13.2, "dur": 9.1, "move": "pull-out", "in": "zoom"}
],
"caption": "…",
"music": "synth"
}
一個完整的真實範例(烏克蘭文,61 秒,17 個片段,包含以下所有效果)位於 $(reelsmith root)/examples/chernetka/reel.json;最小範例在 examples/template/reel.json。
配音與字幕
- lang:配音的 Whisper 語言(
"uk"、"en"…);省略則自動偵測(或使用REELSMITH_LANG)。 - vo.gaps
[vo_time, extra_s]:在(加速後的)配音中該時間附近最安靜處插入的呼吸暫停——留給照片蒙太奇使用。vo.speed:atempo 加速係數。 - "@word" 錨點:鉤子、結尾、塗鴉、玻璃字體、檢查清單、封面、環繞文字、頭條牆、放大切入、subs_skip 中的任何時間點可以用
"@thousand"(該腳本詞語的起始時間;完全匹配優先,否則前綴匹配)、"@again#2"(第二次出現)、"@twice+0.3"。Whisper 辨識錯誤的詞語會使用內插時間——請在這些位置改用秒數。out/words.json在--stills後會包含真實時間碼。 - subs / punch:省略則自動從
script+ 逐字時間碼產生(5–7 個詞,1–2 行,重點詞以斜體強調色顯示,結尾不加句點,行尾不得以「和/的/在…」結束;重點短語間隔 ≥ 3 秒時自動放大切入最多 4 處)。可用"subs": [[a, b, "html"]]、"punch": [[a, b]]覆蓋。字幕會在鉤子卡片顯示時、玻璃字體與檢查清單下方、以及結尾卡片開始後隱藏(可透過subs_from/subs_until/subs_skip [[a, b]]調整)。
卡片與文字
- hook:從第 0 幀開始顯示的紙質卡片(
at: [t…]依序揭示每行文字,可設定size、top)。end:從from開始顯示的結尾卡片,lines_at指定每行出現時間,sub為副標題,handle為帳號。 - stamps:在指定片段的左上角顯示單色圓角標籤(地點、日期、角色名稱)。
- cover(封面故事 + 框架破裂效果):雜誌風格的刊頭,自適應寬度,字母逐個掉落;對於
"cut": true的片段,人物會站在標題前方。選擇/裁剪一個鏡頭,使頭頂位於刊頭頂部下方 40–80 像素處——絕不可遮擋眼睛。可用color設定刊頭顏色,top調整位置。cover_t約為 2 秒,以便out/cover.jpg顯示完成的封面。 - glass(玻璃字體):
{"from", "to", "lines", "at", "top"}霧面玻璃效果標題。 - checklist:
{"from", "to", "title", "items": [{"text", "sub", "at", "sub_at"}]}卡片,逐項增長,在at時間繪製勾選標記。 - wall(頭條牆):
{"from", "to", "items": [...], "every": 0.06}檔名/標題方塊堆疊效果;可在上方疊加玻璃字體標題。 - orbit(環繞文字):
{"from", "to", "seg", "text": "1000 粉絲 · ", "speed", "scale", "tilt", "lift"}文字環繞人物頭部,適用於cut片段;後半部分會穿過人物後方。最適合近距離自拍。 - doodles(塗鴉動畫):
{"kind": "text"|"circle"|"underline"|"strike"|"arrow", "at", "to", "x", "y", …}— 文字:text, size, rot, write;圓圈/刪除線:w, h(刪除線n表示之字形數;設定為 3 可保持單詞可讀);底線:w;箭頭:x2, y2, bend;可指定color、width。重點墨水搭配奶油色光暈,從左到右書寫,每 3 幀輕微抖動。當鉤子卡片顯示時,請將塗鴉保持在大約 y > 1000 的區域內,並避免遮擋臉部。
片段
- 路徑:相對於 Reels 資料夾,然後是當前目錄,最後是儲存庫。HEIC/JPG 照片透過
img處理即可。 ss為片段的開始時間(秒),dur為持續時間;pos0–1 為寬素材的水平構圖;crop [x, y, size]為直幅畫面的放大裁切(從 4K 來源保持清晰);rate< 1 為慢動作,僅在可用部分較短時使用。- cut:
true表示為此片段啟用 macOS Vision 人物遮罩(reelsmith masks,約 0.2 秒/幀,已快取)。封面故事與環繞文字效果需要此設定。 - in:
"zoom"(前一個鏡頭模糊衝入,新鏡頭從縮放中落地)或"whip"(快速模糊滑動,無黑邊)。僅在 4–6 個關鍵剪輯點使用,並非每個剪輯點都需要。 - look:
""暖色電影感 ·"memory"淡出縮放飛入效果(適用於照片蒙太奇,date可加入橘色相機日期戳) ·"bw"黑白效果(音樂同時變悶) ·"burst"灰色轉彩色綻放效果(音樂同時展開)。 - move:
push(預設緩慢推近) ·tilt-up·pull-out·none。
聲音與色彩
- music:
"synth"(根據畫面風格生成的 lo-fi 背景音樂,可作為佔位用,創作者通常偏好真實音樂軌道)、有權利使用的音訊檔案路徑,或null。原始片段聲音絕不使用。 - music_gain:預設 0.16,低於配音音量(已啟用側鏈壓縮)。
- colors:
{"accent": "#D4573A", "cream": "#F4EFE6", "ink": "#1F1A17"}(預設:米色/陶土色)。
來自真實反饋的規則
- 效果必須在手機尺寸上第一次觀看時就能讀懂:要大、使用強調色、有動畫。細小的奶油色塗鴉和半透明的玻璃面板會被認為「效果在哪裡?」。
- 剪輯點上不要重複使用白色閃爍。靜音原始片段聲音。每個 Reels 使用 3–5 種技術,不要全部都用。
- 絕對不要將文字、卡片或塗鴉放在眼睛上;移動卡片或重新構圖。
- 以全解析度檢查片段中的螢幕與背景:他人的訊息、車牌、街道名稱、私人儀表板 → 跳過這些秒數。
- 每個 Reels 使用全新的素材(檢查
used_footage.md)。使用包含他人臉部的鏡頭前需先詢問。