clipwise: langes Video -> vertikale Shorts
Alles läuft lokal (CPU ist ausreichend; CUDA wird für die Transkription verwendet, falls vorhanden).
SKILL_DIR bezeichnet den Ordner, in dem sich diese Datei befindet. Alle Befehle sind
python3 SKILL_DIR/scripts/run.py ...; die Skripte wechseln selbstständig in die clipwise-Venv.
Jobs werden nach ~/clipwise-work/<job>/ ($CLIPWISE_WORK) oder mit --workdir DIR geschrieben.
0. Setup-Prüfung (jede Sitzung, einmalig)
python3 SKILL_DIR/scripts/run.py check
Es muss mit ready enden. Falls nicht, teilen Sie dem Benutzer mit, dass clipwise ein einmaliges Setup benötigt (ca.
2 GB: Python-Pakete plus das Whisper-Modell), bitten Sie ihn, SKILL_DIR/setup.sh zu lesen und
bash SKILL_DIR/setup.sh auszuführen, sobald er zustimmt. Fehlt ffmpeg oder Python 3.10+: setup.sh gibt den
Installationsbefehl für das jeweilige Betriebssystem aus; installieren Sie keine Systempakete ohne Rückfrage.
Arbeitsablauf
- Vorbereitung (herunterladen + transkribieren, ein Befehl):
Ausgabe im Job-Ordner:python3 SKILL_DIR/scripts/run.py prep "<Pfad oder Link>" --job <Name> [--start S --max-seconds N] [--cookies cookies.txt] [--model large-v3-turbo] [--language xx]source.mp4(erstes Video + Audio-Stream, SDR, CFR 30 bei Neukodierung),probe.json,transcript.txt(eine[Start-Ende] (wN) Text-Zeile pro Segment, QUELL-Sekunden),transcript.json,words.tsv. Bei langen Videos verwenden Sie--start/--max-secondsfür den zu clippenden Teil; die Transkription dauert auf CPU etwa 0,6-1x Echtzeit. - Wählen Sie selbst die Momente aus. Lesen Sie
transcript.txt(und alle# WARNING-Zeilen oben) mitSKILL_DIR/references/viral-rubric.md. Schreiben Sie<job>/picks.json: jeder Pick 10-50 s, zuerst der Hook, sauberes Payoff-Ende. Wie viele: siehe Regel unten. - Holen Sie die Genehmigung vor dem Rendern ein. Zeigen Sie eine Zeile pro Pick: Zeitstempel, Hook, Titel, Einzeiler warum. Das Rendern dauert auf einer kleinen CPU etwa 1-2 Minuten pro Clip. Wenn Sie Untertitel manuell geschrieben haben (nicht-englische oder gemischtsprachige Rede), zeigen Sie auch diese Zeilen.
- Rendern:
Pro Pick inpython3 SKILL_DIR/scripts/run.py render --job <Name> [--fast] [--only 2] [--music bed.mp3]<job>/out/:clip_<ID>.mp4,clip_<ID>.txt(Titel, Beschreibung, angepinntes Kommentar, Hashtags, warum),clip_<ID>.json(Probe-Zahlen, Layout, Gesichtsbedeckung, SFX, Timings),clip_<ID>_cutmap.json,clip_<ID>_sheet.png.--fast= Vorschauqualität. - Betrachten Sie jedes
clip_<ID>_sheet.pngmit Ihrem Bild-/Visionstool (10 Frames; rote Linie = y 1620, Plattform-UI darunter). Prüfen Sie: Gesicht im Bild, Untertitel lesbar, Untertitel nicht auf dem Gesicht, nichts Wichtiges unter der roten Linie, Farbe nicht ausgewaschen. Korrigieren Sie (Picks, Untertitel-Überschreibungen,--layout,--font-size) und rendern Sie mit--only <ID>neu. - Übergeben Sie die MP4-Pfade und die
.txt-Inhalte. Bieten Sierun.py clean --job <Name>an (löschtsource.mp4und tmp-Verzeichnisse, behältout/).
Wie viele Shorts pro Video
-
Der Benutzer hat eine Zahl genannt ("Mache 5 Shorts aus "): machen Sie genau diese Anzahl. Wenn das Video nicht so viele starke Momente hat, sagen Sie das vor dem Rendern und schlagen Sie die ehrliche Zahl vor ("Ich habe 3 Momente gefunden, die die Checkliste bestehen; die anderen 2 wären schwach").
-
Keine Zahl genannt: skalieren Sie mit der Länge der Quelle (oder des transkribierten Fensters):
Quelllänge Shorts unter 5 min 1-2 5-15 min 3-5 15-45 min 5-8 45 min+ (Podcast, Vortrag) 8-15 -
Es zählen nur Momente, die die Rubrik-Checkliste bestehen. Füllen Sie nie mit schwachen Clips auf, um eine Zahl zu erreichen.
picks.json (minimal)
[{"id": "1", "start": 65.5, "end": 110.3, "title": "Wird jede Überschwemmung durch den Klimawandel verursacht?",
"hook_start": 74.85, "hook_end": 80.1, "payoff_start": 102.0,
"why": "Zuerst unerwartete Behauptung, wird am Ende aufgelöst.", "comment_bait": "Wusstest du das?",
"description": "...", "hashtags": ["#shorts", "#climate"],
"caption_overrides": [{"w": 219, "text": ""}, {"start": 90.1, "end": 92.4, "text": "exakte Wörter hier"}]}]
Erforderlich: id, start, end (Quell-Sekunden). hook_start/hook_end verschiebt eine 2-3 s lange Zeile nach
vorne ("hook_mode": "repeat" behält sie auch im Hauptteil). payoff_start platziert den tiefen
Ton. caption_overrides: {"w": N, "text": ""} bearbeitet/löscht Wort N ((wN) in
transcript.txt, i in words.tsv); {"start", "end", "text"} ersetzt alle Wörter in diesem Bereich.
Vollständiges Schema und Bewertung: references/viral-rubric.md.
Render-Flags
| Flag | Wirkung |
|---|---|
--fast | x264 ultrafast CRF 24, 4 fps Gesichtserfassung (Vorschau). Standard: preset faster, CRF 20 |
--only ID | nur einen Pick rendern (wiederholbar) |
| `--layout auto | crop |
--music DATEI | benutzerbereitgestellter Musik-Background, etwa 17 LU unter der Stimme, durch Sidechain-Kompression geduckt. --music-db 20 = leiser |
--sfx-dir VERZ | verwenden Sie Ihre eigenen whoosh_fast, whoosh_soft, thud_low, pop, tick (.wav/.mp3/.flac/.ogg) anstelle der synthetisierten |
--no-sfx, --no-silence-cut | diese ausschalten |
--font "Lato Black", --font-size 84, `--highlight yellow | green, --no-upper` |
--preset, --crf, --keep-tmp | Encoder-Überschreibungen; Voice/Mix-WAVs und captions.ass zu Debugging-Zwecken behalten |
Umgebung: CLIPWISE_HOME (Standard ~/.clipwise), CLIPWISE_VENV, CLIPWISE_WORK,
CLIPWISE_MODEL (Standard large-v3-turbo), CLIPWISE_DEVICE (auto|cpu|cuda).
Was das Rendern pro Pick macht
Hook nach vorne verschoben, Stille > 0,35 s geschnitten (Schwelle basierend auf den eigenen Sprach-/Geräuschpegeln des Clips), verbleibende Teile auf das 30-fps-Raster gerastert, sodass Audio-Samples den Frames entsprechen. Gesichtsverfolgung mit YuNet auf den nach dem Schnitt verbleibenden Frames: dominantes Gesicht, klebrig (ein neues Gesicht muss 1,6x größer sein und 1,2 s bestehen, um zu übernehmen), sanfte Kamera mit einer Totzone, Schnappschüsse nur bei Schnitten. Punch-In-Zoom 1.0/1.12 alle 2-4 s. Wort-für-Wort-ASS-Untertitel (maximal 4 Wörter, aktives Wort hervorgehoben) unterhalb des Kinns und oberhalb von y 1620 platziert. Sprachbereinigung, synthetisierte SFX, optionale geduckte Musik, zwei Durchgänge loudnorm auf -14 LUFS / -1,5 dBTP. H.264 + AAC 48 kHz, 1080x1920, 30 fps. Endgültige A/V-Stream-Dauern werden überprüft.
Gemessene Zeiten (2-Kern-CPU, keine GPU)
| Schritt | gemessen |
|---|---|
| Fetch: 85 MB 1080p VP9 Web-Download + 3 min Fenster-Neukodierung auf H.264 | 7,7 min insgesamt (Download dominiert, etwa 5 min) |
| Fetch: 20 s 10-Bit-HDR-iPhone-Clip (Tone-Map + CFR) | 45 s (HDR kostet etwa das 2,3-fache der Dauer) |
| Transkribieren large-v3-turbo, 3 min Englisch | 110 s ASR (0,61x Echtzeit) + 19 s Modell-Ladezeit |
| Rendern Standard, 40,6 s Clip | 85 s |
Rendern --fast, 26,4 s Clip / 17,1 s Pad-Clip | 32 s / 30 s |
Fallstricke
- YouTube-Bot-Wall ("Melden Sie sich an, um zu bestätigen, dass Sie kein Bot sind"): gelegentlich, IP-abhängig.
fetch beendet mit Exit-Code 3. Bitten Sie den Benutzer um
--cookies cookies.txt(aus dem Browser exportiert) oder die Datei selbst / einen Drive- oder Dropbox-Link. Wiederholen Sie keine yt-dlp-Player-Clients oder Proxys. Private Drive-Links beenden mit Exit-Code 2: Bitten Sie um Freigabe für "jeder mit dem Link" oder eine lokale Datei. - A/V-Synchronisation ist eine harte Regel. Jede Ausgabe-Audio- und Video-Stream-Dauer muss innerhalb
von 0,1 s übereinstimmen (das Rendern prüft dies). Schneiden Sie niemals mit Stream-Kopie an einem Nicht-Null-Start, schneiden Sie niemals
Audio mit
aselect; verwenden Sie die Skripte. - ASR-Rezept ist festgelegt: Normalisieren Sie zuerst das Audio, erkennen Sie die Sprache automatisch, kein VAD, kein
initial_prompt(es gelangt in das Transkript). Behalten Sie large-v3-turbo;smallwiederholt sich und halluziniert bei akzentuierter oder gemischtsprachiger Rede (die Transkription warnt vor Wiederholungen). - Nicht-englische Sprache kann übersetzt zurückkommen. Für viele Sprachen, die in einer
nicht-lateinischen Schrift geschrieben werden (und für gemischtsprachige Rede) gibt Whisper Englisch zurück. Das Transkript
dient dann nur als Zeit- und Bedeutungsanleitung: Schreiben Sie die Untertitelzeilen in der eigenen Sprache des Sprechers
und Schrift mit
caption_overrides{"start", "end", "text"}-Bereichen und zeigen Sie diese dem Benutzer vor dem Rendern. Titel und Hashtags folgen ebenfalls der Sprache des Sprechers. - Untertitel: niemals über dem Gesicht und oberhalb der unteren ~300 px (Plattform-UI). Wenn das
Sheet einen Konflikt zeigt, kürzen Sie den Pick, verwenden Sie
--layout padoder verkleinern Sie--font-size. - Tracker folgt dem größten Gesicht, nicht dem Sprecher. Verwenden Sie bei zwei Personen, die in einer
breiten Aufnahme sprechen,
--layout padoder wählen Sie ein Fenster, in dem eine Person spricht. - Hochskalierung: Eine 1080p 16:9-Quelle wird auf 608x1080 beschnitten und 1,8x skaliert; 720p-Quellen werden 2,7x skaliert und sehen weich aus. Bevorzugen Sie 1080p+-Downloads.
- Kleine CPUs: Führen Sie niemals zwei Kodierungen oder Transkription und eine Kodierung gleichzeitig aus; das Rendern verarbeitet Picks nacheinander (run.py macht das bereits).