Communitygithub.com

chalkreel — 目的からアクセシブルな解説動画へ

学習目標を、コードで描画された解説動画に変換します。ナレーション、ワード単位の字幕、トランスクリプト、音声ガイド記述、引用元の証跡、そしてマルチメディア学習理論に基づく品質チェックを備えています。4つの人間による承認ゲートがあります。生成系動画モデルやストック映像は使いません。eラーニング開発者やインストラクショナルデザイナーが「トピック」ではなく「目標」から始まる教育動画を作りたい時に使用します。

chalkreel — 目的からアクセシブルな解説動画へ とは?

chalkreelは、学習目標(ABCD形式の測定可能な一文)を入力として、アクセシブルな解説動画を生成するAIエージェントスキルです。このスキルは、従来の「動画生成」とは異なり、動画フレームをコード(Remotionコンポーネント、SVG、CSS)で描画するため、すべてのフレームがレビュー可能で、差分確認ができ、再現性があります。また、マルチメディア学習理論(Mayerの原理)に基づいて認知的負荷を管理し、キャプション、トランスクリプト、音声ガイド記述といったアクセシビリティ成果物を第一級の出力として提供します。各ナレーション内の事実は出典に遡れるように証跡が管理され、4つの人間による承認ゲート(目的+ビートマップ、ナレーション台本、ビジュアルスタイル、最終カット)を通過しなければリリースされません。主にClaude CodeやCursorなどのAIエージェント向けに設計されており、eラーニング開発者やインストラクショナルデザイナーが「トピック」ではなく「学習目標」から始まる教育動画を効率的に制作するのに役立ちます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/iwyusdaz/chalkreel/tree/main/skill

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

chalkreel — 目的からアクセシブルな解説動画へ は何をしますか?

あなたは学習用解説動画を制作しています。エンゲージメント最適化されたAI解説動画とは異なり、学習動画は測定可能な目的から始まり、意図的に認知的負荷を管理し(Mayerのマルチメディア原理)、アクセシビリティ成果物(キャプション、トランスクリプト、音声ガイド記述)を後付けではなく第一級の出力として提供します。ナレーション内のすべての事実は出典に遡れます。

視聴者が聞くものはすべて、見えるか読めるものでなければなりません。学習者に伝えることはすべて、トレース可能でなければなりません。人間の承認なしに出荷されるものはありません。

厳格なルール

  1. 生成系動画モデルは禁止。ストック映像も禁止。シーン内容のための画像生成も禁止。 フレームはコード(Remotionコンポーネント、SVG、CSS)で描画されます。これにより、すべてのフレームがレビュー可能、差分確認可能、再現可能になります。
  2. 4つの人間による承認ゲート。 ゲートを通過する前に、プロジェクトログに明示的な承認を記録してください:ゲート1 目的+ビートマップ、ゲート2 ナレーション台本、ゲート3 ビジュアルスタイル、ゲート4 最終カット。
  3. すべてに合成物とラベル付け。 構築されたサンプルデータ、シミュレーションされたタイミング、エージェントレビューの結果は、ファイル自体にそのようにラベル付けします。ドライなアーティファクトを実際のレンダリング/TTS出力として提示しないでください。
  4. 台本よりも前に主張を。 ナレーションが書かれる前に、出典付きの主張を含む調査ノートが存在し、台本内の数字にはすべて元帳の行が存在しなければなりません。
  5. ローカル優先の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」)をラベル付けします。

スクリプトレベル(毎回実行)

  1. 目的との整合性 — すべてのセグメントが承認された目的を前進させること; そうでないものはカット(目標に対する一貫性の原則)
  2. 主張のトレーサビリティ — ナレーション内のすべての数字、日付、名前付きの調査結果には、出典付きの主張元帳の行があること。孤立した事実があれば不合格。
  3. ナレーションlint — lint-narration.mjs が終了コード0で終了すること
  4. 読解レベル — 文の平均ワード数が約17以下; 説明なしの専門用語がない; 抽象的な動詞よりも具体的な動詞を使用
  5. アクセシビリティバンドル — a11y-lint.mjs が終了コード0で終了; SRTとトランスクリプトが存在; すべてのセグメントにADノートが存在

フレームレベル(レンダリングフレームまたはセグメントごとのスクリーンショットに対して実行)

  1. シグナリング — その瞬間のキーワード/数字が、ナレーションされている間だけ視覚的に強調表示されている(チョーク下線、色、矢印)
  2. 一貫性 — 画面上に装飾的なものがない; すべての要素がナレーションされたアイデアに対応している; ユーザーが要求しない限り背景音楽なし
  3. 冗長性 — 画面上のテキストはナレーションを逐語複製しない; ラベルと短いフレーズであること
  4. 空間的近接 — ラベルは説明しているものの隣にある; フレーム内で凡例から図表への宝探しがない
  5. 時間的近接 — 要素の表示はそのナレーション行と同期している(timing.jsonと照合); 前後に表示しない
  6. 読みやすさ — チョーク線は背景とコントラストがある(画面上テキスト相当で4.5:1以上); 1920x1080または1280x720でクリップされていない
  7. 動きの予算 — アニメーションは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書き言葉チェックリストの概念。

関連スキル