mcpField
P
paper2video

paper2video

github.com/microsoftクリエイティブ・メディア3.4k47 回インストール5 週間前に更新
リポジトリ

paper2video について

paper2videoは、論文資料からスライドとナレーション付き動画を作るワークフロースキルです。研究者向けに、ppt-masterとpptx2videoへ制作を委譲し、アニメーションのトリガーを統一して厳格なメディアQAを実行します。

主な機能

  1. 01論文資料から共有パッケージを作成
  2. 02共通のアニメーショントリガーを決定
  3. 03ppt-masterにスライド制作を委譲
  4. 04pptx2videoに動画レンダリングを委譲
  5. 05厳格モードでメディアQAを実行

活用シーン

  1. 01論文をナレーション付き動画にする
  2. 02スライドと動画のトリガー設定を統一
  3. 03字幕付き・字幕なし動画を生成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/microsoft/researchstudio --skill paper2video

インストール後、Claude Code で/paper2videoを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
references/
ppt_trigger_handoff.md
pptx2video.md
script_json_schema.md
scripts/
ppt_options_contract.py
ppt_stage_validator.py

詳細

paper2video - 論文/アセット -> ppt-master デッキ -> pptx2video によるレンダリング -> ナレーション付き MP4

paper2video は、サポート対象の経路が厳密に 1 つだけの薄いオーケストレーターです。スライドの作成、音声の合成、動画の合成、QA のゲート処理は、それ自体では行いません。入力と共有する 1 つのトリガー判定を解決した後、すべてを委譲します。

paper.pdf
  -> skills/paper2assets/scripts/build_package.py       (shared package)
  -> assets/meta/paper_spec.md + assets/meta/narration.json
  -> ppt_options_contract.py resolve-ppt-trigger          (ONE trigger decision)
  -> installed ppt-master skill                          (full workflow, receives the trigger)
  -> installed pptx2video skill / CLI `bootstrap` then `render` (full workflow, receives the trigger)
  -> ppt_stage_validator.py audit-final-pptx-trigger      (proves the handoff held)
  -> video.mp4, video_no_subtitles.mp4, video.pptx

経路は 1 つだけです。 このスキルの以前のバージョンには、非公開のナレーション、長さ、ビジュアルキューのスクリプトを呼び出し、インストール済みの公開パッケージのインポート可能なサブモジュールであるかのように python -m pptx2video.render_video/pptx2video.build_timeline/pptx2video.check_video_package を実行する、独自実装の 2 つ目の「Route A」がありました。これらのモジュールは、公開されている pptx2video CLI のそのインポートパスには存在しません。エントリーポイントは pptx2video render、pptx2video doctor、pptx2video bootstrap のサブコマンドです。この近道を再現しないでください。ナレーションスクリプトやビジュアルキューファイルを手作業で組み立てたり、インストール済みの pptx2video スキルを省略する「簡易版」レンダリングパイプラインを作成したりしないでください。pptx2video.* 以下の非公開サブモジュールパスを呼び出さないでください。すべてのレンダリングは /pptx2video(インストール済みのスキル)またはステップ 5 の正確な pptx2video render CLI 呼び出しを経由します。急いでいる場合や、セッションのコンテキストが少ない場合に使える、手間の少ない代替手段はありません。

完全な委譲が必須である理由

pptx2video render はスモークテスト用のラッパーではありません。独自の CLI(cli.py の _render())は必ず QA パスを実行し、必ず assets/meta/reports/video_qa_report.json を書き出します。--no-qa フラグはなく、チェック自体を省略する方法もありません。内部モジュールを手動で呼び出すと、このゲートを完全に回避できてしまうため、すべてのレンダリングでステップ 5 のコマンドを使います。

厳格なゲートはオプトインであり、ステップ 5 ではオプトインします。 上流の pptx2video では、--qa-mode のデフォルトは warn-only です。ブロッキング警告があってもバンドルが生成されます。プレビューやデモには適切なデフォルトですが、Paper2Video の成果物には適していません。そのため、ステップ 5 では --qa-mode strict を明示的に指定します。レンダリングの失敗を解消するために、このフラグを削除しないでください。ブロッキング警告がある場合、そのデッキは納品できません。修正すべき箇所は ppt-master(ステップ 3)かナレーションであり、ゲートではありません。ゼロ以外の終了コードは、修正すべきブロッキングエラーとして扱ってください。モードを緩めたり、より簡易なローカルスクリプトに切り替えたりする理由にしてはいけません。

2 つの子スキル、共有する 1 つのトリガー判定

このスキル自体の役割は限定的です。入力を解決し、ppt_trigger の値を 1 つ解決して、その値を 2 つの子スキルの両方に同一の値として渡し、納品された PPTX に実際にその値が設定されていることを確認します。それ以外はすべて子スキルの担当です。

  • ppt-master はデッキを作成します。SVG ページ、ストラテジストによる確認ステージ、発表者ノート、およびネイティブの開始アニメーショントリガー(--animation-trigger)を含む PPTX のエクスポートを担当します。
  • pptx2video はデッキをレンダリングします。TTS、単語境界のタイミング、アニメーションのスケジューリング、字幕、タイムライン、および厳格なメディア QA(assets/meta/reports/video_qa_report.json)を担当します。

どちらも PowerPoint のネイティブな p:timing ツリーを読み取りますが、目的は異なります。ppt-master はこれを書き込み、pptx2video の動画スケジューラーは、クリックグループ番号ではなく、ネイティブな行順とナレーションのタイミングを読み取ります。この 2 つのスキルがそれぞれ独自のデフォルトトリガーを選ぶと、ネイティブバッジと再生ペースがひそかに食い違う PPTX/MP4 の組み合わせが生成される可能性があります。このスキルのステップ 2 は、まさにそれを防ぐためのものです。

旧プロトコルが混同していた 4 つの概念

単一のネイティブな p:timing ツリーは 4 つの異なる問いに答える必要がありますが、このスキルのプロトコルの以前のバージョンでは、それらすべてに答えようとして 1 つのフィールド(クリックグループ番号)しか使っていませんでした。これはデッキが after-previous を使用している場合に必ず失敗します。

概念意味存在する場所どのデフォルトが優先されるか
effect_order実際の登場アニメーションの順序、1..N、トリガータイプに依存しないネイティブのアニメーションウィンドウの行順(mainSeq 内の p:cTn の順序)オーサリング順で固定。クリックグループ番号から推測されることは決してない
ppt_triggerユーザーに見える唯一の意図: on-click または after-previousこのスキルの resolve-ppt-trigger コマンドによって一度だけ解決されるこのスキルであり、ppt-master 自身の CLI デフォルトでも pptx2video 自身の CLI デフォルトでもない
click_groupPowerPoint 自身が導出したクリックグループバッジ。アニメーションウィンドウ UI に表示されるPowerPoint/pptx2video の --click-group-policy がトリガートポロジーから計算副作用であり、真実の源となることは決してない
video_startレンダリングされた MP4 内でフェーズが再生されるタイミングpptx2video のナレーション/タイムラインスケジューラ。effect_order と単語境界タイミングをキーとするpptx2video のレンダラー。クリックグループ番号は参照されることは決してない

これが修正する失敗: 38 個の after-previous 効果を持つデッキは完全に有効な OOXML ですが、PowerPoint はすべての after-previous(自動)効果を同じネイティブのクリックグループに配置し、通常はアニメーションウィンドウのクリックグループ列にすべて 0 を表示します。これは自動効果に対する想定された PowerPoint の動作であり、データ損失でもレンダリングのバグでもありません。effect_order(ウィンドウの行順)は依然として存在し、まさに pptx2video のスケジューラがナレーション/単語タイミングとともに各フェーズを動画のタイムラインに配置するために使用するものです。旧プロトコルの問題は、ドキュメントと検証にあり、基盤となるレンダリングにはありませんでした。すなわち、オーサリングの前に意図的に ppt_trigger を選び、それを両方の子に同一に渡し、配信されたファイルを確認するようエージェントに指示するものが何もなかったのです。このスキルのステップ 2 とステップ 6 は、まさにそのギャップを埋めます。

パス

特記がない限り、Paper2Video のワークフローコマンドは ResearchStudio-Reel/ から実行してください。

PAPER2VIDEO=skills/paper2video
PAPER2ASSETS=skills/paper2assets

開始する前に両方の外部スキルをインストールしてください。ResearchStudio 内にどちらの依存関係もクローンしたりベンダー化したりしないでください。

npx skills add hugohe3/ppt-master --skill ppt-master
npx skills add ai-nuts/pptx2video --skill pptx2video

公開されている pptx2video CLI ランタイムをインストールして検証してください。Python 3.11 以降の環境を使用し、上流のデフォルトブランチを追跡してください。これは pptx2video 自身の SKILL.md がドキュメント化しているインストール形式です。

python -m pip install \
  'pptx2video[svg] @ git+https://github.com/ai-nuts/pptx2video.git'
python -m playwright install chromium
python3 -m pptx2video --version
python3 -m pptx2video doctor --svg

ランタイムは常に python3 -m pptx2video ... として呼び出し、裸の pptx2video コマンドとしては決して呼び出さないでください。 ホストには、意図したインストールよりも PATH の前方に古い pptx2video(たとえば 0.3.0)が存在する場合があります。その場合、裸のコマンドはエラーを出さずに黙って間違ったバージョンに解決されます。python3 -m pptx2video --version と pip show pptx2video を比較してください。それらが一致しない場合は、続行して CLI サーフェスがまだこのドキュメントと一致することを期待するのではなく、先に環境(pip install のターゲット、PATH、仮想環境)を修正してください。

上流のデフォルトブランチを追跡し、リリースタグを固定しないでください。 pptx2video はタグ間に機能を出荷するため、タグ固定はすべての paper2video ユーザーからそれらの機能を黙って伏せてしまいます。上流の修正を取り込むには、デフォルトブランチから再インストールしてください。

ホスト固有のスキルディレクトリをハードコードしないでください。ユーザーはこのリポジトリを Codex、Claude Code、シェル、または別のエージェントから実行する場合があります。このスキル自体は pptx2video.* 配下のプライベートパスを決して呼び出しません。常にインストールされたスキル(/pptx2video)または公開されている pptx2video render / pptx2video doctor / pptx2video bootstrap CLI サブコマンドを呼び出します。

出力契約

共通の paper2assets v2 レイアウトに従います。バンドルのトップレベルには成果物ファイルと manifest.json だけを置き、それ以外はすべて assets/ の下に置きます。

<video_outdir>/
  video.mp4                  # required, burned-in subtitles in an appended black bottom band
  video_no_subtitles.mp4     # required, raw/pre-subtitle playback copy for paper2reel
  video.pptx                 # required, the same delivered deck pptx2video rendered from
  manifest.json              # schema_version "paper2video.v1", layout "v2-assets"
  assets/
    audio/                          # script.json, per-block TTS, word timings
    captions/                       # video.srt, video.vtt
    slides/                         # rendered slide frames used by the MP4
    clips/                          # raw render intermediate
    meta/                           # timeline.json, QA and authority reports

このレイアウトとその中のすべてのファイルは、pptx2video render 自体が生成します。このスキルが <video_outdir> に書き込むのは、以下のステップ 5 のみです。このステップより前に、ツリーの一部を手作業で作成しないでください。

ファイルを書き込む前に <video_outdir> を決定します。 次の順序で決定します。

  1. 呼び出し元が <video_outdir> 引数を明示した場合は、その指定を優先します。 指定された値をそのまま使用します。デフォルトは、パスが渡されていない場合にのみ適用されます。
  2. paper2assets パッケージがすでに存在する場合 → そのフォルダーをそのまま <video_outdir> として再利用します。判定の標準的なシグナルは <dir>/assets/meta/paper_spec.md です。存在する場合は、"layout": "v2-assets" を含む <dir>/manifest.json も確認の手掛かりになります。
  3. それ以外の場合(入力が PDF のみの場合) → paper2assets のデフォルト規約に合わせて <input_pdf_dir>/<pdf_stem>/ をデフォルトとします。これにより、後で paper2assets を実行した場合も同じバンドルに出力されます。

pptx2video render は、すでに存在するパスへの書き込みを拒否します。そのため、ステップ 5 ではこの理由から新しい一時バンドルにレンダリングし、その後、このスキルが結果を <video_outdir> に昇格します(ステップ 5 を参照)。

ステップ 1:共通の paper2assets パッケージを作成または再利用する

python skills/paper2assets/scripts/build_package.py <paper.pdf> --outdir "$VIDEO_OUT"

paper_spec.md がすでに存在する場合は、再抽出する代わりに、構造化された主張とナレーションを同期します。

python skills/paper2assets/scripts/build_package.py <paper.pdf> \
  --outdir "$VIDEO_OUT" \
  --skip-extract \
  --paper-spec "$VIDEO_OUT/assets/meta/paper_spec.md"

assets/meta/narration.json は、この実行におけるナレーション順序の正規データです。セクションごとに {"id", "heading", "text"} のエントリーが 1 つずつあり、ポスター、ブログ、動画のすべてで同じ順序を使用します。ここでは順序を変更したり書き換えたりしないでください。ppt-master は paper2assets パッケージを読み込んでこの順序でスライドを作成し、ステップ 4 では同じソースから pptx2video にナレーションを渡します。

ステップ 2:共通の ppt_trigger を 1 つ決定する

これは、このスキルで最も重要なステップです。ppt-master を呼び出す前に ppt_trigger を決定し、ppt-master と pptx2video の両方に、決定した同じ値を渡します。どちらの子スキルにも、それぞれ独自のデフォルト値を使用させないでください。

python3 skills/paper2video/scripts/ppt_options_contract.py resolve-ppt-trigger \
  --ppt-trigger {auto,on-click,after-previous}
  • ユーザーが希望を明示していない場合は、--ppt-trigger を省略するか、auto を渡します。これにより on-click に決まります。連続した 1..N のアニメーションウィンドウのバッジ番号が付いた、ダウンロード可能な PPTX の方が幅広く役立つ成果物であり、どちらを選んでもレンダリングされた MP4 は手動クリックなしで自動再生されるためです(以下を参照)。
  • ユーザーがプレゼンターによる操作が可能な、番号付きの PPTX を希望する場合は、on-click を明示的に渡します。
  • ユーザーが PowerPoint でネイティブに自動再生される PPTX も明示的に希望する場合に限り、after-previous を渡します(「動画が自動再生される」だけの場合は該当しません。レンダリングされた MP4 はこの選択に関係なく常に自動再生されます)。

このコマンドは JSON オブジェクトを 1 つ出力します。すべてのフィールドを提案ではなく、次の 2 つのステップに引き継ぐリテラル値として扱ってください。

{
  "ppt_trigger": "on-click",
  "ppt_master_animation_trigger": "on-click",
  "pptx2video_click_group_policy": "normalize"
}
{
  "ppt_trigger": "after-previous",
  "ppt_master_animation_trigger": "after-previous",
  "pptx2video_click_group_policy": "preserve"
}

ppt_master_animation_trigger は、ステップ 3 で ppt-master の --animation-trigger フラグに渡す正確な値です。pptx2video_click_group_policy は、ステップ 5 で pptx2video の --click-group-policy フラグに渡す正確な値です。これらは同じコマンドから取得するため、2 つの子スキルがユーザーのトリガー指定について食い違うことはありません。ステップ 6 の監査や再試行でも同じ値を使えるよう、出力された JSON を記録します(たとえば $VIDEO_OUT/assets/meta/ppt_trigger_handoff.json に保存します)。

レンダリングされた MP4 がどちらの設定でも自動再生される理由。 pptx2video の動画スケジューラーは、PowerPoint のクリックグループ番号を参照せず、ネイティブのアニメーションウィンドウの行順(effect_order)とナレーション/単語境界のタイミングを使って、すべての出現フェーズをタイムラインに配置します。on-click を選択すると、ダウンロードした PPTX を人が PowerPoint で開いたときの見え方だけが変わります。MP4 がクリックを待つようになるわけではありません。

ステップ 3:解決済みのトリガーを渡して、ppt-master でスライドデッキを作成する

インストール済みの ppt-master スキルを呼び出し、そのワークフロー全体に従います。具体的には、ソースの変換、プロジェクトの初期化/インポート、Strategist の確認段階(フィールド a〜h、必須、省略不可)、任意の画像取得、ページごとの順次 SVG 作成、svg_quality_checker.py、そして 3 つのコマンドを 1 つずつ実行するエクスポートパイプライン(total_md_split.py、finalize_svg.py、svg_to_pptx.py)を行います。

  • ppt-master を手書きの SVG、ローカルの簡易ジェネレーター、または論文に由来しない内容を含むコピーしたサンプルデッキに置き換えないでください。
  • ppt-master が処理を妨げる確認ゲートに到達し、ユーザーがデフォルト設定をすでに承認していない場合は、停止してユーザーに確認してください。
  • マシンの依存関係が不足している場合は、不足している具体的な依存関係を記録して停止してください。別のスライド生成方式に黙って切り替えないでください。
  • ソースコンテンツとして $PAPER_ASSETS/assets/meta/narration.json のセクション(または論文/PDF のコンテンツを直接)を渡してください。論文にない主張を作り出さないでください。

ステップ 2 で resolve_ppt_trigger_handoff が返した値を、ppt-master の --animation-trigger フラグにそのまま渡します。

python3 ${SKILL_DIR}/scripts/svg_to_pptx.py <project_path> \
  --animation-trigger <ppt_master_animation_trigger from Step 2>

スライドデッキに開始アニメーションを一切含めない場合(-a none、ppt-master 独自のデフォルト設定)、--animation-trigger フラグは無関係なので省略できます。解決済みの値が必要になるのは、-a で実際の開始エフェクトを指定する場合のみです。スピーカーノートは有効のままにしてください(ppt-master のデフォルト設定です。--no-notes は渡さないでください)。ステップ 4 で raw Notes を pptx2video の標準的な要素ごとのプロトコルに置き換えるためです。ノート形式については、以下の注記を参照してください。

ppt-master の Notes は pptx2video の Notes プロトコルではありません。 ppt-master の markdown_to_plain_text() は、pptx2video の標準的な ## [handle] semantic ブロック文法ではなく、プレーンな発表者ノートの段落を書き込みます。pptx2video は、通常の発表者ノートをナレーションなしとして扱い、汎用の図形ごとのハンドルにフォールバックします。アニメーション付きの raw ppt-master PPTX を直接レンダリングしないでください。ステップ 4 では、まずページ単位のナレーションをハンドル指定の Notes と Alt Text に変換します。

ppt-master を呼び出す前に、paper2assets パッケージがある場合は、タイトルスライド用のユーティリティアセットを準備します。

python skills/paper2assets/scripts/fetch_logos.py \
  --outdir "$PAPER_ASSETS" --from-spec "$PAPER_ASSETS/assets/meta/paper_spec.md" || true
python skills/paper2assets/scripts/make_qr.py \
  --outdir "$PAPER_ASSETS" --from-metadata "$PAPER_ASSETS/assets/meta/metadata.json" || true

paper_spec.md が利用できない場合は fetch_logos.py をスキップしてください。ロゴを作り出してはいけません。make_qr.py はベストエフォートで実行し、metadata.json の paper_url、code_url、または文書化されている arxiv_id のフォールバックのみを使用します。これらのアセットをスライド 1 に控えめに配置する(右側のタイトル領域または右下のセーフゾーン)ための要件ブロックを ppt-master のプロンプトに追加し、利用できないアセットは壊れたプレースホルダーを残さずに省略するよう指示してください。

ステップ 4 に進む前に、エクスポートによって <project_path>/exports/<name>.pptx に PPTX が生成されたことを確認してください。

Step 4: ナレーションを準備し、編集可能なプロトコルを初期化する

共有の narration.json から script.json を作成し、pptx2video のナレーションの基準を明確にして、ppt-master の未加工の Notes テキストに依存しないようにします。

{
  "sections": [
    {"id": "problem", "heading": "Problem", "text": "..."},
    {"id": "method", "heading": "Method", "text": "..."}
  ]
}

paper2assets の assets/meta/narration.json はすでにこの {"id", "heading", "text"} 形式になっているため、セクション数が PPTX の スライド数と一致していれば、bootstrap --script-json の入力としてそのまま使用できます。このファイルのセクション数は、Step 3 で書き出したデッキのスライド数と一致し、順序も同じでなければなりません。pptx2video はセクション数の不一致を拒否します。ppt-master のページ数の決定処理で、narration.json のセクション数と異なるスライド数が生成された場合は、レンダリング前に両者を調整してください。ページ数を修正してデッキを再生成するか、script.json のコピーを編集して、セクション数と順序を納品する PPTX に正確に合わせます。一致させるためにセクションを切り詰めたり、複製したりしないでください。

通常のアニメーション付きデッキを一度初期化します。これにより、各スライドのページ単位のナレーションがアニメーションの各対象に割り当てられ、正規のハンドル参照付き Notes と Alt Text が書き込まれます。

PPTX2VIDEO_WORK=$(mktemp -d)
PPTX2VIDEO_SOURCE="$PPTX2VIDEO_WORK/video-protocol-source.pptx"
PPTX2VIDEO_TMP="$PPTX2VIDEO_WORK/video-bundle"
python3 -m pptx2video bootstrap \
  "<project_path>/exports/<name>.pptx" \
  --script-json "$VIDEO_AUDIO/script.json" \
  --output "$PPTX2VIDEO_SOURCE"

bootstrap の終了コードが 0 以外の場合は、処理を続行しないでください。Step 5 で $PPTX2VIDEO_SOURCE を ppt-master の未加工の書き出しファイルに置き換えないでください。

ステップ 5:解決済みの同じトリガーを渡して pptx2video でレンダリングする

初期化した PPTX を新しい出力ディレクトリにレンダリングします。ページレベルのスクリプトは --ids-from-script としてのみ渡します。これにより、ステップ 4 で記述した要素ごとのナレーションを保持しつつ、各スライドの内部 section_id を修正できます。このレンダリングでは --script-json を使用しないでください。スライド全体のトランスクリプトが最初のアニメーション要素に配置され、ほかの要素が空になるためです。

python3 -m pptx2video render \
  "$PPTX2VIDEO_SOURCE" \
  "$PPTX2VIDEO_TMP" \
  --resolution 1080p \
  --ids-from-script "$VIDEO_AUDIO/script.json" \
  --animation-order-policy animation-pane \
  --click-group-policy <pptx2video_click_group_policy from Step 2> \
  --qa-mode strict
  • --click-group-policy には、ステップ 2 で解決した値(on-click の場合は normalize、after-previous の場合は preserve)をそのまま指定する必要があります。このフラグを省略して pptx2video 独自の CLI デフォルト値に頼らないでください。CLI のデフォルト値(normalize)は、意図的に作成された after-previous の連続再生をクリック操作で進むスライドデッキにひそかに上書きします。これは明示的な after-previous の指定とは正反対です。
  • --animation-order-policy animation-pane を指定すると、実行は完全に非対話的かつ決定的になります。pptx2video 独自の auto デフォルト値は、stdin が TTY の場合にのみプロンプトを表示します。非対話型のエージェントセッションで実際に順序の競合があると、レンダリングせずに終了コード 3 で終了します。animation-pane を明示的に渡すと、「デッキ独自のアニメーションウィンドウの順序を信頼する」ことを事前に指定できるため、実際に競合があっても処理がひそかに停止することはありません。
  • ユーザーが字幕を明示的に無効にしていない限り、--no-subtitles を渡さないでください。デフォルトでは字幕が video.mp4 に焼き込まれ、video_no_subtitles.mp4 と VTT/SRT のサイドカーファイルはそのまま残ります。
  • 初回のレンダリングでは --baseline-pptx/--narration-mode regenerate を渡さないでください。これらは、以前に納品したデッキを明示的に再レンダリングする場合に使用します。

--no-qa を追加しないでください。 これはトップレベルの pptx2video render CLI には存在しません。QA は常に実行され、常に assets/meta/reports/video_qa_report.json に書き込まれます。--qa-mode で決まるのは、どの検出結果によってレンダリングが失敗するかだけです。このステップで指定する strict モードでは、チェッカーが passed を報告しない限り、cli.py 独自の _render() が SystemExit を発生させます。そのため、すべてのエラーと、免除対象ではないすべての警告がブロック要因になります。チェッカーが免除するコード(現在は audio_extra_files。以前の実行で残った、参照されていない MP3)は、ブロックせずにレポートに表示されます。ここでのゼロ以外の終了コードはブロック要因となる失敗を意味します。デッキ、スクリプト、またはフラグを修正して、このコマンドをそのまま再実行してください。--qa-mode を緩めたり、結果を強制的に出すために非公開のレンダリング経路に切り替えたりしないでください。

成功したら、同じバンドルルートを共有する別の paper2* スキルが既存の manifest.json を上書きしないように、新しいバンドルを <video_outdir> に移します。

rsync -a --exclude=manifest.json "$PPTX2VIDEO_TMP"/ "$VIDEO_OUT"/

$VIDEO_OUT/manifest.json がすでに存在する場合(同じバンドルルートを共有する paper2assets、paper2poster、または paper2blog が書き込んだもの)、上書きせずに $PPTX2VIDEO_TMP/manifest.json の動画固有のフィールドを手動で統合してください。無条件のコピーによって、同じ manifest.json に別の paper2* スキルが書き込んだフィールドを消さないでください。それ以外の場合は、pptx2video の manifest.json をそのままコピーしてください。

ステップ 6:解決済みのトリガーに照らして最終 PPTX を監査する(必須ゲート)

これにより、旧プロトコルでは確認されなかった点を検証できます。納品する video.pptx のネイティブな p:timing ツリーに、ステップ 2 でこのスキルが 解決したトリガーが実際に含まれていることを証明します。ppt-master のフラグと pptx2video のフラグがそれぞれ正しく機能したと安易に信頼してはいけません。

python3 skills/paper2video/scripts/ppt_stage_validator.py audit-final-pptx-trigger \
  "$VIDEO_OUT/video.pptx" \
  --ppt-trigger <ppt_trigger from Step 2>
  • on-click では、With-Previous 以外のネイティブな行はすべて clickEffect にする 必要があります。これにより、ダウンロードした PPTX のアニメーションウィンドウで 連続した 1..N の番号バッジが表示されます。
  • after-previous では、保持されたカスケード内のすべての行を含め、With-Previous 以外のネイティブな行はすべて afterEffect にする必要があります。これにより、 PowerPoint で PPTX がネイティブに自動再生されます。この選択では、番号付きの アニメーションウィンドウは主張も要求もされません。
  • 監査では、どのスライドにもネイティブな p:timing アニメーションがない場合、 エラーを発生させます。そのため、アニメーション要求が黙って破棄されても、 条件が空であることを理由に通過せず、明確に失敗します。

ここで終了コードが 0 以外になるのは、ステップ 5 の video_qa_report.json が 失敗した場合と同様、処理をブロックする失敗です。つまり、ppt-master の --animation-trigger と pptx2video の --click-group-policy でトリガーが 一致しなかったか、どちらかがステップ 2 で解決した値ではなく、独自のデフォルト値に フォールバックしたことを意味します。ステップ 3 とステップ 5 で実際に渡した フラグを、ステップ 2 で出力された JSON と照らして再確認し、異なっていたコマンドを 修正してから再レンダリングし、動画の完成を報告してください。

ステップ 7:報告

納品物の絶対パスをユーザーに伝えます。

  • <video_outdir>/video.mp4(字幕埋め込み済み)
  • <video_outdir>/video_no_subtitles.mp4(paper2reel のソース)
  • <video_outdir>/video.pptx(編集可能なデッキ。ステップ 6 の監査で 検証したものと同じファイル)
  • <video_outdir>/assets/meta/timeline.json および <video_outdir>/assets/meta/reports/video_qa_report.json

使用した ppt_trigger を明示し、ステップ 6 の監査に合格したことを確認します。 ステップ 5 の QA ゲートとステップ 6 のトリガー監査の両方を実行して合格する前に、 タスクの完了を報告してはいけません。

受け入れ基準

  • ppt_trigger=on-click が解決されて使用された場合、ダウンロードした PPTX の アニメーションウィンドウに連続した 1..N の番号バッジが表示される。
  • ppt_trigger の選択にかかわらず、レンダリングされた動画では、音声ナレーションと 順序が一致するすべてのフェーズが自動再生される。
  • ユーザーが明示的に after-previous を要求した場合、納品する PPTX は PowerPoint でネイティブに自動再生される。ネイティブな番号が連続しているとは主張しない。
  • ppt_stage_validator.py audit-final-pptx-trigger が、ステップ 2 で解決されたものと 同一の ppt_trigger に対して 0 を返す。
  • pptx2video render 独自の QA ゲート(video_qa_report.json)が --qa-mode strict で passed と報告する。エラーがなく、チェッカー独自の 適用除外リストに含まれない警告もない。

主なルール

  • 経路は 1 つのみです。すべてのレンダリングは /pptx2video またはステップ 5 の pptx2video render CLI コマンドを通じて実行します。非公開の pptx2video.<module> インポートや、独自に作成したナレーション、タイムライン、QA の 代替手段は使用しないでください。
  • トリガーの決定は 1 回のみです。ステップ 2 では、実行ごとに ppt_trigger を ちょうど 1 回解決します。ステップ 3 とステップ 5 はどちらも同じ解決済み JSON を 使用し、子スキル独自のデフォルト値は使用しません。
  • QA ゲートへの合格だけでは完了ではありません。video_qa_report.json の合格は、 pptx2video 自身のレンダリングに問題がなかったことを証明しますが、トリガーの引き継ぎが 保たれたことは証明しません。それを検証するのがステップ 6 の監査です。完了を報告する前に、 必ず実施してください。
  • 問題を黙って見過ごしてはいけません。依存関係の欠落、ppt-master の確認ゲートによる ブロック、QA レポートの失敗、トリガー監査の失敗はいずれも、処理を止めて修正すべき 条件です。簡略化または未検証の動画を納品する理由にはなりません。

ツール

scripts/
├── ppt_options_contract.py   # resolve-ppt-trigger CLI; also the shared PPT option/appearance contract
└── ppt_stage_validator.py    # audit-final-pptx-trigger CLI; also descriptive-option/export-flag audits

汎用レンダリングランタイムは、このスキルが所有またはベンダー提供するものではありません。 pptx2video をインストールし、/pptx2video または python3 -m pptx2video {doctor,render,bootstrap} を通じてのみ呼び出してください。

参考資料

  • references/pptx2video.md - スタンドアロンレンダラーのインストール手順、このスキルのステップ 5 のコマンドが依存する正確な CLI フラグ、およびプロトコルから気付かないうちに逸脱する、ほぼ正しい呼び出しを招く落とし穴(PATH、--no-qa が存在しないこと、クリックグループポリシーの既定値)。
  • references/script_json_schema.md - ステップ 4 で bootstrap に渡し、ステップ 5 では --ids-from-script としてのみ渡す script.json のスキーマ。ハンドルレベルの elements 形式や TTS テキストに関する注意点も含みます。
  • references/ppt_trigger_handoff.md - 4 つの概念からなるモデル、その基盤となるネイティブ OOXML の仕組み、およびこのスキルのステップ 2/ステップ 6 で解消する障害パターンについての詳細な解説。

コメント