clipwise : vidéo longue -> Shorts verticaux
Tout s'exécute localement (le CPU suffit ; CUDA est utilisé pour la transcription lorsqu'il est présent).
SKILL_DIR ci-dessous désigne le dossier dans lequel se trouve ce fichier. Toutes les commandes sont
python3 SKILL_DIR/scripts/run.py ... ; les scripts basculent eux-mêmes dans le venv clipwise.
Les tâches sont écrites dans ~/clipwise-work/<job>/ ($CLIPWISE_WORK), ou dans --workdir DIR.
0. Vérification de l'installation (chaque session, une fois)
python3 SKILL_DIR/scripts/run.py check
Elle doit se terminer par ready. Si ce n'est pas le cas, informez l'utilisateur que clipwise nécessite une installation unique (environ
2 Go : paquets Python plus le modèle whisper), demandez-lui de lire SKILL_DIR/setup.sh, et
exécutez bash SKILL_DIR/setup.sh une fois qu'il a accepté. Si ffmpeg ou Python 3.10+ manquent, setup.sh affiche
la commande d'installation pour son OS ; n'installez pas de paquets système sans demander.
Flux de travail
- Préparation (téléchargement + transcription, une seule commande) :
Sortie dans le dossier de la tâche :python3 SKILL_DIR/scripts/run.py prep "<chemin ou lien>" --job <nom> [--start S --max-seconds N] [--cookies cookies.txt] [--model large-v3-turbo] [--language xx]source.mp4(première piste vidéo + audio, SDR, CFR 30 lors du réencodage),probe.json,transcript.txt(une ligne[début-fin] (wN) textepar segment, en secondes SOURCE),transcript.json,words.tsv. Pour les longues vidéos, utilisez--start/--max-secondssur la partie à découper ; la transcription prend environ 0,6 à 1 fois la durée réelle sur CPU. - Sélectionnez vous-même les moments. Lisez
transcript.txt(et toute ligne# WARNINGen haut) avecSKILL_DIR/references/viral-rubric.md. Écrivez<job>/picks.json: chaque sélection dure 10 à 50 s, accroche en premier, fin propre avec payoff. Combien : voir la règle ci-dessous. - Obtenez l'approbation avant le rendu. Montrez une ligne par sélection : timestamps, accroche, titre, justification en une ligne. Le rendu coûte environ 1 à 2 minutes par clip sur un petit CPU. Si vous avez écrit le texte des sous-titres à la main (parole non anglaise ou mélangée), montrez ces lignes aussi.
- Rendu :
Par sélection danspython3 SKILL_DIR/scripts/run.py render --job <nom> [--fast] [--only 2] [--music bed.mp3]<job>/out/:clip_<id>.mp4,clip_<id>.txt(titre, description, commentaire épinglé, hashtags, pourquoi),clip_<id>.json(numéros de sonde, disposition, couverture du visage, SFX, timings),clip_<id>_cutmap.json,clip_<id>_sheet.png.--fast= qualité d'aperçu. - Examinez chaque
clip_<id>_sheet.pngavec votre outil d'image/vision (10 images ; ligne rouge = y 1620, interface de la plateforme en dessous). Vérifiez : visage dans le cadre, sous-titres lisibles, sous-titres non sur le visage, rien d'important sous la ligne rouge, couleurs non délavées. Corrigez (sélections, remplacements de sous-titres,--layout,--font-size) et re-rendez avec--only <id>. - Livrez les chemins des MP4 et le contenu des
.txt. Proposezrun.py clean --job <nom>(supprimesource.mp4et les dossiers temporaires, conserveout/).
Combien de Shorts par vidéo
-
L'utilisateur a indiqué un nombre ("Fais 5 Shorts à partir de ") : faites exactement ce nombre. Si la vidéo n'a pas assez de moments forts, dites-le avant le rendu et proposez le nombre honnête ("J'ai trouvé 3 moments qui passent la checklist ; les 2 autres seraient faibles").
-
Pas de nombre donné : adaptez à la durée de la source (ou de la fenêtre transcrite) :
durée de la source Shorts moins de 5 min 1-2 5-15 min 3-5 15-45 min 5-8 45 min+ (podcast, talk) 8-15 -
Seuls les moments qui passent la checklist de la grille d'évaluation comptent. Ne bourrez jamais avec des clips faibles pour atteindre un nombre.
picks.json (minimal)
[{"id": "1", "start": 65.5, "end": 110.3, "title": "Est-ce que chaque inondation est causée par le changement climatique ?",
"hook_start": 74.85, "hook_end": 80.1, "payoff_start": 102.0,
"why": "Affirmation inattendue d'abord, résolue à la fin.", "comment_bait": "Le saviez-vous ?",
"description": "...", "hashtags": ["#shorts", "#climat"],
"caption_overrides": [{"w": 219, "text": ""}, {"start": 90.1, "end": 92.4, "text": "mots exacts ici"}]}]
Requis : id, start, end (secondes source). hook_start/hook_end déplace une ligne de 2-3 s au
début ("hook_mode": "repeat" la conserve aussi dans le corps). payoff_start place le bruit sourd bas.
caption_overrides : {"w": N, "text": ""} édite/supprime le mot N ((wN) dans
transcript.txt, i dans words.tsv) ; {"start", "end", "text"} remplace tous les mots dans cet intervalle.
Schéma complet et notation : references/viral-rubric.md.
Options de rendu
| option | effet |
|---|---|
--fast | x264 ultrafast CRF 24, échantillonnage du visage à 4 ips (aperçu). Par défaut : preset faster, CRF 20 |
--only ID | rend une seule sélection (répétable) |
| `--layout auto | crop |
--music FICHIER | fond musical fourni par l'utilisateur, environ 17 LU sous la voix, avec ducking par compression sidechain. --music-db 20 = plus silencieux |
--sfx-dir DOSSIER | utilisez vos propres whoosh_fast, whoosh_soft, thud_low, pop, tick (.wav/.mp3/.flac/.ogg) au lieu de ceux synthétisés |
--no-sfx, --no-silence-cut | désactive ces options |
--font "Lato Black", --font-size 84, `--highlight yellow | green, --no-upper` |
--preset, --crf, --keep-tmp | remplacements pour l'encodeur ; conserve les wav voix/mix et captions.ass pour le débogage |
Environnement : CLIPWISE_HOME (par défaut ~/.clipwise), CLIPWISE_VENV, CLIPWISE_WORK,
CLIPWISE_MODEL (par défaut large-v3-turbo), CLIPWISE_DEVICE (auto|cpu|cuda).
Ce que fait le rendu par sélection
Accroche déplacée au début, silences > 0,35 s coupés (seuil basé sur les niveaux de parole/bruit propres au clip), morceaux conservés alignés sur la grille 30 ips pour que les échantillons audio correspondent aux images. Suivi du visage avec YuNet sur les images qui survivent à la coupe : visage dominant, collant (un nouveau visage doit être 1,6x plus grand pendant 1,2 s pour prendre le relais), caméra lissée avec une zone morte, accrochages uniquement sur les coupures. Zoom punch-in 1.0/1.12 toutes les 2-4 s. Sous-titres ASS mot par mot (4 mots max, mot actif surligné) placés sous le menton et au-dessus de y 1620. Nettoyage de la voix, effets sonores synthétisés, musique optionnelle avec ducking, double passe loudnorm à -14 LUFS / -1,5 dBTP. H.264 + AAC 48 kHz, 1080x1920, 30 ips. Les durées finales des flux A/V sont vérifiées.
Chronométrages mesurés (CPU 2 cœurs, sans GPU)
| étape | mesuré |
|---|---|
| téléchargement : 85 Mo 1080p VP9 web + réencodage fenêtre de 3 min en H.264 | 7,7 min au total (téléchargement dominant, environ 5 min) |
| téléchargement : clip iPhone 20 s 10 bits HDR (tone-map + CFR) | 45 s (HDR coûte environ 2,3x la durée) |
| transcription large-v3-turbo, 3 min anglais | 110 s ASR (0,61x temps réel) + 19 s chargement du modèle |
| rendu par défaut, clip de 40,6 s | 85 s |
rendu --fast, clip de 26,4 s / clip pad de 17,1 s | 32 s / 30 s |
Pièges
- Mur anti-bot YouTube ("Connectez-vous pour confirmer que vous n'êtes pas un robot") : intermittent, dépend de l'IP.
fetch se termine avec le code 3. Demandez à l'utilisateur
--cookies cookies.txt(exporté depuis son navigateur) ou le fichier lui-même / un lien Drive ou Dropbox. Ne bouclez pas sur les clients joueurs ou proxys yt-dlp. Les liens Drive privés se terminent avec le code 2 : demandez le partage "toute personne disposant du lien" ou un fichier local. - La synchro A/V est une règle stricte. Les durées des flux audio et vidéo de chaque sortie doivent correspondre
à moins de 0,1 s (le rendu le vérifie). Ne coupez jamais avec stream copy à un début non nul, ne coupez jamais
l'audio avec
aselect; utilisez les scripts. - La recette ASR est fixe : normalisez d'abord l'audio, détection automatique de la langue, pas de VAD, pas de
initial_prompt(cela fuit dans la transcription). Conservez large-v3-turbo ;smallboucle et hallucine sur la parole accentuée ou mélangée (la transcription prévient en cas de boucles). - La parole non anglaise peut revenir traduite. Pour de nombreuses langues écrites dans une
écriture non latine (et pour la parole mélangée), whisper renvoie de l'anglais. La transcription
n'est alors qu'un guide de chronométrage et de sens : écrivez les lignes de sous-titres dans la langue du locuteur
et son écriture avec des plages
caption_overrides{"start", "end", "text"}, et montrez-les à l' utilisateur avant le rendu. Les titres et hashtags suivent également la langue du locuteur. - Sous-titres : jamais sur le visage, et au-dessus d'environ 300 px en bas (interface de la plateforme). Si la
feuille montre un conflit, raccourcissez la sélection, utilisez
--layout pad, ou réduisez--font-size. - Le suivi suit le plus grand visage, pas le locuteur. Pour deux personnes qui parlent dans un
seul plan large, utilisez
--layout pad, ou choisissez une fenêtre où une seule personne parle. - Mise à l'échelle : une source 1080p 16:9 est recadrée en 608x1080 et mise à l'échelle 1,8x ; les sources 720p sont 2,7x et semblent floues. Préférez les téléchargements en 1080p+.
- Petits CPU : n'exécutez jamais deux encodages, ni transcription et encodage, en même temps ; le rendu traite les sélections les unes après les autres (run.py le fait déjà).