Communitygithub.com

video-untertitel-hinzufuegen

Erzeugt zeitlich abgestimmte Untertitel für Videoprojekte, die auf einem Wort-für-Wort-Transkript und einer validierten Timeline basieren.

Was ist video-untertitel-hinzufuegen?

Diese Fähigkeit erstellt professionelle Untertitel für Videoprojekte. Sie nutzt ein validiertes, wortgenaues Transkript und eine kanonische Timeline, um Bild-zu-Programm-Zeiten korrekt zuzuordnen. Der Prozess umfasst die Gruppierung von Untertiteln, die Auswahl von Stilen aus einer Galerie (z. B. clean, minimal, social-bold) und die Erstellung einer transparenten Untertitelspur. Unterstützt werden zwei Präsentationsmodi: „Standard“ für konventionelle Platzierung und „Expressive“ für dynamische Positionierung (unten/zentriert) basierend auf dem semantischen Inhalt. Die Fähigkeit ist mit Claude Code, Cursor und ähnlichen KI-Agenten kompatibel und erfordert ffmpeg/ffprobe, Python mit Pillow und Node.js ≥ 22.

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

In Ihrer bevorzugten KI fragen

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

Dokumentation

Video Untertitel hinzufügen

Abhängigkeiten

/video-understand ist eine Voraussetzung. Führe es zuerst aus, damit die Untertitel das validierte, wortgenaue Transkript und die kanonische Timeline verwenden. Überprüfe vor dem Start, ob es installiert ist. Falls nicht, warne den Benutzer, dass diese Voraussetzung fehlt, und stoppe vor der Medienverarbeitung.

Erfordert ffmpeg/ffprobe im PATH, Python mit Pillow und Node.js >= 22 (für die .mjs-Skripte und npx hyperframes, das bei Bedarf abgerufen wird). hyperframes render/snapshot verwendet einen Headless-Chrome – es verwaltet seinen eigenen chrome-headless-shell und fällt auf einen System-Chrome zurück (setze CHROME, um zu überschreiben), wenn der zwischengespeicherte nicht verwendbar ist. Überprüfe diese vor der Medienverarbeitung.

Umfang

Diese Fähigkeit verwaltet die Gruppierung von Untertiteln, die Stilauswahl, die Überprüfung und die transparente Untertitelspur. Sie führt keine Transkription, Schnitte, Neuskalierung, Gradierung, Neuausrichtung oder Auswahl der Audio-Auslieferungsrichtlinie durch.

Führe Untertitel vor Inhaltskarten und grafischen Bewegungen aus, wenn eine davon ausgewählt ist. Das genehmigte Untertitellayout definiert einen reservierten Untertitelbereich, den beide späteren Operationen freihalten müssen. Diese relative Reihenfolge gilt auch, wenn nur ein Paar aktiv ist.

Verwende zuerst video-understand. Falls ein Schnitt existiert, untertitele die aktive Programm-Timeline; behandle Sekunden des Quelltranskripts nicht als Programmsekunden.

Protokolleingaben

Erforderlich:

  • work/project.json
  • work/understand/transcript.json, mit Wort-für-Wort-Quellzeitstempeln
  • work/understand/media.json
  • work/timeline.json
  • das Quellvideo, benannt in work/project.json

Die Timeline ist die einzige Abbildung von Quelle zu Programm. Alle Bereiche sind halboffen [start_s, end_s). scripts/build_captions.py verwendet die gemeinsame projectlib.map_transcript_to_timeline; Wörter in entfernten Quellbereichen verschwinden, beibehaltene Wörter verschieben sich in die Programmzeit, und Cues enden immer an Clip-Grenzen.

Dauerhafte Ausgaben

work/captions/
|-- captions-plan.json
|-- caption-spatial-context.json (nur für berechtigte B-Roll-Composites)
`-- caption-interaction.json
work/cache/captions/
|-- preview-project/
|-- preview-snapshots/
|-- overlay-project/
`-- overlay-frames/frame_000001.png ...
review/05-captions/
|-- captions.srt
|-- captions-style-review-<UUID>.html
|-- captions-style-review.html
|-- captions-review.html
|-- preview-early.png
|-- preview-middle.png
|-- preview-late.png
|-- preview-no-caption.png
|-- captions-evidence.json
`-- captions-summary.md

Generiertes HTML, kopierte Laufzeitdateien, extrahierte Quellframes und Overlay-Frames sind Cache. Der Plan, optionaler räumlicher Kontext, SRT, Entscheidungsbeleg und Überprüfungsnachweise sind dauerhaft.

Untertitel-Plan

work/captions/captions-plan.json ist der kanonische Untertitel-Plan, zielt auf overlay ab und verwendet die Programmzeit. Er zeichnet auf:

  • timeline_id, program_duration_s und den Pfad zum Quelltranskript;
  • Einstellungen für die Cue-Gruppierung;
  • genehmigten Stil, Entscheidungsmodus, Begründung, Galerieauswahl und vollständigen aufgelösten Stil;
  • quellgestützte Überprüfungsnachweise und Genehmigungsakteur;
  • Cues mit Kompatibilitätsfeldern start, end, text, lines und words;
  • program_range und source_ranges für jeden Cue;
  • Programm-/Quellbereiche und clip_id für jedes zugeordnete Wort;
  • ein lokales Renderer-Rezept mit exakter rationaler FPS und gehashten Laufzeit-Assets.

Der Generator akzeptiert auch das alte Cue-Array der obersten Ebene. Dies ist nur ein eigenständiger Kompatibilitätsadapter; er kann keine Timeline-Herkunft ausdrücken oder einen genehmigten Protokollbeitrag neu generieren.

Standard ist der standardmäßige Präsentationsmodus. Standard-Pläne benötigen kein presentation-Feld und dürfen nicht nur migriert werden, um eines hinzuzufügen. Expressive ist ein expliziter Präsentationsmodus, kein Preset: Fordere ihn mit --presentation-mode expressive an. Der Build-Schritt fügt dann stabile Cue-IDs, Standard-Wort-semantic_role-Werte und einen Entwurf einer presentation-Planungshülle hinzu; er errät keine Layout-Varianten.

Expressive unterstützt nur bottom-standard und center-emphasis. Lese reference/caption-rules.md, bevor du die Hülle füllst. Der vorhandene Renderer konsumiert nur abgeschlossene presentation.layout_beats; er inferiert keine Positionen oder ändert das Layout innerhalb eines Beats.

Expressive Cues können auch eine zusammenhängende Phrasenebenen-hero_line definieren. Verwende das kanonische level: hero; es rendert die Phrase gold auf einer eigenen Zeile in 1.5x. Legacy level: strong bleibt als Eingabealias akzeptiert und rendert identisch, aber neue von Agenten erstellte Pläne dürfen es nicht ausgeben. Die gepflegten Wortrollen keyword, number und contrast verwenden jeweils 1.22x; normal bleibt 1.0x. Diese Behandlungen sind orthogonal zu Presets und erstellen keine neuen Stil-IDs. Lese reference/caption-rules.md für das Schema, die Überlaufrichtlinie und die Karaoke-Regeln.

Wenn ein aktiver, überprüfter B-Roll-Vorgang genehmigte oder verifizierte Sprecher-Einblendungs-Composites enthält, können Untertitel caption-spatial-context.json aus dem eingefrorenen vorgelagerten Plan, den Nachweisen, normalisierten Composites und explizitem Subshot-display_mode ableiten. Dies ändert oder wählt das B-Roll-Layout nicht neu aus. Es richtet Cue-Grenzen vor der Expressive-Planung aus und löst nur die gepflegten Platzierungen preset-bottom, frame-center, panel-center und grenzenbeschränktes panel-bottom auf. panel-bottom ist nur für eine unsplittable_word_boundary neben einem unteren, zentrierten Panel erlaubt; es zentriert den stabilen Cue innerhalb des reservierten Streifens unter dem strukturierten Sprecher-Rechteck. Ein solcher Cue wird gegen jeden visuellen Kontext geprüft, den er schneidet, nicht nur den Kontext, der den Wortmittelpunkt enthält. Ohne diesen Kontext bleibt alles vorhandene Standard- und Expressive-Platzierungsverhalten unverändert.

Stile

Gepflegte Presets sind clean, minimal, social-bold, pill, boxed, stroked und shorts. Galerie-Kombinations-IDs fügen gepflegte Themen hinzu, zum Beispiel pill-yellow, stroked-blue und shorts-green. Karaoke ist eine Option, kein separates Preset.

Standardmäßige delegierte Wahl: clean, Karaoke aus. Wähle ein expressiveres Preset nur, wenn das Ziel oder das Filmmaterial es rechtfertigt. Speichere auftragsspezifische Änderungen in einem Overrides-JSON; bearbeite den Generator nicht für gewöhnliches Stil-Feedback.

Expressive unterstützt sowohl semantic-only (Karaoke aus) als auch semantic-plus-karaoke (Karaoke an). Semantische Hervorhebung bleibt in beiden Konfigurationen für den gesamten Cue bestehen. Im Koexistenzmodus verwenden semantische Hervorhebung und das aktive Karaoke-Wort style.wordHighlight.activeColor als Vordergrundfarbe in jedem Hervorhebungsmodus; eine Hintergrundhervorhebung bleibt ein zusätzlicher Effekt. Die effektive Skalierung ist max(semantische Skalierung, Karaoke-Aktiv-Skalierung), niemals deren Produkt. Expressive rendert niemals eine Unterstreichung, einschließlich für die kompatible semantische Rolle contrast.

Der bestehende Überprüfungsvertrag verwendet weiterhin semantic-only als primären Expressive-Nachweis und bindet semantic-plus-karaoke separat. Das Kompatibilitäts-Payload-Feld bleibt experimental_comparison benannt; benenne es nicht ohne eine Genehmigungsprotokoll-Migration um.

Lies:

  • reference/caption-rules.md vor dem Ändern von Gruppierungsgrenzen;
  • reference/caption-style-themes.md für Stilvokabular;
  • reference/caption-feedback-mapping.md für die Überschreibungszuordnung.

Entscheidungsmodi

Zwei ehrliche Modi teilen dieselbe hash-gebundene Zustandsmaschine:

  • human: Übergib die exakte kopierte Galeriezusammenfassung an select, zeige alle echten Vorschaunachweise und übergib die exakte kopierte Genehmigungs- oder Überarbeitungszusammenfassung an confirm oder adjust. An die Überprüfungsseite gebundene Befehle akzeptieren keine bloßen Genehmigungsphrasen.
  • agent: Verwende nur, wenn der Benutzer Untertitelentscheidungen explizit delegiert. Beginne mit einer nicht-leeren Delegationsnotiz, dann verwende agent-select und agent-confirm mit nicht-leeren Begründungen.

Menschliche Befehle schlagen im Agentenmodus fehl und Agentenbefehle schlagen im menschlichen Modus fehl. Standard ohne räumlichen Kontext erfordert die vier gepflegten quellgestützten Bilder; Expressive- und Composite-bewusste Überprüfungen verwenden ihre dynamischen Nachweisverträge. Eine Änderung der Quelle, des Plans, der Timeline, des Stils, der Überschreibung, der Projektmetadaten, der Überprüfungsseite oder der Nachweise macht die Genehmigung ungültig; räumlicher Kontext, vorgelagerte B-Roll-Überarbeitung oder gebundene Composite-Änderungen tun dasselbe. Baue die betroffenen Artefakte neu und überprüfe sie erneut.

Kanonischer Workflow

Führe vom Repository-Stamm aus. Setze Projektpfade:

$RepoRoot = (Resolve-Path ".").Path
$SkillRoot = Join-Path $RepoRoot "skills\video-add-captions"
$ProjectRoot = (Resolve-Path "<projekt-wurzel>").Path
$Work = Join-Path $ProjectRoot "work"
$SourceVideo = "<absoluter pfad aus work/project.json>"
$Plan = Join-Path $Work "captions\captions-plan.json"
$SpatialContext = Join-Path $Work "captions\caption-spatial-context.json"
$SpatialArgs = @()
$SpatialReviewArgs = @()
$Receipt = Join-Path $Work "captions\caption-interaction.json"
$Review = Join-Path $ProjectRoot "review\05-captions"
$Cache = Join-Path $Work "cache\captions"
$PreviewProject = Join-Path $Cache "preview-project"
$ComparisonProject = Join-Path $Cache "preview-project-expressive-karaoke"
$OverlayProject = Join-Path $Cache "overlay-project"
$OverlayFrames = Join-Path $Cache "overlay-frames"
New-Item -ItemType Directory -Force -Path (Split-Path $Plan),$Review,$Cache | Out-Null

Bevor du den Untertitel-Plan erstellst, frage den Benutzer nach dem Präsentationsmodus, es sei denn, die aktuelle Anfrage wählt bereits explizit einen aus. Gib die Frage in der aktuellen Konversationssprache des Benutzers wieder, während die Bezeichner Standard und Expressive unübersetzt bleiben. Behalte die englische Quellaufforderung unten in dieser Datei, präsentiere die lokalisierte Wahl in der aktuellen Sitzung, dann Präsentiere + STOPPE:

Wähle den Untertitel-Präsentationsmodus:

1. Standard: Verwendet stabile konventionelle Platzierung und eignet sich für die meisten Inhalte.
2. Expressive: Wechselt basierend auf der Bedeutung zwischen unterer und zentrierter Platzierung und hebt Schlüsselwörter und Zahlen hervor.

Antworte mit Standard, Expressive oder "Verwende den Standard (Standard)."

Führe build_captions.py erst aus, wenn der Benutzer antwortet. Wenn der Benutzer die Wahl in irgendeiner Formulierung explizit delegiert, wähle Standard. Gib an, dass Standard als kompatibilitätsbewahrender Standard ausgewählt wurde, bevor du den Plan erstellst.

Erstelle Programmzeit-Cues und die Überprüfungs-SRT:

python "$SkillRoot\scripts\build_captions.py" `
  "$Work\understand\transcript.json" `
  $Plan `
  "$Review\captions.srt" `
  --timeline "$Work\timeline.json" `
  --source-transcript "understand/transcript.json" `
  --max-chars 42 --max-lines 2 --max-dur 6 --gap 0.6

Nachdem der Benutzer Standard ausgewählt hat, erzeugt der obige Befehl den unveränderten Standard-Plan. Nachdem der Benutzer Expressive ausgewählt hat, führe denselben Befehl mit aus:

  --presentation-mode expressive

Nach der Entwurfs-Cue-Generierung überprüfe den aktiven B-Roll-Vorgang und seinen gebundenen Plan schreibgeschützt. Aktiviere die Composite-bewusste Platzierung nur, wenn der Vorgang aktiv ist, sein Status approved oder verified ist, review.status approved ist, die Sprecher-Einblendungs-Analyse-/Agent-Eingabe-/Vorschau-/Freigabe-Bindungen abgeschlossen sind und mindestens ein verifizierter oder normalisierter Shot ein gepflegtes Composite-Layout hat. Der räumliche Builder verwendet expliziten Subshot-display_mode: enabled für die Sprechergeometrie; pure_broll und fehlende Sprechernachweise implizieren niemals ein Sprecher-Rechteck.

Wenn berechtigt, richte Entwurfs-Cues an jeder B-Roll-Visualgrenze aus, bevor du layout_beats oder hero_line füllst. Die Ausrichtung teilt nur an Wortlücken und schreibt atomar zurück; eine Grenze innerhalb eines Wortes behält das Wort ganz und zeichnet obligatorische Überprüfungsnachweise auf:

python "$SkillRoot\scripts\caption_spatial_context.py" align `
  --project-root $ProjectRoot --plan $Plan --out-plan $Plan

Bereite für ein berechtigtes Projekt die optionalen Argumente vor, die von jeder späteren Gate verwendet werden:

$SpatialArgs = @("--spatial-context", $SpatialContext)
$SpatialReviewArgs = @("--spatial-context", $SpatialContext, "--project-root", $ProjectRoot)

Wenn kein berechtigtes Composite existiert, überspringe alle vier räumlichen Befehle und lasse $SpatialArgs und $SpatialReviewArgs leer. Erstelle oder füge keinen leeren Kontext hinzu.

Bevor du mit der Stilauswahl oder der Generierung einer Vorschau beginnst, muss der Agent das gesamte Expressive-Programm in einem Durchgang planen:

  1. Lies das Transkript, verfügbare Verstehensartefakte, die kanonische Timeline, generierte Untertitel-Cues und alle echten Quellframe-Nachweise, die zur Rechtfertigung von Layoutänderungen erforderlich sind.
  2. Fülle alle presentation.layout_beats, annotiere außergewöhnliche Wort-semantic_role-Werte, füge höchstens eine zusammenhängende hero_line mit kanonischem level: hero zu einem Cue hinzu, wenn gerechtfertigt, schreibe eine Begründung pro Beat/Hero-Linie und schreibe die Gesamtbegründung presentation.planner.rationale.
  3. Setze presentation.planning_status auf complete erst, nachdem jeder Cue genau einmal abgedeckt ist.
  4. Validiere den abgeschlossenen Plan vor der Vorschaugenerierung:
python "$SkillRoot\scripts\build_captions.py" --validate-plan $Plan

Erstelle, validiere und füge den Kontext für ein berechtigtes Composite erst an, nachdem die endgültigen Cue-IDs und Expressive-Kandidaten abgeschlossen sind. Dies bewahrt das vorgelagerte Layout und bindet seine aktuelle Revision und Hashes in den Untertitel-Plan:

python "$SkillRoot\scripts\caption_spatial_context.py" build `
  --project-root $ProjectRoot --plan $Plan --out $SpatialContext
python "$SkillRoot\scripts\caption_spatial_context.py" validate `
  --project-root $ProjectRoot --plan $Plan --context $SpatialContext
python "$SkillRoot\scripts\caption_spatial_context.py" attach `
  --project-root $ProjectRoot --plan $Plan --context $SpatialContext

Frage den Benutzer nicht, Cue für Cue eine Position zu wählen. Der Benutzer überprüft die vorhandenen HTML-Nachweise und korrigiert nur eine kleine Anzahl anomaler Beats. Das Starten der Interaktion nach der Planung hält die vorhandene Untertitel-Plan-Hash-Bindung maßgeblich.

Starte einen Entscheidungsmodus. Für den menschlichen Modus veröffentliche die gepflegte Offline-Galerie im Projektüberprüfungsverzeichnis, ohne den Benutzer zu bitten, eine Datei zu finden:

$StartOutput = node "$SkillRoot\scripts\caption_interaction.mjs" start `
  --state $Receipt --source $Plan ...

[Übersetzung abgeschlossen]

Individual skills in this repo

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

Verwandte Skills