小Lin說講解包裝
把一組出鏡口播片段(A-roll)和台詞,包裝成小Lin說式的講解影片。出鏡畫面由別的工具生成或拍攝。這個 skill 負責查包裝要用的資料,以及講解畫面、字幕、轉場和聲音。
如果環境裡有 design-aesthetic-standard,視覺和聲音的創作判斷同時遵循它。如果有 video-generation,出鏡片段的生成和剪輯見它。
參考文件(按需讀取)
references/style-bible.md:她的圖形語言、6 條硬規則、色板、字體、畫中畫、轉場統計、聲音電平。規劃場景前必須讀。references/research.md:每種版式要查什麼資料、來源分級、去哪裡查、圖片權利。規劃場景時讀。references/layouts.md:每個版式元件的參數、範例調用和陷阱。寫分鏡時讀。references/storyboard-api.md:timeline.json和project.json格式、分鏡 API、關鍵詞計時、審片和渲染命令。第一次搭工程時讀。
環境
- Node ≥ 18、ffmpeg、python3(帶 numpy 和 Pillow)。
npm install和第一次渲染需要聯網(Remotion 會下載 Chrome)。 - 只在 macOS(Apple Silicon)上實測過。其他系統預設用軟體渲染
swangle,可以用環境變數REMOTION_GL改。 - 字體:模板帶 6 個 SIL OFL 字體,許可證見
templates/engine/public/fonts/LICENSES.txt。優設標題黑(YouShe.ttf)可能不在包裡。new_project.sh會在$YOUSHE_TTF和常見字體目錄裡找;找不到時,提示使用者從 https://www.uisdc.com/uisdc-first-free-font 下載,存為public/fonts/YouShe.ttf。缺這個字體時,標題和字幕回退到思源黑體最粗字重(900),沒有斜切,風格會明顯變弱。 - Remotion 許可:個人、3 人以內的公司和非營利組織可以免費使用,包括商用。4 人以上的公司要買公司授權(https://www.remotion.pro/license)。
工作流
1. 準備輸入
- 出鏡片段:每句一個 1920×1080 的 mp4,放進
public/clips/<id>.mp4。 - 台詞:每句有朗讀文字
say(漢字寫法)和字幕文字sub。 - 事實檔案:從
templates/facts_template.md複製。已有的事實和來源先寫進去,缺的在第 4 步查。 - 可選:實拍或 AI 圖(
public/broll/)、照片(public/photos/)、音樂(public/music/)、新圖示(public/icons/)。
2. 建工程
<skill>/scripts/new_project.sh <工程目錄> # 加 --demo 會生成 4 段假出鏡和範例分鏡,用來冒煙測試
然後寫 timeline.json。轉寫每段出鏡影片,定出 tin/tout,剪掉首尾靜音;中間的口誤寫進 cuts。改 project.json 的 brand 和 music。
3. 規劃場景(先寫表,再寫程式碼)
讀 style-bible.md 和 research.md 後,列一張表:場景名 | 覆蓋哪幾句 | 版式 | 深色還是白紙 | 畫中畫方式 | 需要的資料。檢查以下 5 點:
- 一個場景跨 2–8 句,不要一句一頁。
- 每個場景都能指出「主體被裁切」或「主體佔畫面 60% 以上」(R1)。
- 每 2–3 個深色場景之間有 1 個白紙場景(R2)。
- 引用原文的地方用
docpage,而且原文是真實的逐字引用。 - 開場鉤子、觀點句、轉折句和結尾留給全螢幕出鏡,不要全部蓋上講解畫面。
4. 查資料
按場景表的「需要的資料」一列逐條查,方法見 research.md。每條結果寫進事實檔案,帶編號、原文、來源連結和日期。照片用 scripts/commons_photo.py 搜尋和下載。
查完回改場景表:找不到逐字原文的,不用 docpage;湊不齊同口徑資料的,不用 paper。台詞裡的數字和事實檔案不一致時,先改台詞,再生成或重剪出鏡片段。
5. 寫分鏡
從 templates/scenes_example.py 複製寫法。每個場景都要:
- 元素入場對齊關鍵詞:
S.k('關鍵詞', -0.15)。 - 目前項亮起,其餘壓暗(
focus/hl/lit)。鏡頭跟到目前項(sc.cam/look)。 - 用
KF.append((標籤, 時刻))登記至少 1 張審片幀。
執行 python3 story_core.py timeline.json scenes.py,確認 gaps/overlaps []。
6. 關鍵幀審片(最少 2 輪)
python3 -c "import json;print(' '.join(str(f) for _,f in json.load(open('keyframes.json'))))" | xargs node render.mjs stills stills/k1
python3 <skill>/scripts/sheet.py stills/k1 keyframes.json 6
逐張查看拼圖,按下面的審片清單修改,然後重渲染改過的幀。有她的原片時,截取同類版式的原幀並排對比。
7. 整片、混音、合成、質檢
<skill>/scripts/render_chunks.sh video.mp4
python3 <skill>/scripts/mix_audio.py timeline.json mix_raw.wav
<skill>/scripts/finalize.sh video.mp4 mix_raw.wav final.mp4
python3 <skill>/scripts/audit.py video.mp4 72 # 影片幀和靜幀逐幀對比,flagged 必須為 0
手機版:ffmpeg -i final.mp4 -c:v libx264 -crf 23 -preset medium -pix_fmt yuv420p -c:a aac -b:a 128k -movflags +faststart final_phone.mp4。
審片清單
每張關鍵幀都檢查:
- 主體夠大,或者被邊緣裁切。四周沒有大片空白。
- 目前講到的項最亮,鏡頭在它附近。
- 一幀最多 2 個標籤。
- 沒有東西被字幕(畫面 y 905–960)、畫中畫、台標和 AI 標註擋住。
- 沒有方框字(缺字形)、沒有換行成直排的詞、沒有溢出卡片的字。
- 數字、單位和原文與事實檔案一致,來源行存在,CC BY 照片有署名。
- 白紙場景和深色場景交替出現。
已知陷阱
- 關鍵詞在句首時,
S.k(詞, -0.3)會早於片段起點。用max(S.t0, …)截住。 formula6的 token 列寬等於iw。iw必須 ≥ 字數 ×fs。- 畫面 x = (世界 x − 鏡頭 x) × s + 960。
piprect佔畫面 x 110–560,主體放在 ≥ 600 的位置。改鏡頭位置時,主體在畫面上的位置也跟著變。 ui結果單位預設是「元/月」,用u=改。paper卡底邊的畫面 y 要 ≤ 900。ent6國旗只有clcndefrjpus。- 圖片路徑不存在時,該幀渲染失敗(
FAIL ... Error loading image)。先用ls public/<路徑>確認。 - 靜幀正常不代表影片正常。整片之後必須跑
audit.py。 - 漸層立體字超過 600px 會讓 Chrome 卡住。不要去掉
GText的層數和模糊上限。
使用邊界
- 這是風格複刻工具。成片保留
brand.label的「AI 生成 · 非本人」標註,不要去掉。 brand.logo預設為空。填使用者自己的台標;不要填「小Lin說」或其他真實創作者的台標後公開發布。- 不要用真實創作者的肖像或聲音生成出鏡畫面後公開發布。
- 不要把成片當成本人作品發布,也不要用來誤導觀眾。
- 上螢幕的資料、原文和政策條文,都要能追溯到來源。