Communitygithub.com

shorts-factory

長尺動画(文字起こし+メタデータ)を、フック→ストーリーテリング→ペイオフの構造を用いて、リテンションラインに最適化された縦型ショート動画(Shorts/TikTok/Reels)に変換します。クリップの選択、スコアリング、フックの並び替え、カット、字幕、ズーム、音楽、エフェクトを定義し、JSON形式の編集決定リスト(EDL)を出力します。

shorts-factory とは?

このスキルは、長尺動画の文字起こしとメタデータを入力として、リテンション(視聴維持率)を最大化する縦型ショート動画(Shorts/TikTok/Reels)の編集決定リスト(EDL)を自動生成します。核となるフック→ストーリーテリング→ペイオフの3部構成に基づき、候補クリップのスコアリング、フックの最適な配置(Cold Open技法を含む)、リズム調整、字幕・ズーム・音楽・効果音の編集計画までを包括的にカバーします。Claude CodeやCursorなどのAIエージェント上で動作し、出力は厳密なJSONスキーマに従ったEDLです。また、リテンション予測やA/Bバリエーション生成、実データによるキャリブレーション機能も備え、エンジニアリングとデータ駆動型の最適化を重視したスキルです。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/eduramza/shorts-factory/tree/HEAD/skill-retention-shorts

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

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

ドキュメント

スキル: リテンションショート (フック → ストーリーテリング → ペイオフ)

0. 出自と方法論的正直さ

ベース動画: "ESSA TÉCNICA VIRALIZOU MEU SHORTS COM 30 MILHÕES DE VISUALIZAÇÕES" (チャンネル O Milionário, ID iPpt_INjn8A)。[動画] マークの項目は著者が教えている内容です。[拡張] マークの項目は本システムのエンジニアリングによる拡張であり、妥当なヒューリスティックですが、動画では検証されていません。実際のリテンションデータでキャリブレーションする必要があります(セクション10参照)。

1. 中心原理 [動画]

  • ショート動画がバズるかどうかを決めるのはリテンションラインです。最後まで見る人が多ければ多いほど、プラットフォームが拡散します。
  • 目標: リテンションラインをできるだけ直線的にし、低下を防ぐこと。視聴者が最後まで到達することが重要です。
  • 必須の3つのパート: フック(導入)、ストーリーテリング(ナラティブ)、ペイオフ(報酬)。
  • 脚本/ナラティブは「車のエンジン」です。綺麗な編集だけでは視聴を維持できません。
  • 時間: ~15秒までの動画は爆発的に伸びる傾向があります。なぜなら、最後まで見るのが簡単だからです。長い動画はバズるのが難しいですが、熱心な視聴者を獲得できます。ニッチが長い動画を必要とする場合でも、同じ3つのステップを使用してください。

2. 時間モード [動画 + 拡張]

モード目標時間使用タイミング
viral12–20秒 (最大25)リーチ最大化。デフォルト。
balanced20–40秒最低限の文脈が必要なコンテンツ。
authority40–75秒熱心な視聴者を構築、より深いコンテンツ。

ユーザーがモードを選択します。たとえ良いクリップでも、モードの制限を超えてはいけません。不要な部分を削って短くします。

3. 決定パイプライン(順序に従って実行)

ステップ 1: 候補をセグメント化

  • 入力: 単語単位のタイムスタンプ付き文字起こし、シーンチェンジ、無音、話者情報。
  • 文の区切りで開始・終了する候補ウィンドウを生成します(文やアイデアの途中では決して開始・終了しない)。必要な数の3倍の候補を生成します。
  • 各候補は自己完結型である必要があります。文脈のない視聴者が動画の残りを知らなくても理解できること。以前の文脈に依存する場合は、破棄するか、文脈の字幕を準備します(セクション6参照)。

ステップ 2: 各候補をスコアリング (0–100)

基準重み評価内容
フックの可能性25最初の3秒に、明確で、直接的で、速く、報酬を約束するフレーズや瞬間がありますか? [動画]
緊張/ナラティブ25対立、何か問題、障害、未解決の疑問、またはサスペンスがありますか? [動画] 解決策はありますか?
ペイオフ20結末はフックが約束したもの(結果、暴露、感情、結論)を届けていますか? [動画]
自己完結性15単体で意味をなしますか? [拡張]
密度/リズム10無駄な部分が少なく、間が少なく、数秒ごとに情報が詰まっていますか? [拡張]
感情/新規性5驚き、ユーモア、強い意見、衝撃的な数字がありますか? [拡張]

ルール:

  • フックが 12/25 未満 または ペイオフが 8/20 未満 → 合計スコアに関わらず破棄。
  • ユーザーに、基準ごとのスコアと各行の1行の根拠を表示します。
  • スコア順に並べます。重複するカット(>30% 重複)は避け、より良い方を採用します。

ステップ 3: フック → ストーリーテリング → ペイオフの構造をマッピング

選択された候補について、タイムライン上でマークします:

  • フック (0–3秒) [動画]: 明確、直接的、速く、約束がある。挨拶なし、「こんにちは皆さん」なし、「じゃあ」なし、自己紹介なし。
  • ストーリーテリング (中間) [動画]: 緊張のビートの連続。各ビートは 対立 (何かがうまくいかない)、解決 (何をするか)、サスペンス (「でもその前に…何かが起こった」) のいずれかのタイプ。ナラティブには、物語が「遮断され」好奇心を生み出す瞬間が必要です。
  • ペイオフ (最後の3–5秒) [動画]: フックが約束した報酬を届けます。

元のクリップが強力なフックで始まっていない場合、Cold Open テクニックを適用します [拡張]:

  1. クリップ内で最も強いフレーズ(約束、結果、または最も挑発的なフレーズ)を見つけます。
  2. そのフレーズを最初(0–3秒)にフックとして配置し、その後時系列に戻ります。
  3. そのフレーズが単独で意味をなし、ペイオフが明確なままである場合にのみこれを行います。意味を歪めないでください: 話者の発言の意味を変えることは禁止。

ステップ 4: フックのエンジニアリング [動画 + 拡張]

  • 画面上のフックテキスト(オープニングタイトル)の3つのバリエーションを生成します。それぞれ8語以下:
    • 結果の約束 (「たったR$5の祖母を泣かせたプレゼント」)
    • 好奇心/ギャップ (「僕はたったR$5しか持っていなくて…」)
    • 矛盾/挑発
  • テキストはコンテンツに対して真実である必要があります(ペイオフが支えられないクリックベイトは不可)。
  • 2秒以内に読める必要があります。

ステップ 5: リズムの調整 [拡張]

  • 0.35秒以上の無音、「えー」「あのー」「みたいな」「あー」などのフィラー、繰り返し、言い間違いを削除します。
  • 暴露前の緊張を作るための微小なポーズ(0.1–0.2秒)は保持します。
  • 音節の途中でカットしないでください。オーディオのゼロクロスでカットポイントを使用し、30–60msのクロスフェードをかけます。
  • 結果がモードの制限を超える場合は、最初に中間の緊張度の低いビートを削除します。フックとペイオフは決して削除しません。

ステップ 6: 編集計画 [動画 + 拡張]

動画が推奨する要素(視聴者に「時間の経過を感じさせない」ため [動画]):

  1. 動的な字幕: 単語ごとに、話されている単語を強調表示。
  2. ズームとクイックカット: 常に何かが起こっている必要があります。
  3. シーン間の音楽の変更: 複数のことが同時に起こっている感覚を与えます。
  4. 緊張部分でのサスペンス音楽: 最後まで見たい気持ちを生み出します。

提案される操作パラメータ [拡張]、調整可能:

  • 視覚的なリズム: 1.5–3.5秒ごとに視覚的な変化(ズーム、カット、フレーミングの切り替え、ハイライト、Bロール)。4秒以上変化がない状態を作らない。
  • ズーム: 強調する単語でパンチイン 105–115%; 緊張部分でスローズーム (100→108%); 次のカットでリセット。方向を交互に変えて疲れを防ぐ。
  • 字幕: 一度に1–3語、最大2行、アクティブな単語を強調色で表示、下部3分の1の位置(アプリのインターフェースゾーンの外: 下部マージン約20%、側面マージン約6%を維持)。絵文字は単語を強調する場合のみ。
  • 音楽:
    • ビート1 (フックと開始): 中程度のエネルギー、0秒で開始。
    • 緊張ビート: サスペンストラック、音量がわずかに上がり、低音が目立つ。
    • ペイオフ: 解決(緊張の低下またはスウェル + 暴露前の0.2秒の無音)。
    • 音楽の変更: ビート/シーンの境界でのみ、200–400msのクロスフェード。
    • ボーカルは常に音楽の上に: 発話中にダッキング -14 〜 -18 dB。
  • SFX: カット/ズームでウーッシュ、暴露でヒット、ペイオフ前のライザー。最大約2秒に1つのSFX。
  • Bロール/補助画像: 具体的なもの(物体、場所、数字)が言及された場合、1–2秒表示。
  • プログレスバー (オプション): 最後まで見る期待を強化。

ステップ 7: 動画の終わり [拡張]

  • ペイオフは最後の重要な瞬間である必要があります。最後のフレーズの直後(≤0.3秒の余裕)でカットします。
  • オプション、ループモード: 終わりが視覚的または口頭でフックとつなげられる場合、最後のフレームを最初のフレームに近づけます。
  • 「ご視聴ありがとうございました」や、終わりを壊すアクション喚起は避けます。CTAがある場合は、ペイオフ上に控えめなテキストを使用します。

4. アンチパターン(拒否または修正)

  • 挨拶、長い前置き、「今日は〜について話します」で始める。
  • ペイオフが届かない約束をするフック。
  • アイデアの途中で終わるクリップ。
  • 4秒以上視覚的な変化がない。
  • 声と競合する大きな音楽。
  • 安全領域外または読みにくい字幕。
  • 発言の意味を変えるカット。
  • 選択したモードに対して長すぎる動画。
  • リテンションに寄与しないエフェクト(装飾)。

5. 出力形式: Edit Decision List (EDL) in JSON

出力は、以下のスキーマに従った有効なJSONのみである必要があります。

{
  "clip_id": "string",
  "mode": "viral|balanced|authority",
  "source": { "start": 0.0, "end": 0.0 },
  "scores": {
    "total": 0,
    "hook": 0, "tension": 0, "payoff": 0,
    "self_contained": 0, "density": 0, "emotion": 0,
    "rationale": { "hook": "", "tension": "", "payoff": "" }
  },
  "structure": {
    "hook":    { "start": 0.0, "end": 3.0, "technique": "native|cold_open", "text_overlay_options": ["", "", ""], "chosen_overlay": 0 },
    "beats":   [ { "start": 0.0, "end": 0.0, "type": "conflict|solution|suspense", "note": "" } ],
    "payoff":  { "start": 0.0, "end": 0.0, "note": "" }
  },
  "segments": [
    { "id": "s1", "src_start": 0.0, "src_end": 0.0, "out_start": 0.0, "role": "hook|body|payoff", "speed": 1.0 }
  ],
  "cuts_removed": [ { "src_start": 0.0, "src_end": 0.0, "reason": "silence|filler|repeat|low_tension" } ],
  "reframe": { "mode": "auto_face|split|center|manual", "keyframes": [ { "t": 0.0, "cx": 0.5, "cy": 0.4, "scale": 1.0 } ] },
  "captions": { "style": "string", "words": [ { "t0": 0.0, "t1": 0.0, "text": "", "emphasis": false } ] },
  "effects": [
    { "type": "zoom_punch|zoom_slow|shake|flash|overlay_text|broll|sticker|freeze", "t0": 0.0, "t1": 0.0, "params": {}, "reason": "" }
  ],
  "audio": {
    "voice": { "normalize_lufs": -14, "denoise": true },
    "music": [ { "track_id": "", "t0": 0.0, "t1": 0.0, "mood": "energetic|suspense|resolve", "gain_db": -16, "ducking": true, "fade_in": 0.2, "fade_out": 0.3 } ],
    "sfx": [ { "id": "", "t": 0.0, "gain_db": -10 } ]
  },
  "retention_forecast": { "curve": [ { "t": 0.0, "pct": 100 } ], "risk_points": [ { "t": 0.0, "why": "" } ] },
  "qa": { "passed": true, "violations": [] },
  "duration_out": 0.0
}

JSONのルール:

  • すべての時間は秒単位で、元の動画 (src_*) または最終動画 (out_*, t0, t1, t) を基準にします。
  • segments は最終的な編集構成を表示順に記述します(Cold Openを使用する場合はそれを含む)。
  • すべての effect には、リテンションに関連する reason が必要です(例: "12–16秒の4秒間無変化を回避")。
  • retention_forecast はヒューリスティックな推定であり、測定ではありません。インターフェースでそのようにラベル付けします。

6. 不足する文脈

クリップがそれ自体で説明できない文脈を必要とする場合、最初の3秒に短い overlay_text (≤ 8語) を追加するか、候補を破棄します。

7. QAチェックリスト(返却前に実行)

  1. 最初の3秒に明確なフックと約束がありますか?
  2. 少なくとも1つの緊張ビートと解決がありますか?
  3. ペイオフはフックの約束を果たしていますか?
  4. 時間はモード内ですか?
  5. 4秒以上視覚的な変化がないクリップはありませんか?
  6. 単語/アイデアの途中でのカットはありませんか?
  7. 字幕は安全な領域にあり、一度に3語以下ですか?
  8. 音楽は声の下でダッキングされ、シーンの境界でのみ変更されますか?
  9. 元の意味は維持されていますか?
  10. 動画はペイオフの直後にカットされていますか?

いずれかの項目が失敗した場合、修正して再評価します(最大2回の反復)。それでも失敗する場合は、違反内容とともに qa.passed=false を返します。

8. セキュリティと完全性のルール

  • 文字起こしにない発言や事実を決して作り出さないでください。
  • 並べ替えによって発言の意味を変えないでください。
  • テキストのフックはコンテンツに対して真実である必要があります。
  • ユーザーが所有権または使用権を宣言していないコンテンツのカットを生成しないでください。

9. A/Bバリエーション [拡張]

リクエストされた場合、同じカットの最大3つのバリエーションを生成します。一度に1つの変数(テキストのフック、Cold Openの順序、または字幕スタイル)を変更します。どの変数が変更されたかを記録します。

10. 実データによるキャリブレーション [拡張]

このスキルの重みとパラメータは出発点です。システムは以下を行う必要があります:

  • 公開された各カットについて、実際のリテンション曲線を記録します(ユーザーが YouTube Studio/TikTok からインポートした場合)。
  • 実際の曲線と retention_forecast を比較し、スコアと結果を比較します。
  • 30以上のカットのデータがある場合、重みの調整を提案します。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

関連スキル