Communitygithub.com

video-to-shorts

Erstellt aus verstandenen Videotranskripten und Zeitplänen automatisch kurze, eigenständige Clips. Der Skill plant, überprüft und extrahiert horizontale sowie optionale vertikale Kurzformate aus einem abgeschlossenen Hauptprojekt.

Was ist video-to-shorts?

Der Skill 'video-to-shorts' automatisiert die Erstellung von Kurzclips aus einem analysierten und validierten Video. Er arbeitet in zwei Phasen: Zunächst wird auf Basis des Transkripts und des Zeitplans ein Plan mit Kandidaten erstellt, der die menschliche oder agentenbasierte Genehmigung durchläuft. Nach der Genehmigung und dem Abschluss des Hauptvideos (final/final-video.mp4) werden die Endsegmente extrahiert. Der Skill unterstützt die Plattformen Claude Code und bietet eine deterministische Qualifikation der Clips basierend auf Bewertungskriterien wie Aufmerksamkeit, Vollständigkeit und Zitierfähigkeit. Er ist auf Projekte ausgelegt, die zuvor mit dem Skill `/video-understand` validiert wurden, und erfordert ffmpeg/ffprobe sowie Python mit Pillow.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/WhiteTowerAI/cut-as-code/tree/main/skills/video-to-shorts

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Video To Shorts

Abhängigkeiten

/video-understand ist eine Voraussetzung. Führen Sie es zuerst aus, damit die Kurzclips das validierte Quelltranskript und die kanonische Zeitleiste verwenden. Überprüfen Sie vor dem Start, ob es installiert ist. Wenn nicht, warnen Sie den Benutzer, dass diese Voraussetzung fehlt, und stoppen Sie, bevor Sie Medien verarbeiten.

Erfordert ffmpeg/ffprobe im PATH und Python mit Pillow. Überprüfen Sie diese, bevor Sie Medien verarbeiten.

Umfang

Dieser Skill hat zwei Projektphasen:

  1. Vor dem Rendern planen: das verstandene Transkript auf die Programmzeit abbilden, Kandidaten autorisieren und genehmigen sowie work/shorts/shorts-plan.json schreiben. Diese Phase schreibt kein endgültiges Video.
  2. Nach dem Rendern finalisieren: nachdem jede ausgewählte Hauptsequenzbearbeitung genehmigt und die gemeinsame Hauptauslieferung verifiziert wurde, plan.py erneut ausführen, um dieselben genehmigten Bereiche an diese Auslieferung zu binden, dann horizontale und optionale vertikale Ausgaben extrahieren.

Es besitzt die Beurteilung von Kurzclip-Kandidaten, die deterministische Qualifikation, die horizontale Extraktion, kurzclip-bezogene Transkripte und die optionale deterministische vertikale Auslieferung. Es transkribiert nicht im Projektmodus, ändert die Hauptsequenz, fügt keine Untertitel/Grafiken hinzu, bewertet nicht, veröffentlicht nicht und führt keine kontinuierliche Subjektverfolgung durch.

Ausgelieferte Kurzclips sind Ableitungen von final/final-video.mp4, aber die Kandidatenplanung geht dieser Datei voraus. Zeichnen Sie den Vorgang im Projekt-DAG auf, aber fügen Sie ihn niemals zu sequences.main.operations hinzu; die Hauptauslieferung und ihr Original-vs.-Final-Vergleich bleiben unverändert.

Projekteingaben

  • work/project.json
  • die vom Projekt aufgezeichnete Quelle unter project.source.path
  • work/understand/transcript.json in Quellzeit
  • work/timeline.json
  • aktive Hauptoperationsrevisionen in jeder Phase

Die Planung erfordert nicht final/final-video.mp4. Die Finalisierung und Extraktion erfordern dieses genaue Projekt-Render mit render.status: verified.

prepare_transcript.py --timeline ruft die gemeinsame Funktion projectlib.map_transcript_to_timeline auf. Kandidaten-/Extraktionszeiten sind daher Programmsekunden auf dem tatsächlichen endgültigen Video. Durch die Hauptbearbeitung entfernte Wörter sind nicht für Kurzclips verfügbar. Jedes beibehaltene Wort behält seine source_range, program_range und clip_id.

Projekttranskript-Metadaten binden die Projektquelle, das Quelltranskript und die Zeitleiste mit absolutem Pfad, Größe, Änderungszeitpunkt und SHA-256. Kandidaten-Überprüfungsbilder bilden ihre Programmzeitstempel über timeline.json zurück zum Quellvideo ab. Die Kandidatenvalidierung lehnt eine geänderte Bindung ab.

Ausgabelayout

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/                 # Einweg-Frames/Blätter/Zwischenmedien

review/06-shorts/
|-- candidates-<review-id>.html              # unveränderliche, maßgebliche Seite
|-- candidates-<review-id>-question.md
|-- assets/candidates-<review-id>/            # unveränderliche Start-/Mitte-/End-Frames
|-- candidates.html                           # nicht maßgeblicher, letzter Alias
|-- 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 # unveränderliche, maßgebliche Seite
|-- <short-id>-vertical-review-<review-id>-question.md
|-- <short-id>-vertical-review.html             # nicht maßgeblicher, letzter Alias
|-- <short-id>-vertical-review-assets/
|   `-- <review-id>/                             # unveränderliche, maßgebliche Beweise
|       |-- preview.mp4                          # fehlt bei REVIEW_REQUIRED
|       |-- contact-sheet.jpg                    # fehlt bei REVIEW_REQUIRED
|       |-- preview-summary.json
|       `-- media-probe.json
`-- shorts-summary.md

final/shorts/
|-- short-001-horizontal.mp4
`-- short-001-vertical.mp4          # nur wenn ausgewählt und genehmigt

Programm-Transkript

Ausführen vom Repository-Stammverzeichnis aus:

$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

Der Projekt-Zeitleistenmodus erfordert das kanonisch bereitgestellte Transkript. Der Standalone-Modus kann --timeline weglassen; er behält die eingabe-relative Zeit bei und kann den temporären video-understand/scripts/transcribe.py Fallback verwenden. Es wird kein Transkript automatisch erkannt.

Kandidatenerstellung

Erzeugen Sie visuellen Kontext für lange Videos im Cache, überprüfen Sie jedes für eine Entscheidung benötigte Blatt und verfassen Sie Kandidaten-JSON manuell. Deterministischer Code validiert die redaktionelle Beurteilung; er erfindet keine Kandidaten oder Bewertungen.

python "$SkillRoot\scripts\prepare_visual_context.py" $ProjectSource `
  --timeline "$Work\timeline.json" `
  --out "$Work\cache\shorts\candidate-visual" --interval 15

Kandidateneingabe bleibt shorts-candidates.v2 aus Kompatibilitätsgründen. Setzen Sie selection.evidence_mode und jeden Kandidaten evidence_mode auf text_visual. Jeder Kandidat erfordert:

  • stabile candidate_id, Titel und Szenentyp;
  • vollständige start_time/end_time in Programmzeit;
  • transcript_excerpt genau gleich den überlappenden Transkriptwörtern, nicht ganzen überlappenden Segmenten;
  • alle sechs Bewertungseinträge und nicht leere Begründungen;
  • nicht leeres metadata.editorial_reason;
  • optionale überprüfte filler_drop_spans und visuelle Beweisfelder.

Geben Sie keine Gesamt-score an; der Validator addiert die sechs Dimensionen:

DimensionMaximum
hook20
completeness20
audience_value20
emotion_tension15
quotability15
pace_editability10

Bevorzugen Sie einen vollständigen, unabhängig verständlichen Gedanken gegenüber einem kürzeren Fragment. Behalten Sie eine abhängige Interviewerfrage, Prämisse, Behauptungsunterstützung, Umkehrung oder Auszahlung, wenn dies notwendig ist. Grenzen müssen auf ganzen Wörtern und Gedanken liegen.

Validieren Sie die erstellte Datei:

$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

Dies schreibt die Kompatibilitätsvorschaudateien, dauerhafte work/shorts/candidates.json, und review/06-shorts/candidates.{html,summary.md}.

Überprüfungsmodi

Die Kandidatenauswahl und der Auslieferungsmodus sind ein Hash-gebundenes Tor. Die Auslieferung ist genau horizontal_only oder horizontal_and_vertical.

Öffnen Sie die gebundene interaktive Seite im menschlichen Modus:

python "$SkillRoot\scripts\interaction.py" candidate-open --out $ShortsWork --review-out $ShortsReview

Der Befehl gibt eine maßgebliche, auf die Überprüfungs-ID bezogene Seite aus. Die Quittung bindet diese Seite, ihr Kandidaten-JSON, Transkript, Quellmedium, feste Frage und jeden extrahierten Frame mittels SHA-256. candidates.html ist nur ein nicht maßgeblicher praktischer Alias zur letzten Seite. Öffnen Sie den gedruckten maßgeblichen Pfad mit dem aktuellen natives Betriebssystembefehl:

# Windows PowerShell
Start-Process (Resolve-Path -LiteralPath "<printed-authoritative-page>")
# macOS
open "<printed-authoritative-page>"
# Linux
xdg-open "<printed-authoritative-page>"
# Agent: Präsentieren Sie die maßgebliche Seite und HALTEN Sie an.

Wenn das Öffnen fehlschlägt, wiederholen Sie den natives Befehl und melden Sie den Fehler, wenn er immer noch nicht geöffnet wird. Fahren Sie nach der Präsentation nicht fort. Die Seite beginnt mit allen Kandidaten-Kontrollkästchen und beiden Auslieferungsoptionen ursprünglich nicht ausgewählt. Der Benutzer muss 1-5 Kandidaten und einen Auslieferungsmodus auswählen. Die gebundene Seite wählt niemals stillschweigend Kandidaten aus.

Zur Genehmigung kopieren Sie diese genaue, von der Seite generierte strukturierte Zusammenfassung unverändert in candidate-answer:

Shorts candidate review
Review: <review-id>
Candidates: text_visual/cand-001, text_visual/cand-002
Delivery: horizontal_and_vertical

Zur Überarbeitung kopieren Sie diese genaue, von der Seite generierte strukturierte Zusammenfassung unverändert:

Shorts candidate review
Review: <review-id>
Decision: revise
Changes: <non-empty requested changes>

Zeichnen Sie die spätere Antwort auf, ohne sie umzuschreiben:

python "$SkillRoot\scripts\interaction.py" candidate-answer `
  --out $ShortsWork --response-file "<verbatim-summary-file>"

Wenn der Benutzer Entscheidungen explizit delegiert:

python "$SkillRoot\scripts\interaction.py" candidate-open `
  --out $ShortsWork --review-out $ShortsReview --decision-mode agent `
  --delegation-note "User delegated shorts selection and vertical approval."

python "$SkillRoot\scripts\interaction.py" candidate-agent-approve `
  --out $ShortsWork `
  --candidates "text_visual/cand-001" `
  --delivery horizontal_and_vertical `
  --rationale "The selected range has a self-contained hook, explanation, and payoff."

Der Agent öffnet und überprüft dieselbe maßgebliche Seite, verwendet explizite Kandidatenverweise, einen expliziten Auslieferungsmodus und eine nicht leere Begründung. Er schreibt niemals eine gefälschte menschliche Antwort oder user_response. Menschlicher und Agentenmodus schließen sich gegenseitig aus; menschliche Antwortbefehle schlagen im Agentenmodus fehl und Agenten-Genehmigungsbefehle schlagen im menschlichen Modus fehl. Die Quittungsverifizierung überprüft erneut Review, Seite und Medien-Hashes. Regenerierte Quelle, Kandidat, Transkript, Seite, Frage, Frame oder genehmigte Kandidaten-Artefakte machen die Genehmigung ungültig.

Kanonischer Plan

python "$SkillRoot\scripts\plan.py" `
  --out $ShortsWork --project-root $ProjectRoot

work/shorts/shorts-plan.json verwendet die Ganzzahl schema_version: 1. Es zeichnet auf:

  • target: derived, timebase: program und timeline_id;
  • delivery_status: awaiting_main_render während der Planung;
  • die für die Kandidatenüberprüfung verwendeten Projektquell- und Zeitleistenbindungen;
  • genaue depends_on / based_on Revisionen aus der aktiven Hauptsequenz;
  • Auswahlmodus, Begründung, Auslieferungsmodus und Überprüfungs-ID;
  • stabile Kurzclip-IDs;
  • explizite program_range und abgebildete source_ranges;
  • Bewertungs-/redaktionelle Beweise, genehmigte Füller-Drops und Programmzeit-Haltebereiche;
  • Arbeits-Transkript-/Berichtspfade und ../final/shorts/*.mp4 Auslieferungspfade.

Der erste Lauf ist das Ende der Planungsphase. Halten Sie hier an und fahren Sie mit den angeforderten Untertiteln, Inhaltskarten, Grafikanimationen und anderen verbleibenden Hauptsequenzoperationen in kanonischer Reihenfolge fort. Führen Sie extract_shorts.py nicht aus und erstellen Sie kein final.mp4 mit diesem Skill.

Nachdem der gemeinsame Renderer final/final-video.mp4 verifiziert hat, führen Sie denselben plan.py-Befehl erneut aus. Er validiert die genehmigte Projektquelle und Zeitleiste erneut, aktualisiert die vollständigen altiven Operationsrevisionen, fügt den verifizierten Haupt-Render-Fingerabdruck hinzu und setzt delivery_status: ready. Eine Zeitleistenänderung erfordert neue Kandidaten und Genehmigung; Pixel-nur-Operationen wie Inhaltskarten und Untertitel tun dies nicht.

Die Qualifikation bleibt deterministisch: Bewertung mindestens 70, Vollständigkeit mindestens 15, geschätzte Ausgabedauer 20-90 Sekunden, gültiger genauer Auszug, keine Überlappung von mehr als 50% mit einem höher bewerteten Kurzclip und höchstens fünf Ausgaben, sofern nicht konfiguriert.

Nur isolierte, semantisch leere Zögerungswörter mit sicheren Wortgrenzen dürfen als Füller-Drops genehmigt werden. Abgelehnte/unsichere Bereiche verbleiben mit Gründen im Plan. Die Gesamtentfernung darf 15% nicht überschreiten und kein Haltebereich darf kürzer als 0,15 Sekunden sein.

Horizontale Extraktion

python "$SkillRoot\scripts\extract_shorts.py" `
  --video $FinalVideo --out $ShortsWork `
  --project-root $ProjectRoot

Vor der Extraktion überprüft das Skript den Main-Render-Fingerabdruck, den Projekt-Render-Status, die vollständige aktuelle Hauptoperationsliste und Revisionen, die Kandidatenquittung, den genehmigten Kandidaten-Hash und das Quellvideo. Ein awaiting_main_render-Plan wird abgelehnt. Jeder Haltebereich wird zu seiner eigenen gesuchten -ss/-t/-i Eingabe; ffmpeg verkettet diese Eingaben und führt eine H.264/AAC-Kodierung durch. Es dekodiert das vollständige Hauptvideo nicht einmal pro Haltebereich.

Das ausgewählte endgültige Transkriptwort und der Medien-Schnittendpunkt sind separate Grenzen. Die Extraktion bewahrt mindestens 0,25 Sekunden Release-Audio nach dem ausgewählten Inhalt und zielt auf 0,30 Sekunden ab. --no-refine-boundaries deaktiviert nur das semantische Phraseneinrasten; es deaktiviert niemals den obligatorischen Release-Griff. Wenn die Quelle endet, bevor der erforderliche Griff bewahrt werden kann, schlägt die Extraktion fehl, anstatt den Kurzclip als verifiziert zu markieren.

Das kurzclip-bezogene Transkript schließt gelöschte Wörter aus, verschiebt spätere Wörter auf eine kontinuierliche, nullbasierte Uhr und behält Eingabeprogramm-/Quellbeweise bei. Horizontale Medien gehen direkt nach final/shorts; Arbeit enthält nur ihr Transkript und ihren Bericht.

Vertikale Planung

Die vertikale Auslieferung beginnt mit dem genehmigten horizontalen Output. Generieren Sie dichte visuelle Beweise bei 1 Sekunde oder 0,5 Sekunden, wenn Bewegung dies erfordert. Überprüfen Sie jedes Blatt und verfassen Sie eines von:

  • STATIC_CROP: ein stabiler, fester 9:16-Zuschnitt.
  • SCENE_CROP: szenenbegrenzte feste Zuschnitte, mit LETTERBOX nur für Szenen, die vollständige horizontale Informationen benötigen.
  • LETTERBOX: vollständige scharfe Vordergrund über einer unscharfen/abgedunkelten Füllung.
  • REVIEW_REQUIRED: Beweise können keine deterministischen festen Zuschnitte unterstützen; formales Rendern wird blockiert.

Präsentatorszenen sollten den Kopf und Oberkörper stabil und groß halten. Folien, Produkte, Gruppen und Diagramme müssen wesentliche Informationen behalten. Beanspruchen Sie keine kontinuierliche Verfolgung. Zuschnittsänderungen gehören an Szenengrenzen.

Jedes Plansegment deckt die Kurzclip-Zeitleiste vollständig ab, hat eine Strategie, c

…

[gekürzt für die Übersetzung]

Individual skills in this repo

This repo contains 8 individual skills — each has its own dedicated page.

Verwandte Skills