Communitygithub.com

brewed-ops/talking-explainer

將任何主題轉化為由會說話的卡通主持人旁白、嘴型同步、Apple 風格動畫的 16:9 解說影片,並支援品牌客製化與多平台輸出。

talking-explainer 是什麼?

這個技能(Talking Explainer)能將使用者提供的主題,自動生成一部 16:9(1920×1080,60fps)的動態設計解說影片。影片中會有一個卡通主持人,根據使用者自己的聲音進行真實的嘴型同步(六種嘴型),並在關鍵詞上做出姿勢、眨眼。螢幕上會顯示簡短、基礎的英文動態文字,整體視覺風格模仿 Apple 產品頁面:白色打光、Geist 字體、玻璃卡片、臨界阻尼彈簧動畫、Solar 圖示,以及藍色鏡片脊椎。每個場景都包含鏡頭推進和強調節奏。影片也會帶入使用者的品牌元素(開場 Logo、角落 Logo、結尾行動呼籲卡片)。 流程從鉤子優先的腳本開始(模仿使用者的說話風格),接著使用者錄製旁白,然後自動生成分鏡表,並透過並行場景工作者進行渲染。支援多種觸發詞,例如「talking explainer」、「talking mascot」、「lip sync explainer」等。此外,這個技能還涵蓋:從三個圖片提示創建使用者自己的卡通角色、替換已完成的影片的語音或語言(調整時間,不重建)、產出直式的 9:16 版本(適用於 TikTok、Reels、Short),以及針對真實應用程式和 Logo 的「運作方式」解說。此技能依賴於 `explainer-kit` 和 `spatial-film` 技能。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/brewed-ops/talking-explainer/tree/main/skills/talking-explainer

在你喜歡的 AI 中提問

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

說明文件

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 剪輯(移植,永不重建)

  1. <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)。
  2. 從新根目錄:<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)。
  3. 工作者:相同的配對,提示 = "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 以下不得有任何東西。複製其他配對物體的配對最後執行。
  4. 如同階段 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 描述了如何為角色添加自定義動畫。

關於此技能

此技能旨在讓使用者能夠輕鬆創建高品質的解說影片,而無需專業的動畫或影片編輯技能。它將複雜的腳本、旁白錄製、動畫生成和品牌整合自動化。結果是一個看起來很專業的影片,可以發佈到社交媒體、網站或用作行銷材料。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相關技能