Talking Explainer
語音是時鐘,主持人會 說話(嘴型同步),每個概念先以日常圖片呈現,每個場景都有縮放和強調時刻,整體風格為 Apple,且影片承載使用者的品牌。範例:"REA - Reverse Engineer Anything"(129.0 秒,12 個場景)- references/example/(SCRIPT, STORYBOARD, RETIME)。
以下使用的路徑:
<skill>= 此技能資料夾。<kit>=<skill>/../explainer-kit。<engine>=<skill>/../spatial-film。<home>=TALKING_EXPLAINER_HOME或~/.talking-explainer;profile =<home>/profile/(與 explainer-kit 共享)。<py>= 儲存在<home>/config.json中由 setup-check 設定的python指令(Windows 上為py -3.12,macOS 上為python3)。
每個影片腳本都從影片專案根目錄執行。腳本是經過驗證的程式碼 - 執行它們,切勿重新產生。透過連絡頁來判斷場景,不要在主要 session 中讀取場景的 HTML。工作者取得的是檔案路徑。
設定(僅首次執行)
<home>/profile/brand.json 不存在 = 執行 explainer-kit 的 Phase S(setup-check、品牌訪談 + profile.mjs init、voice.md、音樂)。其品牌訪談會設定主持人的名稱(--presenter)。此技能還有兩項在相同訪談中詢問的事項:
- 開場與結尾台詞:在
voice.md中,逐字逐句,包含使用者的名字(鉤子開場為「<主張>?是真的嗎?<名字> 在此,來自 <品牌>...讓我們來剖析。」)。 - 主持人:內建的示範角色(一位面無表情、戴眼鏡的卡通人物),或他們自己的角色 - 請參閱下方「你自己的說話角色」。
預設值(請勿重複詢問)
- 旁白使用 profile 中的語言,風格根據
voice.md中的使用者風格。螢幕文字 = 簡短的基礎英文(每行標題約 6 個單詞)。長度不拘,只要訊息傳達清楚即可(自然錄製時約每分鐘 150-160 個單詞)。 - 使用者從腳本錄製旁白(使用他們自己的 ElevenLabs 語音克隆或自己的麥克風)。Phase 1 將腳本以可貼上的段落形式提供,並等待一個 MP3 檔案。僅在使用者要求時,才透過 API 產生(
<engine>/scripts/el-tts.py,金鑰在環境變數EL中,絕不寫入磁碟)。 - 開場 = 鉤子優先: 以主題最令人驚訝的主張作為問題開場,接著是
voice.md中的開場台詞。主題的名稱在第二段才出現。結尾 =voice.md中的結尾台詞 + profile 中的cta。 - 概念性主題使用一個日常比喻進行字面說明(REA:咖啡館的秘密拿鐵配方)。關於使用者自己工具或系統的「運作方式」主題則改為使用真實事物的逐步解說 -
references/real-apps.md。第三方工具和平台也是如此:指名真實產品,描述真實的請求流程,並使用平台自己的文案、設定以及從其即時頁面讀取的數字。對於任何技術主題,預設使用逐步解說。 - 短片(<= 30 秒): ~2.6 字/秒,4 段 = 4 個畫面(鉤子 + 識別 / 名稱 / 那張圖片 / 結尾),一行結尾語,2 個工作者 x 2 個場景。
- 議題 / 新聞主題: 先研究即時報導(本地媒體 + 一篇深度報導),然後平衡撰寫:每個主張都要在旁白中標明來源("according to the agency...", "critics say..."),恐懼要呈現其實際規模,然後列出編號的灰色地帶,其中官方聲明互相矛盾或關鍵細節尚未公開,一個公平的正面段落,以及一個有待追問的問題總結 - 絕不下定論。任何僅由搜尋摘要提供的內容(頁面本身無法載入)都保留在 SCRIPT.md 的事實區塊中,標記為「未經證實,未納入旁白」。這類主題 16 個畫面 / ~700 個單詞是合適的。
- 從貼上的逐字稿產生腳本: 保留來源的事實和想法順序,用敘述者的語氣改寫每一行(切勿逐行翻譯),並刪除來源主持人自己的部分("I built..."、程式碼示範、他們的名字)。長貼文大約在 50k 字元處截斷:在 SCRIPT.md 中標明截斷位置,然後用標準機制填補缺失部分,並像其他主張一樣進行檢查。第一天就將貼文儲存到
references/source-transcript.txt,並保留來源中提及的人物和里程碑。 - 真實人物 = 人物卡片,而非名稱標籤: 肖像(雙色調照片或插圖風格頭像)+ 名稱 + 一行角色 + 年份。在 SCRIPT.md 中列出每個被提及的人物及其所在場景,放在「螢幕上的人物」之下。
- 風格 = Apple: 白色打光(
#F5F5F7背景)、Geist 字體搭配依尺寸微調的字距、仿玻璃(.ap-glass- 絕不在 3D 場景中使用backdrop-filter)、.ap-window/.ap-dark面板、臨界阻尼的sp()彈簧(禁止使用back.*動畫)、克制(每個畫面一個想法,脈衝 <= 1.1)、藍色 LENS 脊椎。腳手架會設定所有這些。 - 圖示 = Solar(480 Design,https://solar-icons.vercel.app)- 主要圖示使用粗體雙色調,UI 框架使用線性,來源為
references/icons-solar.html。絕不使用 Lucide 或 Phosphor。藝術作品採用 CC BY 4.0 授權:每個交付物都會給使用者這行文字「Icons: Solar by 480 Design (CC BY 4.0)」以便用於影片描述。 - 動態: 標題以單詞為單位顯現(上升 + 模糊 -> 0,彈簧)、任何工具的 UI 動畫、解說圖表,再加上每個場景都有的鏡頭推進(ZOOM)和強調節奏(EMPH:脈衝、標記掃描、底線繪製、焦距拉移、數字彈出)。60fps 流暢法則。
- 1920x1080,60fps。品牌 Logo 出現在鉤子中,角落 Logo 貫穿中間,結尾卡片 = Logo +
cta。
階段
| # | 階段 | 執行內容 | 門檻 |
|---|---|---|---|
| 1 | 腳本 + 錄製 | 研究主題(真實事實,附來源)。載入 <kit>/references/voice-script.md + <home>/profile/voice.md。使用上述鉤子優先的開場 + 結尾,禁止使用 "!",一個比喻(或逐步解說),12 段 = 12 個畫面(格式:references/example/SCRIPT.md)。拼出以字母唸出的名稱("R-E-A")。關於 AI "做不到" 的主張必須基於當今模型。不要使用術語數字(使用頁數而非 tokens;四捨五入的計數)。撰寫 <film>/SCRIPT.md,將這些段落以純文字形式交給使用者(無程式碼區塊,最後一段後面不要有任何內容 - 他們會將整個訊息貼到 ElevenLabs;錄音提示在之前的訊息中提供),等待 MP3 檔案;使用 ffprobe 檢查其長度 | 取得錄音,記錄長度 |
| 2 | 腳手架 + 時間軸 | node <skill>/scripts/new-talking-explainer.mjs <film> --name <slug> --mp3 <take.mp3>;<py> <kit>/scripts/transcribe.py assets/audio/vo.mp3 src/timing --lang <code> --prompt "<names, jargon>";<py> <kit>/scripts/words.py src/timing/vo-words.json(提示表) | 轉錄稿與腳本相符 |
| 3 | 分鏡表 | 使用全域時間(如下所示)撰寫 STORYBOARD.src.md,格式參考 references/example/STORYBOARD.md:每個段落一個畫面,在句子停頓處剪輯(總和 = 語音結束 + 2.8 秒),標頭每行一個欄位(- start: / - duration: / - src:),每個區塊標記其提示詞上的 ZOOM 和 EMPH 節奏,顏色 = 意義,真實事實 + 虛構額外內容,共享主要物體的兩個場景之間有過渡姿勢。<py> src/storyboard-local.py -> STORYBOARD.md。向使用者展示畫面列表(每個畫面一行) | 他們說「可以」 |
| 4 | 合約 + 主持人 + 音訊 | 編輯並執行 src/set-film.py(場景 + 語音長度)。編輯並執行 src/set-presenter.py(姿勢在提示詞前約 0.1 秒;思考/走路沒有嘴型 - 絕不在語音說話時)。背景音樂:<py> <engine>/scripts/bgm-cut.py assets/audio/bed.mp3 assets/audio/bgm-edit.wav --len <total> --a 0 <total+3> --fade-out 2.6(比背景音樂長的影片會重複主體:--a 0 <len> --b <bar> <len> --b ... --xfade 0.3)-> <py> <kit>/scripts/master-audio.py --len <total> -> <py> <engine>/scripts/build-presenter.py(印出「lip sync: N poses」)-> <py> <kit>/scripts/build-brand.py(印出角落 Logo 視窗)。使用一個 <engine>/scripts/patch_exact.py 腳本重寫 frame.md 的每個 [FILM] 部分。編輯並執行 src/set-cues.py。<py> <engine>/scripts/make-harness.py;<py> <skill>/scripts/make-packets.py;node <engine>/scripts/test-scene.mjs m-presenter "<5 times>" | 主持人表:語音時嘴巴張開,提示詞時做出姿勢 |
| 5 | 場景 | references/workers.md:6 個 Sonnet 工作者 x 2 個場景,最多同時 4 個(修正輪次視為一次),其提示模板(區域法則包含推進峰值、0.12 限制、僅 Solar、Apple 規範、不得發明數字)。自己審查中間場景;修正輪次發送給同一個工作者 | 每個表都與其區塊相符,在表級別可讀 |
| 6 | 交付 | <py> <engine>/scripts/fromto-scan.py compositions/s*.html(0)-> <py> <engine>/scripts/assemble.py -> npx hyperframes@<film.json hyperframes> lint . + check . -> <py> <engine>/scripts/seam-check.py + node <kit>/scripts/seam-diff-all.mjs -> node <engine>/scripts/render-final.mjs <slug>-1080p60(背景執行;結束時會有閃光掃描)-> 將 RENDER 轉錄到 .hyperframes/work/sync + <py> <kit>/scripts/sync-check.py src/timing/vo-words.json .hyperframes/work/sync/vo-words.json -> <py> <skill>/scripts/frames.py renders/<slug>-1080p60.mp4 frames.jpg --at <one per scene> 和 --zone --at <every ZOOM peak> -> node <engine>/scripts/encode-web.mjs renders/<slug>-1080p60.mp4 renders/web --name <slug> --poster <t> -> 移交路徑 + Solar 版權行 | lint/check 0 錯誤,seams 0.00%(在主持人框之外),0 閃光,sync 中位數 ~0.000s,任何峰值處都沒有紅色線殘留 |
以全域秒為單位一次性撰寫時間
手動將 20 個場景的單詞時間轉換為場景本地時間是錯誤的根源。在 STORYBOARD.src.md 中,為每個畫面提供 - start: <global>,並將提示詞標記為 "word"@g<global>;ZOOM 範圍和「exit by」時間可以使用純粹的全域數字。<py> src/storyboard-local.py 會寫出 STORYBOARD.md,其中每個時間都是本地時間,檢查起始時間是否連續,以及每個提示詞是否適合其場景,並列印 set-film.py 所需的場景列表。音效(src/set-cues.py)和主持人(src/set-presenter.py)也以全域秒為單位撰寫。
建置後替換錄音 / 語言 / 開場白(調整時間,永不重建)
新的錄音 -> 備份 compositions/、film.json、STORYBOARD.md、src/ 到 .hyperframes/work/<old>/,將舊渲染移到 renders/<old>/ -> 將錄音複製到 assets/audio/vo.mp3 -> 轉錄 -> 在 set-film.py 中設定新的剪輯 -> 主持人姿勢、背景音樂、主音訊、build-presenter、build-brand、set-cues、make-harness -> 撰寫 RETIME.md(每個場景:每個節拍 -> 其在本地時間的新提示詞;包含新內容的場景需有完整區塊;格式 references/example/RETIME.md;「此檔案優先於 STORYBOARD.md 時間」)-> 修補 frame.md 的持續時間 / Logo 視窗 / 無縫接合 -> 向每個同一個工作者發送其 RETIME 部分(一次 4 個)。較快的錄音會使場景變短:告訴工作者在放棄節拍之前先縮短彈簧。
直式 / TikTok / Reels / Shorts 剪輯(移植,永不重建)
<py> <skill>/scripts/port-portrait.py <film> <film>-9x16- 一個新資料夾(原始的 16:9 影片保持不變):複製來源 + 音訊,將已交付的場景移動到references/src-16x9/(工作者的規格),撰寫直式合約(frame.md 中針對 TikTok UI 的區域、工作者簡報、1080x1920 入門、set-film 大小),將主持人移至左下角(縮放 x0.9,腳部 y 1640)。- 從新根目錄:
<py> src/set-film.py->build-presenter.py->build-brand.py(垂直 Logo = 頂部中央,y 150,位於平台標籤下方)->make-harness.py->test-scene.mjs m-presenter(主持人 x ~26-556,y ~1074-1640)。 - 工作者:相同的配對,提示 = "PORT"(從 16:9 來源開始,保留複製/節拍/提示詞/顏色/圖示/無縫姿勢,僅重新編寫佈局和攝影機)+ 直式區域法則:標題 y 260-500,舞台 x 60-1020 / y 520-1060(文字在 y 680 以下 x <= 920),右下角 x 580-920 / y 1080-1520,主持人 x 20-560 / y 1060-1660,y 250 以上或 y 1540 以下不得有任何東西。複製其他配對物體的配對最後執行。
- 如同階段 6 進行交付,使用
render-final.mjs <slug>-1080x1920p60;frames.py --zone會偵測直式並繪製主持人框 + 平台 UI 線條。1080p60 主檔按原樣上傳到 TikTok。 首次通過的遺漏:主要物體被擠壓到右下角(讓節拍成為舞台中的主要元素,改為縮小顯示字體);一個兩行標題與一個在推進中升起的堆疊物碰撞(在峰值處保持 >= 40px 間距);一個次要卡片被推進拖到 y 1540 以下(在該次推進期間使其後退/變暗)。
真實應用程式 + 真實 Logo
關於使用者自己設定的影片會顯示真實的應用程式:Logo 來自來源,應用程式顏色來自應用程式自己的 CSS(scripts/app-tokens.py),使用者真實的資料夾名稱和數字,在任何工作者開始前的隱私清單。配方:references/real-apps.md。frame.md 使用 "no third-" 規則(參考 references/workers.md)。每次更新應用程式時執行 scripts/app-sync.sh。
你自己的說話角色
取代內建角色:
- 在 Phase 0 之前:從
<skill>/references/custom-character.md運行 create-character.sh。需要三個提示詞(角色、姿勢、表情)和一個名稱。角色被加入到<home>/profile/。角色的 PSD 檔案包含其圖層和嘴型狀態。 - 角色動畫:/references/custom-character.md 描述了如何為角色添加自定義動畫。
關於此技能
此技能旨在讓使用者能夠輕鬆創建高品質的解說影片,而無需專業的動畫或影片編輯技能。它將複雜的腳本、旁白錄製、動畫生成和品牌整合自動化。結果是一個看起來很專業的影片,可以發佈到社交媒體、網站或用作行銷材料。