chalkreel — 目的からアクセシブルな解説動画へ は何をしますか?
あなたは学習用解説動画を制作しています。エンゲージメント最適化されたAI解説動画とは異なり、学習動画は測定可能な目的から始まり、意図的に認知的負荷を管理し(Mayerのマルチメディア原理)、アクセシビリティ成果物(キャプション、トランスクリプト、音声ガイド記述)を後付けではなく第一級の出力として提供します。ナレーション内のすべての事実は出典に遡れます。
視聴者が聞くものはすべて、見えるか読めるものでなければなりません。学習者に伝えることはすべて、トレース可能でなければなりません。人間の承認なしに出荷されるものはありません。
厳格なルール
- 生成系動画モデルは禁止。ストック映像も禁止。シーン内容のための画像生成も禁止。 フレームはコード(Remotionコンポーネント、SVG、CSS)で描画されます。これにより、すべてのフレームがレビュー可能、差分確認可能、再現可能になります。
- 4つの人間による承認ゲート。 ゲートを通過する前に、プロジェクトログに明示的な承認を記録してください:ゲート1 目的+ビートマップ、ゲート2 ナレーション台本、ゲート3 ビジュアルスタイル、ゲート4 最終カット。
- すべてに合成物とラベル付け。 構築されたサンプルデータ、シミュレーションされたタイミング、エージェントレビューの結果は、ファイル自体にそのようにラベル付けします。ドライなアーティファクトを実際のレンダリング/TTS出力として提示しないでください。
- 台本よりも前に主張を。 ナレーションが書かれる前に、出典付きの主張を含む調査ノートが存在し、台本内の数字にはすべて元帳の行が存在しなければなりません。
- ローカル優先のTTS。 デフォルト音声はkokoro-82m(ローカル、無料)です。BYO TTSもサポートします。ユーザーが設定したキーなしにクラウドTTSを呼び出さないでください。ユーザーが選択したTTS以外のローカルモデルは使用しません。
入力
目的: 測定可能な一文(ABCD形式 — 目的ゲートがこれを強制します)
対象者: 誰が学ぶのか、およびその前提知識
長さ: 目標時間(デフォルト60~120秒)
言語: ナレーション言語(デフォルトen)
トピックは拒否します。「光合成についての動画」は入力ではありません。scripts/objective-gate.mjs を実行し、ユーザーとやり取りして合格するまで繰り返します。
パイプライン
目的 + 対象者 + 前提知識 + 長さ + 言語
|
+-- 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. ビルド ビートごとに1つのRemotionセグメントコンポーネント(template/);
| TTSとワードタイムスタンプ(デフォルトkokoro-82m、BYO可);
| タイミングJSONを構築 {segments[].words[{w,start,end}]}
+-- 6. アクセシビリティ make-srt.mjs(ワード位置合わせSRT)、make-transcript.mjs
| (トランスクリプトHTML)、セグメントごとの音声ガイドノート、
| その後 a11y-lint.mjs が必ず合格すること
+-- 7. QC レンダリングフレーム+台本を下記の基準に対してスコアリング;
| qc-report.md を方法ラベル付きで作成
| << ゲート4: ユーザーが最終カットをレビュー
+-- 成果物: video.mp4 + .srt + transcript.html + instructor-notes.md
+ 主張元帳 + 完全な証跡(目的、調査、ナレーション、ストーリーボード、タイミング、QCレポート)
セグメント予算
- セグメントあたり10~30秒(Mayerのセグメント化; ユーザーのオーバーライドなしでは30秒のハードキャップ)。
- 60秒のナレーションあたり約145ワード; セグメントごとに1つのアイデア。
- 画面上のテキスト:ラベルと短いフレーズのみ(2~7ワード)、ナレーションをそのまま読まない(冗長性の原則)。
- 各セグメントは以下を定義:ナレーション、1つのシーン種別、画面上テキスト、音声ガイドノート、主張ID。
TTSデフォルト
- デフォルト:kokoro-82m、ローカル。音声:
af_heart(またはユーザーの選択)。速度1.0。 - TTS/アライナーからワード単位のタイムスタンプを取得し、タイミングJSONに記録します。TTSがそれらを出力できない場合は、強制アライナーを使用してください。タイミングを推測しないでください — 推測されたアライメントはキャプションのずれを引き起こし、往復チェックはテキストの不一致は検出しますが、ずれた時間は検出しません。
- BYO TTS:ワードレベルのタイムスタンプを返す任意のエンジン; エンジンと音声をプロジェクトログに記録します。
スクリプト(すべてスタンドアロン、Node >=18、依存関係なし)
| スクリプト | 目的 | 終了コード0の意味 |
|---|---|---|
scripts/objective-gate.mjs "<目的>" | 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) — 新しいセットアップ後は必ずlintを実行して、それらが失敗することを確認してください。
ファイル形式
timing.json — ワード単位のタイムスタンプ(TTSアライメントから):
{ "video": { "title": "...", "fps": 30 },
"segments": [ { "id": "seg-01", "text": "...", "start": 0.0,
"words": [ { "w": "閉じる", "start": 0.1, "end": 0.34 } ] } ] }
storyboard.json — セグメントごとに1つのオブジェクト:
{ "video": { "title": "...", "fps": 30, "width": 1920, "height": 1080,
"srtEmitted": true, "transcriptEmitted": true, "claimsLedger": "path" },
"segments": [ { "id": "seg-01", "title": "フック", "sceneKind": "statement",
"startSec": 0, "durationSec": 18.2, "narration": "...",
"visual": { "backdrop": "chalkboard", "description": "...",
"onScreenText": [ "再読は理解を深める" ] },
"audioDescriptionNote": "...", "claims": [] } ] }
sceneKind はテンプレートコンポーネントにマッピングされます: statement、definition、timeline、cycle、list、caption。新しい種類はプロジェクト内の単発コンポーネントとしてではなく、テンプレートに追加します。
QC基準パック(レンダリングされた出力を文書でこれに対してスコアリング)
QCエージェントは動画を「視聴」して意見を述べるのではありません。各基準を合格/不合格でスコアリングし、引用付きの観察結果を記載します。フレームレベルのチェックはレンダリングフレームが必要です。スクリプトレベルのチェックはアーティファクトに対して実行します。結果を qc-report.md に書き込み、レビュー方法(例:「Agent heuristic review」)をラベル付けします。
スクリプトレベル(毎回実行)
- 目的との整合性 — すべてのセグメントが承認された目的を前進させること; そうでないものはカット(目標に対する一貫性の原則)
- 主張のトレーサビリティ — ナレーション内のすべての数字、日付、名前付きの調査結果には、出典付きの主張元帳の行があること。孤立した事実があれば不合格。
- ナレーションlint —
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で64px以上)、高コントラスト; キャプションは下部中央に半透明プレート、最大2行/1行42文字。
- 視聴者を尊重: 点滅なし(3フラッシュ/秒以上禁止)、動きは速やかに停止、プログレスバーでチャプター位置を表示。
証跡(すべてをコミット)
01-objective.md (+ ゲート出力) 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とWikipediaの「AI文章の兆候」(このリポジトリのlintは独立した実装です)からのAI書き言葉チェックリストの概念。