Communitygithub.com

mairp/video-to-deck

動画をMarpスライドデッキ(PPTX/PDF/HTML)に変換します。ローカルのWhisper + OCR + オプションのVLMキャプションでエビデンスバンドルを構築し、動画ごとに新しいエージェントがデッキを作成します。構造的なコンテンツはMermaid図に変換。プラグイン可能なエージェント、CUDA加速、CPUでも実行可能。

video-to-deck とは?

このスキルは、動画(スクリーンキャスト、講義、スライド録画など)から高品質なプレゼンテーションデッキを自動生成するためのツールです。ローカルで動作するWhisper(文字起こし)とTesseract(OCR)を使用して動画の内容をテキストの「エビデンスバンドル」に変換し、AIエージェント(Claude Code、Cursorなど)がそのエビデンスを読み込んでMarpマークダウン形式のスライドデッキを作成します。オプションでVLM(ビジョン言語モデル)を使い、図表やUIレイアウトなどの視覚情報をキャプションとして追加できます。出力はMarpマークダウン(`deck.md`)で、これを`render.sh`でPPTX/PDF/HTMLにエクスポート可能。CUDA GPUで高速処理でき、CPUでも動作。バッチ処理とネストされたフォルダ構造をサポートし、大規模なコースツリーも効率的に処理できます。このスキルの特徴は、AIエージェントが「テキストのみ」で動作する設計で、スクリプトが動画の「見る」と「聞く」を担当し、エージェントはエビデンスの「統合」に集中できる点にあります。

対応~Claude Code✓Codex CLI~Cursor
npx skills add mairp/video-to-deck

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

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

プレビュー

スキル README より

video-to-deck preview

ドキュメント

video-to-deck は何をしますか?

動画からプレゼンテーションを作成します。あなた(モデル)はテキストのみ — 音声を聞いたりフレームを見たりできません。 そのため、このスキルのスクリプトが「見る」と「聞く」を担当し、テキストのエビデンスバンドル(evidence.md)をあなたに渡します。 あなたの仕事は統合のみです:エビデンスを読み、良いデッキを書くこと。エビデンスが裏付けていないものを創作してはいけません。

出力はMarpマークダウン(deck.md)です:今すぐ読める通常の.mdであり、後でrender.shコマンド1つで本物のスライドデッキ(PPTX/PDF/HTML)になります。

$SKILL 以下 = このスキルのディレクトリ(このファイルを含むフォルダ)。

手順

1. 一度だけのセットアップ(冪等)

bash "$SKILL/scripts/setup.sh"

faster-whisper(文字起こし)、tesseract(OCR)、およびnpmが存在する場合はmarp-cliとmermaid-cliをインストールします。再実行しても安全です。ffmpegは事前にインストールされている必要があります。

2. 動画を探す

bash "$SKILL/scripts/find_videos.sh" "<folder>"        # 1行に1つのパス、再帰的

単一の名前付きファイルの場合は、これをスキップしてパスを直接使用します。

3. 各動画のエビデンスバンドルを構築する(一度に1つ)

bash "$SKILL/scripts/process_video.sh" "<video>" "<out_dir>/<video-stem>"

これにより、音声を抽出→文字起こし、キーフレームをサンプリング→画面上のテキストをOCRし、 <out_dir>/<video-stem>/evidence.md(およびtranscript.txt、segments.tsv、frames/、 ocr.txt)を書き出します。CPUで長い動画は遅くなります。品質のためにWHISPER_MODEL=smallを設定するか、 CUDA GPUを使用して高速化します(自動検出、scripts/transcribe.pyのWHISPER_DEVICEを参照)。 動画は並列ではなく逐次的に処理します。

オプションのビジョンパス(Qwen-VL)。 OCRはテキストのみを読み取ります。テキストでは捉えられないもの( グラフとそのトレンド、図、UIレイアウト、話者のジェスチャー)もキャプチャするには、保存された各キーフレームに キャプションを付けるビジョンモデルを有効にします。デフォルトではオフです。同じコマンドの環境変数で VISION_MODEL(および必要に応じてVISION_ENDPOINT)を設定してオンにします:

VISION_MODEL=qwen2.5-vl \
VISION_ENDPOINT=http://127.0.0.1:8081/v1/chat/completions \
  bash "$SKILL/scripts/process_video.sh" "<video>" "<out_dir>/<video-stem>"

オンにすると、evidence.mdにOCRとともに**「## 視覚的な説明」**セクションが追加されます — グラフ/図のスライドに使用します。OpenAI互換のビジョンエンドポイントであれば何でも動作します (llama-swap / llama.cpp / Ollamaなどのローカルサーバー、またはホスト型API、トークンが必要な場合はVISION_API_KEY)。 エンドポイントに到達できない場合も、OCRのみで実行は続行されます — 何も壊れません。

4. デッキを書く

evidence.md全体を読んでください。"$SKILL/templates/deck.marp.md" を <out_dir>/<video-stem>/deck.md にコピーし、埋めてください。ルール:

  • marp: true フロントマターを維持 — これがスライドデッキにするものです。
  • 話された内容には文字起こしを使用;正確なラベル、数字、タイトル、スライドに表示されたコードにはOCR/画面上のテキストを使用; **「視覚的な説明」**セクションが存在する場合(ビジョンパスが有効だった場合)、OCRでは伝えられない グラフ/図/UIに使用します。
  • 主張には必要に応じてタイムスタンプを付けます:[00:04:12]。
  • スライドのキーフレームをスライドに配置 — これはオプションの飾りではなく、デフォルトです。 ocr.txt 内の ### [timespan] frames/kf_####.jpg ブロックは、そのスライドの代表フレームを指定しています。 それをデッキスライドに反映させます:![](frames/kf_0007.jpg)。キーフレームはスライドのエビデンスであり、 箇条書きでは説明できない図/チャート/UIを示し、デッキが元のプレゼンテーションを反映するようにします。 スライドがMermaidで書き直した純粋な図のスライドである場合、またはフレームに視覚的な信号がない場合 (話しているだけのヘッド、空白のトランジション)にのみ省略します。1つの元スライドから2つのデッキスライドが 生じる場合は、同じスライドの2つの異なるフレームを使用し、同じフレームを繰り返さないでください。
  • エビデンスが裏付けているものだけを含めます。文字起こしとOCRが両方とも空の場合は、デッキを 創作するのではなく、動画に抽出可能なコンテンツがなかったと述べてください。

密度 — デッキはエビデンスを統合する必要があり、要約して消してはいけません。 最もよくある失敗は薄っぺらいデッキです:4語の箇条書きが20スライドで、動画に実際に含まれていた ほとんどの内容を捨ててしまいます。エビデンスバンドルの構築はコストがかかります。デッキは人々が読むものです。

  • 元のスライドごとに1つのデッキスライド。 OCRセクションの各 ### [timespan] frames/… ブロックは 動画の1つの実際のスライドです — そのリストがあなたのチェックリストであり、おおよそのスライド数です。 3つの元スライドを1つの箇条書きに統合しないでください。40分のトークは通常30~45スライドです。
  • 具体性をスライドに載せてください。 エビデンスに存在するすべての数字、指標、しきい値、パーセンテージ、 製品名、CRD、設定キー、ラベルはスライド自体に含めるべきです。元のスライドに6つの箇条書きと4つの統計が あった場合、あなたのスライドには6つの箇条書きと4つの統計があるべきです — 「精度が向上しました」ではありません。
  • 箇条書きは完全な行(約15~20語)であり、4語ではありません。 1スライドあたり5~8個が標準です。 簡潔であることは、元のスライドが簡潔だった場合にのみ正しいです。
  • 元のスライドが表形式の場合はテーブルを使用 — ルーティングマトリックス、ベンチマークグリッド、 レベルの定義、優先順位ルールなど。サンプルではなく、すべての行と列を再現してください。
  • スピーカーノートは付加的であり、スライドにはないが言われたこと(注意点、実体験、「なぜ」、 Q&Aの詳細)に使用します。スライドに属する内容を隠す場所ではありません。
  • 終了前にカバレッジチェックを行ってください。 ocr.txt の ### [..] ブロックを順番にたどり、 それぞれが表現されていることを確認してください。ブロックをスキップした場合、それは前のスライドの 重複/アニメーションか、デモフレームのいずれかです — どちらであるかを言えるようにしてください。

5. 図のパス(「これは図にできるか?」のチェック)

各トピックについて、次のように問いかけてください:これは構造的か(コンポーネント+接続、アクター間の 相互作用、プロセス/フロー、状態+遷移、エンティティ+関係)? はいの場合、箇条書きの代わりに、 独自のスライドにMermaid(デフォルト)またはPlantUML図として描画してください。 "$SKILL/references/diagrams-cheatsheet.md" を参照して、コンテンツ→図の決定テーブルと コピペ用の骨格を確認してください。内容が単なるナラティブの場合は、図を強制しないでください。

6. (オプション)実際のスライドデッキをエクスポートする

bash "$SKILL/scripts/render.sh" "<out_dir>/<video-stem>/deck.md" pptx   # または pdf | html | all

これにより、図ブロックが画像にプリレンダリングされ、PPTX/PDFが生成されます。marp/mermaidが インストールされていない場合、デッキは単に.mdのままになります(それでも有効で表示可能です)。

ツリー全体を一度に処理するには、render.shをデッキごとに呼び出す代わりに、バッチドライバー(下記)に --pdfを追加してください。

バッチ / ネストされたフォルダ

フォルダ全体、特にネストされたコースツリーの場合、scripts/drive_decks.sh <root>を推奨します: これはbashでループし、動画ごとに新しいエージェントを生成して(モデルのコンテキストをあふれさせない)、 出力に元のサブフォルダをミラーリングするため、親→子の階層が保持されます。 scripts/rename_by_topic.sh <decks> はその後、各リーフをコースフォルダ内のトピックでスラッグ化します。 --pdf を追加すると、作成が完了したらすべてのデッキがPDFにエクスポートされます — Mermaidは画像にプリレンダリングされ、リーフフォルダは統合されるため、各PDFは親に配置されます (<out>/CourseA/lesson/deck.md → <out>/CourseA/lesson.pdf)、PDFごとのサブフォルダを回避します。 古い実行でフラットに生成されたデッキの階層を再構築するには、scripts/regroup_by_source.sh <decks> を使用します — 各 evidence.md の Source: 行を読み取り、各デッキをコースの親の下に配置します(重複は _duplicates/ に隔離)、 その後 rename を実行します。完全なバッチガイドについては README.md を参照してください。

参考資料

  • references/marp-cheatsheet.md — Marpスライドの構文(セパレーター、画像、ノート、カラム)。
  • references/diagrams-cheatsheet.md — いつ図を描画すべきか、および各タイプの構文。

注意事項

  • OCRはスクリーンキャスト/スライド動画の画面上のテキストをうまくキャプチャします。実写映像の場合、 文字起こしがほとんどの情報を提供します — それに依存し、視覚情報について過大に主張しないでください。
  • 文字起こし、OCR、レンダリングは常にローカルで行われます。オーサリングステップがマシンを離れるかどうかは、 --agent-cmd で指定するエージェントに完全に依存します。
  • 設計はモデルに依存しません:bashを実行でき、ファイルを読み取れる任意のテキストエージェントがこのスキルを 使用できます。

関連スキル