Master class render
入力: <source>/scripts/NN - Title.script.md(master-class によって作成)
あなたが作成: <source>/scenes/NN.scenes.md(D2テキスト、座標・タイミングなし)
1つのコマンドで生成: <videos>/NN - Title.mp4 + <notes>/NN - Title.md + <notes>/<MOC>.md
すべてローカルで実行: D2が図をレイアウト(スケッチスタイル)、Kokoro-82Mが音声を合成、タイミングは実際の音声から取得、Chromiumがビジュアル変更のたびに1フレームをキャプチャ、ffmpegがエンコード。外部サービスには一切送信されません。消費されるトークンはシーンファイルのみ(スクリプトサイズの約1倍)。
0 · セットアップ(マシンごとに1回; 再実行しても安全)
bash ~/.copilot/skills/master-class-render/scripts/setup.sh
d2、ffmpeg、uv(Homebrew)、scripts/.venv内のvenv(kokoro-onnx、soundfile、playwright(Chromium))、および~/.cache/kokoro内のKokoroモデル(約350MB)をインストールします。scripts/.venv/bin/pythonが存在すればセットアップは完了です。
1 · シーンを書く
最初にreferences/scenes-guide.mdと承認済みの例をお読みください: 01、05、08。各例は~/.copilot/skills/master-class/examples/内のスクリプトとペアになっているので、各Screenがどのように図になったかを正確に確認できます。この手順は小さく高速なモデルでも問題なく動作します: 一度に1レッスンずつ進め、バリデータが正しいと教えてくれるのを待ちます。次に、各スクリプトについて、ビートごとに## Beat N + 1つの```d2ブロックを書き、そのビートのScreen説明を翻訳します:
# @at "frase"(そのビートのナレーションから3~7単語をそのままコピー)は、ナレーターがそのフレーズを発したときに次が明らかになることを示します。最終レイアウトは一度だけ計算されるため、何もジャンプしません; 新しい部品は一瞬光ります。# @continueは前のビートの図を拡張します。- クラス:
model、code、tool、data、person、bad、good、note(結論付きの付箋; これらがレッスンノートのキーアイデアになります)、muted、wrong。 - ガイドにはD2の注意点が記載されています(
\$、{}ブロック内では@at不可、|||mdテーブル、スタイル変更はアニメーションしない)。
各レッスンを作成しながら検証します(ok: と表示され、warning: がないことを確認):
cd ~/.copilot/skills/master-class-render/scripts && export PATH=/opt/homebrew/bin:$PATH
.venv/bin/python render.py "<source>/scripts/NN - Title.script.md" "<source>/scenes/NN.scenes.md" /tmp/check.html
多くのレッスンがある場合 → 並列サブエージェント(各約4レッスン)に分割し、ガイドと例を渡します。
2 · コースをビルドする
cd ~/.copilot/skills/master-class-render/scripts && export PATH=/opt/homebrew/bin:$PATH
.venv/bin/python build_course.py \
--source "<lab>/_attachments/master-class/source" \
--videos "<lab>/_attachments/master-class" \
--notes "<lab>/Master class" \
--moc "<Lab name> · Master class" \
--course "<label shown top-left in the video>" \
--tags "course/<course-tag>,section/labs,topic/<x>,type/lesson" \
--intro "MOC用の1パラグラフ: コースが何から構築されているか([[ソースノートリンク]])とその意図。" \
--voice am_michael --lang en-us
- 言語/音声: 英語
--voice am_michael --lang en-us(代替am_puck、bm_george --lang en-gb); スペイン語--voice em_alex --lang es(女性:ef_dora)。 --only 03,07で選択したレッスンのみ再ビルド(ノートは常にすべて再生成されます)。--notes-onlyは動画なしでノートを再生成します。- 音声がキャッシュされた後はレッスンあたり約15秒(初回合成はレッスンあたり約1分)。出力は一時フォルダでエンコードされ、その後コピーされます(OneDrive同期フォルダに直接書き込むとタイムアウトするため)。
--tagsをソースノートで使用されているタグに一致させます。
3 · 報告前に検証する
- ビルドがすべてのレッスンで
ok:を出力し、!! … @at phrase(s) not foundがないこと。 - 1つまたは2つのMP4から2フレームを抽出して確認します(毎回新しいファイル名を使用; 画像ビューアはキャッシュします):
ffmpeg -v error -ss 120 -i "<mp4>" -frames:v 1 -vf scale=1280:-1 /tmp/mc_check_<n>.png確認: 図が判読可能であること(小さな帯になっていない)、キャプションが一致していること、正しいビートが表示されていること。 - 図が小さすぎる? レンダラーは自動的に他のレイアウト方向も試しますが、それでも小さい場合は、ビートの図を分割するか、
@continueをやめて以前の手順を1つのmutedボックスにまとめます。 - MOCノートと1つのレッスンノートを開く: 動画埋め込み
![[NN - Title.mp4]]、ゴール、キーアイデア、セルフチェック(質問 + 折りたたまれた回答)、折りたたまれた文字起こし、前へ/次へのリンク。
各レッスンノートの内容(自動生成、トークン消費なし)
フロントマター(タグ、レッスン、時間、コースリンク)・埋め込みMP4・ゴール・誤解・キーアイデア(note 付箋から)・セルフチェック(Retrieval pause ビートから)・折りたたまれた文字起こし・← 前へ・コースインデックス・次へ →。
ファイル
scripts/: build_course.py(エントリポイント)・render.py(スクリプト+シーン→オーディオとタイムライン付き中間HTML)・export_mp4.py(HTML→MP4)・make_notes.py(ノート+MOC)・player.html(中間テンプレート; オフラインプレーヤーとしても使用可能)・prelude.d2(クラス、フォントサイズ)・setup.sh。キャッシュ: scripts/.cache/(音声クリップ、図; 削除可能)。