Communitygithub.com

clipwise

Utilisez cette compétence lorsque l'utilisateur fournit un fichier vidéo ou un lien et souhaite en extraire des Shorts/Reels/TikToks. Elle récupère et transcrit localement, vous sélectionnez les meilleurs moments de 10 à 50 secondes avec une grille d'évaluation, l'utilisateur approuve, puis elle produit des clips 9:16 avec recadrage suivi du visage, sous-titres mot par mot, effets sonores, musique optionnelle avec ducking et audio à -14 LUFS, ainsi que titres et hashtags.

Qu'est-ce que clipwise ?

clipwise est un outil local de découpage de vidéos longues en formats courts verticaux (Shorts, Reels, TikToks). Il fonctionne entièrement sur la machine de l'utilisateur (CPU suffisant, CUDA utilisé si disponible) et ne nécessite aucun service cloud. La compétence guide l'utilisateur à travers un flux de travail en six étapes : préparation (téléchargement et transcription), sélection des moments clés à l'aide d'une grille d'évaluation des caractéristiques virales, approbation par l'utilisateur, rendu avec suivi du visage, sous-titres mot par mot, effets sonores et musique optionnelle, inspection visuelle et livraison. Elle prend en charge les téléchargements depuis YouTube, les fichiers locaux, la transcription multilingue, des options de mise en page flexibles (recadrage, padding), et produit des clips optimisés pour les plateformes sociales (1080x1920, 30 fps, H.264, AAC, -14 LUFS). Des contrôles de qualité rigoureux (synchronisation A/V, placement des sous-titres, couverture du visage) et des avertissements contre le bourrage de contenu faible garantissent des résultats professionnels.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/RajkumarDake/clipwise/tree/main/clipwise

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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

  1. Préparation (téléchargement + transcription, une seule commande) :
    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]
    
    Sortie dans le dossier de la tâche : 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) texte par segment, en secondes SOURCE), transcript.json, words.tsv. Pour les longues vidéos, utilisez --start/--max-seconds sur la partie à découper ; la transcription prend environ 0,6 à 1 fois la durée réelle sur CPU.
  2. Sélectionnez vous-même les moments. Lisez transcript.txt (et toute ligne # WARNING en haut) avec SKILL_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.
  3. 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.
  4. Rendu :
    python3 SKILL_DIR/scripts/run.py render --job <nom> [--fast] [--only 2] [--music bed.mp3]
    
    Par sélection dans <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.
  5. Examinez chaque clip_<id>_sheet.png avec 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>.
  6. Livrez les chemins des MP4 et le contenu des .txt. Proposez run.py clean --job <nom> (supprime source.mp4 et les dossiers temporaires, conserve out/).

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 sourceShorts
    moins de 5 min1-2
    5-15 min3-5
    15-45 min5-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

optioneffet
--fastx264 ultrafast CRF 24, échantillonnage du visage à 4 ips (aperçu). Par défaut : preset faster, CRF 20
--only IDrend une seule sélection (répétable)
`--layout autocrop
--music FICHIERfond musical fourni par l'utilisateur, environ 17 LU sous la voix, avec ducking par compression sidechain. --music-db 20 = plus silencieux
--sfx-dir DOSSIERutilisez 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-cutdésactive ces options
--font "Lato Black", --font-size 84, `--highlight yellowgreen, --no-upper`
--preset, --crf, --keep-tmpremplacements 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)

étapemesuré
téléchargement : 85 Mo 1080p VP9 web + réencodage fenêtre de 3 min en H.2647,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 anglais110 s ASR (0,61x temps réel) + 19 s chargement du modèle
rendu par défaut, clip de 40,6 s85 s
rendu --fast, clip de 26,4 s / clip pad de 17,1 s32 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 ; small boucle 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à).

Skills associés