ビデオからショート動画への変換
依存関係
/video-understand が前提条件です。最初にこれを実行して、ショート動画が検証済みのソーストランスクリプトと正規のタイムラインを使用するようにしてください。
開始する前に、それがインストールされていることを確認してください。インストールされていない場合は、この前提条件が欠落していることをユーザーに警告し、メディア処理を開始する前に停止してください。
ffmpeg/ffprobe が PATH に存在し、Python に Pillow がインストールされている必要があります。メディア処理の前にこれらを確認してください。
スコープ
このスキルには、2つのプロジェクトフェーズがあります。
- レンダリング前の計画: 理解されたトランスクリプトをプログラム時間にマッピングし、候補を作成・承認し、
work/shorts/shorts-plan.jsonを書き込みます。このフェーズでは最終ビデオは作成しません。 - レンダリング後の確定: 選択されたすべてのメインシーケンス編集が承認され、共有のメインデリバリーが検証された後に、
plan.pyを再実行して同じ承認済み範囲をそのデリバリーにバインドし、水平方向およびオプションの垂直方向の出力を抽出します。
このスキルは、ショート動画の候補判断、決定論的認定、水平方向の抽出、ショート相対トランスクリプト、およびオプションの決定論的垂直デリバリーを担当します。プロジェクトモードでの文字起こし、メインシーケンスの変更、キャプション/グラフィックの追加、グレーディング、公開、または継続的な被写体追跡は行いません。
配信されるショート動画は final/final-video.mp4 の派生物ですが、候補計画はそのファイルより前に行われます。プロジェクトDAGに操作を記録しますが、sequences.main.operations には決して追加しないでください。メインデリバリーとそのオリジナルvs最終比較は変更されません。
プロジェクト入力
work/project.jsonproject.source.pathによって記録されたプロジェクトソースwork/understand/transcript.json(ソース時間)work/timeline.json- 各フェーズでのアクティブなメイン操作リビジョン
計画には final/final-video.mp4 は必要ありません。確定と抽出には、render.status: verified の状態でその正確なプロジェクトレンダリングが必要です。
prepare_transcript.py --timeline は共有の projectlib.map_transcript_to_timeline を呼び出します。候補/抽出時間は、したがって実際の最終ビデオ上のプログラム秒です。メイン編集によって削除された単語はショート動画では利用できません。保持された各単語は、source_range、program_range、および clip_id を保持します。
プロジェクトのトランスクリプトメタデータは、プロジェクトソース、ソーストランスクリプト、およびタイムラインを絶対パス、サイズ、更新時刻、SHA-256でバインドします。候補レビューフレームは、プログラムタイムスタンプを timeline.json を介してソースビデオにマッピングします。候補の検証は、変更されたバインディングを拒否します。
出力レイアウト
work/shorts/
|-- transcript.json
|-- transcript_metadata.json
|-- candidates.json
|-- shorts-plan.json
|-- review/
| |-- candidate_review.json
| `-- approved_candidates.json
`-- short-001/
|-- transcript.json
|-- extraction-report.json
`-- vertical-agent/
|-- agent_vertical_plan.json
|-- vertical_plan.json
`-- review/vertical_review.json
work/cache/shorts/ # 使い捨てのフレーム/シート/中間メディア
review/06-shorts/
|-- candidates-<review-id>.html # 不変の信頼できるページ
|-- candidates-<review-id>-question.md
|-- assets/candidates-<review-id>/ # 不変の開始/中間/終了フレーム
|-- candidates.html # 非公式の最新エイリアス
|-- candidates-summary.md
|-- short-001-horizontal.jpg
|-- short-001-vertical-preview.mp4
|-- short-001-vertical-contact-sheet.jpg
|-- short-001-vertical-preview-summary.json
|-- short-001-vertical-preview-probe.json
|-- <short-id>-vertical-review-<review-id>.html # 不変の信頼できるページ
|-- <short-id>-vertical-review-<review-id>-question.md
|-- <short-id>-vertical-review.html # 非公式の最新エイリアス
|-- <short-id>-vertical-review-assets/
| `-- <review-id>/ # 不変の信頼できる証拠
| |-- preview.mp4 # REVIEW_REQUIRED の場合は存在しない
| |-- contact-sheet.jpg # REVIEW_REQUIRED の場合は存在しない
| |-- preview-summary.json
| `-- media-probe.json
`-- shorts-summary.md
final/shorts/
|-- short-001-horizontal.mp4
`-- short-001-vertical.mp4 # 選択され承認された場合のみ
プログラムトランスクリプト
リポジトリルートから実行:
$RepoRoot = (Resolve-Path ".").Path
$SkillRoot = Join-Path $RepoRoot "skills\video-to-shorts"
$ProjectRoot = (Resolve-Path "<project-root>").Path
$Work = Join-Path $ProjectRoot "work"
$ShortsWork = Join-Path $Work "shorts"
$ProjectSource = (Resolve-Path "<project-source-from-work/project.json>").Path
$FinalVideo = Join-Path $ProjectRoot "final\final-video.mp4"
$ShortsReview = Join-Path $ProjectRoot "review\06-shorts"
New-Item -ItemType Directory -Force $ShortsWork,$ShortsReview | Out-Null
python "$SkillRoot\scripts\prepare_transcript.py" $ProjectSource `
--transcript "$Work\understand\transcript.json" `
--timeline "$Work\timeline.json" `
--out $ShortsWork
プロジェクトタイムラインモードでは、正規の提供トランスクリプトが必要です。スタンドアロンモードでは --timeline を省略できます。その場合、入力相対時間が維持され、一時的な video-understand/scripts/transcribe.py フォールバックが使用される場合があります。トランスクリプトは自動検出されません。
候補作成
長尺ビデオのビジュアルコンテキストをキャッシュに生成し、判断に必要なすべてのシートを検査し、候補JSONを手動作成します。決定論的コードは編集者の判断を検証します。候補やスコアを発明することはありません。
python "$SkillRoot\scripts\prepare_visual_context.py" $ProjectSource `
--timeline "$Work\timeline.json" `
--out "$Work\cache\shorts\candidate-visual" --interval 15
候補入力は、互換性のために shorts-candidates.v2 のままです。selection.evidence_mode とすべての候補の evidence_mode を text_visual に設定します。各候補には以下が必要です:
- 安定した
candidate_id、タイトル、およびシーンタイプ - プログラム時間での完全な
start_time/end_time - 重複するトランスクリプト単語と正確に等しい
transcript_excerpt(セグメント全体ではありません) - 6つすべてのスコアエントリと空でない理由
- 空でない
metadata.editorial_reason - オプションのレビュー済み
filler_drop_spansおよびビジュアル証拠フィールド
合計 score は指定しないでください。バリデーターが6つのディメンションを追加します:
| ディメンション | 最大値 |
|---|---|
hook | 20 |
completeness | 20 |
audience_value | 20 |
emotion_tension | 15 |
quotability | 15 |
pace_editability | 10 |
短い断片よりも、完全で独立して理解可能な考えを優先してください。インタビュアーの質問、前提、主張の裏付け、反転、または見返りなど、依存関係がある場合はそれを保持してください。境界は、完全な単語と思考に一致する必要があります。
作成されたファイルを検証:
$CandidateDir = Join-Path $ShortsWork "preview\text_visual"
python "$SkillRoot\scripts\candidates.py" `
--out $CandidateDir `
--candidates "$CandidateDir\candidate-input.json" `
--transcript "$ShortsWork\transcript.json" `
--project-root $ProjectRoot
これにより、互換性プレビューファイル、永続的な work/shorts/candidates.json、および review/06-shorts/candidates.{html,summary.md} が書き込まれます。
レビューモード
候補の選択と配信モードは、1つのハッシュバウンドゲートです。配信は正確に horizontal_only または horizontal_and_vertical です。
人間モードでバインドされたインタラクティブページを開く:
python "$SkillRoot\scripts\interaction.py" candidate-open --out $ShortsWork --review-out $ShortsReview
このコマンドは、信頼できるレビューIDスコープのページを出力します。レシートは、そのページ、候補JSON、トランスクリプト、ソースメディア、固定質問、および抽出されたすべてのフレームをSHA-256でバインドします。candidates.html は、最新ページへの非公式な便利なエイリアスにすぎません。出力された信頼できるパスを現在のOSのネイティブコマンドで開いてください:
# Windows PowerShell
Start-Process (Resolve-Path -LiteralPath "<出力された信頼できるページのパス>")
# macOS
open "<出力された信頼できるページのパス>"
# Linux
xdg-open "<出力された信頼できるページのパス>"
# エージェント: 信頼できるページを提示し、STOP します。
開けない場合は、ネイティブコマンドを再試行し、それでも開かない場合は失敗を報告してください。提示した後は続行しないでください。ページはすべての候補チェックボックスと両方の配信選択肢が最初は未選択の状態で始まります。ユーザーは1〜5個の候補と1つの配信モードを選択する必要があります。バインドされたページが候補を自動的に選択することはありません。
承認のために、このページ生成された構造化サマリーをそのまま candidate-answer にコピーしてください:
Shorts candidate review
Review: <review-id>
Candidates: text_visual/cand-001, text_visual/cand-002
Delivery: horizontal_and_vertical
修正のために、このページ生成された構造化サマリーをそのままコピーしてください:
Shorts candidate review
Review: <review-id>
Decision: revise
Changes: <空でない要求された変更>
後続の応答を書き換えずに記録:
python "$SkillRoot\scripts\interaction.py" candidate-answer `
--out $ShortsWork --response-file "<逐語サマリーファイル>"
ユーザーが明示的に決定を委任した場合:
python "$SkillRoot\scripts\interaction.py" candidate-open `
--out $ShortsWork --review-out $ShortsReview --decision-mode agent `
--delegation-note "ユーザーがショート動画の選択と垂直承認を委任しました。"
python "$SkillRoot\scripts\interaction.py" candidate-agent-approve `
--out $ShortsWork `
--candidates "text_visual/cand-001" `
--delivery horizontal_and_vertical `
--rationale "選択された範囲には、自己完結型のフック、説明、および見返りが含まれています。"
エージェントは、同じ信頼できるページを開いて検査し、明示的な候補参照、明示的な配信モード、および空でない根拠を使用します。偽の人間の応答や user_response を書き込むことはありません。人間モードとエージェントモードは相互に排他的です。人間の回答コマンドはエージェントモードで失敗し、エージェントの承認コマンドは人間モードで失敗します。レシート検証は、レビュー、ページ、メディアのハッシュを再チェックします。再生成されたソース、候補、トランスクリプト、ページ、質問、フレーム、または承認された候補アーティファクトは、承認を無効にします。
正規の計画
python "$SkillRoot\scripts\plan.py" `
--out $ShortsWork --project-root $ProjectRoot
work/shorts/shorts-plan.json は整数の schema_version: 1 を使用します。以下を記録します:
target: derived、timebase: program、およびtimeline_id- 計画中の
delivery_status: awaiting_main_render - 候補レビューに使用されたプロジェクトソースとタイムラインバインディング
- アクティブなメインシーケンスからの正確な
depends_on/based_onリビジョン - 選択モード、根拠、配信モード、およびレビューID
- 安定したショートID
- 明示的な
program_rangeとマッピングされたsource_ranges - スコアリング/編集証拠、承認されたフィラードロップ、プログラム時間の保持スパン
- ワークトランスクリプト/レポートパスおよび
../final/shorts/*.mp4配信パス
最初の実行は計画フェーズの終わりです。ここで停止し、要求されたキャプション、コンテンツカード、グラフィックモーション、およびその他の残りのメインシーケンス操作を正規の順序で続行します。このスキルから extract_shorts.py を実行したり、final.mp4 を作成したりしないでください。
共有レンダラーが final/final-video.mp4 を検証した後、同じ plan.py コマンドを再実行します。承認されたプロジェクトソースとタイムラインを再検証し、完全なアクティブ操作リビジョンを更新し、検証済みのメインレンダーフィンガープリントを追加し、delivery_status: ready を設定します。タイムラインの変更には新しい候補と承認が必要です。コンテンツカードやキャプションなどのピクセルオンリー操作は必要ありません。
認定は決定論的なままです: スコアが少なくとも70、完全性が少なくとも15、推定出力期間が20〜90秒、有効な正確な抜粋、より高ランクのショート動画との重複が50%を超えないこと、設定されていない限り最大5つの出力。
安全な単語境界を持つ、孤立した意味的に空のためらいの単語のみがフィラードロップとして承認される場合があります。拒否された/安全でないスパンは理由とともに計画に残ります。合計削除量は15%を超えてはならず、保持スパンは0.15秒より短くてはなりません。
水平方向の抽出
python "$SkillRoot\scripts\extract_shorts.py" `
--video $FinalVideo --out $ShortsWork `
--project-root $ProjectRoot
抽出前に、スクリプトはメインレンダーフィンガープリント、プロジェクトレンダリングステータス、現在の完全なメイン操作リストとリビジョン、候補レシート、承認された候補ハッシュ、およびソースビデオを再チェックします。awaiting_main_render 計画は拒否されます。各保持範囲は、それ自身のシークされた -ss/-t/-i 入力になります。ffmpeg はそれらの入力を連結し、1つのH.264/AACエンコードを実行します。保持範囲ごとにメインビデオ全体をデコードすることはありません。
選択された最終トランスクリプト単語とメディアカットエンドポイントは、別々の境界です。抽出は、選択されたコンテンツの後に少なくとも0.25秒のリリースオーディオを保持し、0.30秒を目標とします。--no-refine-boundaries はセマンティックフレーズスナッピングのみを無効にします。必須のリリースハンドルを無効にすることはありません。ソースが必要なハンドルを保持する前に終了する場合、抽出は失敗し、ショート動画は検証済みとしてマークされません。
ショート相対トランスクリプトは、削除された単語を除外し、後の単語を連続的なゼロベースのクロックにシフトし、入力プログラム/ソース証拠を保持します。水平方向のメディアは final/shorts に直接出力されます。ワークには、そのトランスクリプトとレポートのみが含まれます。
垂直方向の計画
垂直方向の配信は、承認された水平方向の出力から始まります。1秒ごと、またはモーションが必要な場合は0.5秒ごとに、高密度のビジュアル証拠を生成します。すべてのシートを検査し、以下のいずれかを作成します:
STATIC_CROP: 1つの安定した固定9:16クロップSCENE_CROP: シーンバウンドの固定クロップ。完全な水平情報が必要なシーンにのみLETTERBOXを使用。LETTERBOX: ぼかし/暗くされた塗りつぶし上の完全なシャープな前景。REVIEW_REQUIRED: 証拠が決定論的な固定クロップをサポートできない。正式なレンダリングはブロックされます。
プレゼンターシーンでは、頭と胴体を安定して大きく保つ必要があります。スライド、製品、グループ、図表は、必須情報を保持する必要があります。継続的な追跡を主張しないでください。クロップの変更は、シーン境界に属します。
各計画セグメントは、ショートタイムラインを完全にカバーし、戦略を持ち、証拠を提供します。
...
[翻訳用に切り捨てられました]