chalkreel — 目標輸入,無障礙解釋性影片輸出
您正在製作一部學習型解釋性影片。與追求觀看時長的 AI 解釋器不同,學習型影片從可衡量的目標開始,有目的地管理認知負荷(Mayer 的多媒體原則),並將無障礙交付成果——字幕、逐字稿、口述影像筆記——視為一級產出,而非事後補充。旁白中的每一項事實主張都可追溯至來源。
觀眾聽到的所有內容也必須是可見或可讀的。告知學習者的所有內容都必須是可追溯的。未經人類把關,任何內容都不能交付。
嚴格規則
- 不使用生成式影片模型。不使用庫存素材。場景內容不使用影像生成器。 影格以程式碼繪製(Remotion 元件、SVG、CSS)。這確保每個影格都可審查、可比較且可重現。
- 四道人工關卡。 未經明確批准並記錄在專案日誌中,絕不能越過任何關卡:關卡 1 目標 + 節拍圖、關卡 2 旁白腳本、關卡 3 視覺風格、關卡 4 最終剪輯。
- 標記所有合成內容。 建構的範例資料、模擬的時間點和 AI 審查結果必須在檔案本身中標記為如此。絕不能將乾燥的成品呈現為真實的渲染/TTS 輸出。
- 先有主張,後有腳本。 在撰寫旁白之前,必須先有包含來源的主張研究筆記;沒有分類帳列的數字不得進入腳本。
- 優先使用本地 TTS。 預設語音為 kokoro-82m(本地,免費)。支援自備 TTS;未經使用者設定金鑰,絕不能呼叫雲端 TTS。不使用使用者選擇的 TTS 以外的本地模型。
輸入
objective: 一個可衡量的句子(ABCD — 目標關卡強制執行此格式)
audience: 誰在學習,以及他們的假定先備知識
length: 目標時長(預設 60–120 秒)
language: 旁白語言(預設 en)
拒絕主題。「一支關於光合作用的影片」不是有效輸入;請執行 scripts/objective-gate.mjs 並與使用者反覆迭代,直到通過為止。
流程
objective + audience + prior knowledge + length + language
|
+-- 1. 目標關卡 objective-gate.mjs;將主題改寫為 ABCD 目標;
| 學習者可見的「您將能夠...」框架;
| 根據 Mayer 分段原則(10-30 秒節拍)分割的節拍圖
| << 關卡 1:使用者批准目標 + 節拍圖
+-- 2. 研究 提取主張、尋找來源、撰寫主張分類帳
| (claim-001 樣式 ID;附上標題/出版/年份的來源;
| 寧可使用模糊措辭,也不使用編造的統計數據)
+-- 3. 旁白 根據片段預算的腳本;經人性化檢查通過
| (scripts/lint-narration.mjs 必須回傳 0);
| 針對目標受眾進行閱讀水平檢查
| << 關卡 2:使用者批准腳本
+-- 4. 風格評比 使用範本以 2-3 種背景/主題變體渲染**相同**節拍;
| 使用者透過視覺選擇
| << 關卡 3:使用者選擇風格
+-- 5. 建置 每個節拍一個 Remotion 片段元件 (template/);
| 帶有逐字時間戳記的 TTS(預設 kokoro-82m,可自備);
| 建立時間 JSON {segments[].words[{w,start,end}]}
+-- 6. 無障礙功能 make-srt.mjs(字尾對齊 SRT)、make-transcript.mjs
| (逐字稿 HTML)、每個片段的
| 口述影像筆記,然後 a11y-lint.mjs **必須**通過
+-- 7. 品質控管 根據以下書面標準對渲染影格 + 腳本進行評分;
| 撰寫 qc-report.md 並標示方法
| << 關卡 4:使用者審查最終剪輯
+-- 交付:video.mp4 + .srt + transcript.html + instructor-notes.md
+ 主張分類帳 + 完整文件軌跡(目標、研究、旁白、
分鏡、時間、品質報告)
片段預算
- 每個片段 10–30 秒(Mayer 分段原則;未經使用者覆寫,硬上限為 30 秒)。
- 每 60 秒旁白約 145 個字;一個片段一個想法。
- 螢幕文字:僅限標籤和簡短短語(2–7 個字),切勿逐字重複旁白(冗餘原則)。
- 每個片段定義:旁白、一種場景類型、螢幕文字、口述影像筆記、主張 ID。
TTS 預設
- 預設:kokoro-82m,本地。語音:
af_heart(或使用者選擇)。速度 1.0。 - 從 TTS/對齊器捕獲逐字時間戳記至時間 JSON。如果 TTS 無法發出時間戳記,請使用強制對齊器進行對齊;絕不能猜測時間——猜測的對齊會導致字幕漂移,而往返檢查只會捕獲不匹配的文字,但無法捕獲漂移的時間。
- 自備 TTS:任何能回傳逐字時間戳記的引擎;在專案日誌中記錄引擎和語音。
腳本(皆為獨立執行,node >=18,無依賴項)
| 腳本 | 用途 | 回傳 0 表示 |
|---|---|---|
scripts/objective-gate.mjs "<objective>" | 驗證 ABCD 目標 | 目標是可衡量的 |
scripts/lint-narration.mjs <script.txt> | AI 寫作痕跡檢查器(TTS 前執行) | 腳本聽起來夠人性化,可以錄製 |
scripts/make-srt.mjs <timing.json> --out x.srt | 從時間 JSON 生成字尾對齊 SRT | SRT 已寫入 |
scripts/make-transcript.mjs --timing <timing.json> --storyboard <sb.json> --out t.html | 無障礙逐字稿頁面 | HTML 已寫入 |
scripts/a11y-lint.mjs <storyboard.json> | 「沒有僅透過音訊傳達的資訊」+ 交付成果檢查 | 每個旁白事實都在螢幕上或逐字稿/AD 筆記中 |
負向測試範例位於 examples/ 中(bad-narration.txt、bad-storyboard.json)——始終透過對這些範例執行檢查工具並確認它們失敗,來驗證新設定。
檔案格式
timing.json — 逐字時間戳記(來自 TTS 對齊):
{ "video": { "title": "...", "fps": 30 },
"segments": [ { "id": "seg-01", "text": "...", "start": 0.0,
"words": [ { "w": "Close", "start": 0.1, "end": 0.34 } ] } ] }
storyboard.json — 每個片段一個物件:
{ "video": { "title": "...", "fps": 30, "width": 1920, "height": 1080,
"srtEmitted": true, "transcriptEmitted": true, "claimsLedger": "path" },
"segments": [ { "id": "seg-01", "title": "Hook", "sceneKind": "statement",
"startSec": 0, "durationSec": 18.2, "narration": "...",
"visual": { "backdrop": "chalkboard", "description": "...",
"onScreenText": ["Recall beats rereading"] },
"audioDescriptionNote": "...", "claims": [] } ] }
sceneKind 對應到範本元件:statement、definition、timeline、cycle、list、caption。在範本中新增新的類型,而非在專案內部建立一次性元件。
QC 標準包(針對此標準對渲染輸出進行評分,以書面形式)
QC 代理人並非「觀看」影片並發表意見。它會為每個標準評定通過/失敗,並附上引用觀察結果。影格級別的檢查需要渲染的影格;腳本級別的檢查則針對成品進行。將結果寫入 qc-report.md,並標示審查方法(例如「AI 啟發式審查」)。
腳本級別(每次執行)
- 目標一致性 — 每個片段都推進已批准的目標;任何未推進的內容都應刪除(將連貫性原則應用於目標)。
- 主張可追溯性 — 旁白中的每個數字、日期或具名發現都有一行附有來源的主張分類帳。任何孤立事實都視為失敗。
- 旁白檢查 —
lint-narration.mjs回傳 0。 - 閱讀水平 — 句子平均少於約 17 個字;無未經說明的技術術語;使用具體動詞而非抽象概念。
- 無障礙套件 —
a11y-lint.mjs回傳 0;SRT 和逐字稿存在;每個片段都有 AD 筆記。
影格級別(根據每個片段的渲染影格或螢幕截圖執行)
- 信號提示 — 當下的關鍵術語/數字在旁白時被視覺化突顯(粉筆底線、顏色、箭頭)。
- 連貫性 — 螢幕上無裝飾性元素;每個元素都對應一個旁白想法;除非使用者要求,否則無背景音樂。
- 冗餘 — 螢幕文字不逐字重複旁白;應為標籤和簡短短語。
- 空間連續性 — 標籤與其描述的對象相鄰;影格內無需在圖例和圖表之間尋找。
- 時間連續性 — 元素的顯示與其旁白行同步(根據 timing.json 檢查),而非提前或延後顯示。
- 易讀性 — 粉筆線條與背景形成對比(螢幕文字替代方案 >= 4.5:1);在 1920x1080 或 1280x720 下無裁剪。
- 動態預算 — 動畫在 1.2 秒內穩定下來;在引入不同想法的句子期間,不應有任何移動。
每個標準評分為通過/失敗,並附上證據。1–5 的任何失敗都會阻擋關卡 4。6–12 的任何失敗都需要修復並重新渲染該片段,或獲得使用者的明確接受。
風格預設(關卡 3 評比)
- 背景:
chalkboard(深灰綠色,微妙紋理,柔和暗角)。評比替代方案:paper(暖米白色,墨水線條)、night(接近黑色,單一強調色)。 - 調色板:粉筆白主色,一個強調色(琥珀色 #FFC66D)用於突顯。僅突顯信號提示所需的內容。
- 字體:大(1080p 下 >= 64 px),高對比度;字幕置中底部,帶半透明底板,每行最多 2 行 / 42 個字符。
- 尊重觀眾:無閃爍(禁止 > 3 次閃爍/秒),動畫快速穩定,進度條顯示章節位置。
文件軌跡(全部提交)
01-objective.md (+ gate output) 05-timing.json
02-research-notes.md 06-subtitles.srt
03-narration.md 07-claims-ledger.md
04-storyboard.json 08-qc-report.md
文件軌跡與影片本身同等重要:它使流程可被其他教學設計師審計。
誠實的限制(在專案日誌中說明)
- 代理人 QC 是模型進行的啟發式審查,非專家背書。
- 不得聲稱輸出「經過教學驗證」——這需要此技能無法進行的學習者測試。
- 字尾對齊字幕的品質取決於 TTS 對齊;在關卡 4 之前,對 10 個提示進行抽樣檢查。
- 語音授權:kokoro-82m 語音有其自己的使用條款;在商業發布前請檢查。
歸屬
方法層面的啟發,無複製程式碼:anything2explainer(PolyForm Noncommercial — 僅方法,請參閱此儲存庫的 ATTRIBUTION.md),來自 vox-director(MIT)的關卡式批准流程模式,以及來自 blader/humanizer 和維基百科「AI 寫作的跡象」(此儲存庫的 lint 為獨立實作)的 AI 寫作痕跡檢查清單概念。
此翻譯以英文原文為準。