Communitygithub.com

businessbaum/vedit

Cette compétence effectue un resserrage mécanique du matériel déjà sélectionné : suppression des silences, des mots de remplissage, des bafouillages et des retakes, tout en préservant la réversibilité.

Qu'est-ce que vedit ?

Cette compétence permet un montage mécanique précis du matériel audio/vidéo déjà découpé en blocs narratifs (story blocks). Elle exécute quatre passes : détection des silences avec conservation de pauses proportionnelles à la ponctuation, suppression automatique des bafouillages (tier A et B), détection des retakes par n-grammes répétés, et nettoyage des coupures. Les décisions sont réversibles via le champ `enabled` dans `project.json`. Elle prend en charge les projets locaux et propose des rapports détaillés sur les coupes effectuées. Idéale pour les podcasts, interviews ou discours, mais ne remplace pas la décision éditoriale de contenu.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/businessbaum/vedit/tree/HEAD/.agents/skills/cut-rough

Demander à votre IA préférée

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

Documentation

cut-rough

Resserrement mécanique : silences, mots de remplissage, retakes, hygiène des coupures. Tout ici est réversible et chaque décision porte une provenance.

L'argument $project est le slug ; la requête complète est dans $ARGUMENTS. Un $-placeholer vide signifie que la compétence s'est déclenchée automatiquement plutôt que par slash ; prenez le projet depuis PIPELINE_STATE dans le contexte de session et dites lequel vous avez choisi. Les noms de verbes suivent le contrat de build ; python engine/ve.py --help l'emporte en cas de conflit.

Préconditions, et pourquoi elles sont strictes

Exécutez cut-story d'abord. Si story.blocks est absent, dites-le et proposez cut-story plutôt que de continuer — couper mécaniquement du matériel qui va être supprimé en bloc fait perdre du temps sur la détection des retakes et des bafouillages que personne n'entendra.

Si l'utilisateur veut explicitement un passage mécanique sur tout (« einfach nur die Ähms raus »), c'est légitime. Faites-le, et dites qu'aucune sélection de contenu n'a eu lieu.

La règle des trames

Les points de coupe s'alignent sur des trames entières. Ce n'est pas du souci — des points de coupe hors de la grille font accumuler 8,33 ms de dérive A/V par coupe avec le filtre concat, soit 1250 ms pour 150 coupes. Alignés, les mêmes 150 coupes dérivent exactement de 0 échantillons.

in_frame  = floor(t_in  * fps + 0.5)    # arrondi vers le haut à 0,5 -> les ex-aequo vont plus tard
out_frame = ceil(t_out * fps - 0.5)    # arrondi vers le bas à 0,5 -> les ex-aequo vont plus tôt
if out_frame <= in_frame: out_frame = in_frame + 1

out est exclusif — ffmpeg implémente trim=end comme un strict <, et le demi-intervalle [in, out) est ce qui rend la concaténation exacte. Si vous vous trompez sur l'arrondi de OUT, chaque segment devient long d'une trame ; 200 coupes donnent 6,7 s de dérive et une synchronisation audiblement cassée.

Ne faites jamais ce calcul à la main. vedit/timebase.py le possède : snap_in / snap_out.

Étape 1 — Exécuter les passes

python engine/ve.py cut $project

Quatre passes sur la liste de mots aplatie, puis l'alignement :

  1. Hiérarchisation des silences. Les écarts en dessous de min_gap ne sont jamais coupés. Au-dessus, la pause conservée dépend de la ponctuation du mot précédent : .?! x1,5 (minimum 0,40 s), ,;: x1,0, milieu de proposition x0,7 (minimum 0,20 s), changement de sujet x2,0 (minimum 0,60 s). Une longueur de pause uniforme est le signe le plus reconnaissable d'un montage automatique — l'oreille s'attend à une respiration plus longue après un point final.
  2. Hiérarchisation des bafouillages. Voir ci-dessous.
  3. Détection des retakes. N-grammes répétés où la prise ultérieure remplace la précédente.
  4. Hygiène des coupures. Padding, fondus enchaînés, alignement sur passage par zéro, limitation de la densité de coupes.

Étape 2 — Niveaux de bafouillages, et celui qui ne doit pas être automatisé

  • Niveau A — non lexical (äh ähm hm mh uh um er) : suppression automatique. Personne n'en veut.
  • Niveau B — bafouillages lexicaux (weißt du, sozusagen, quasi, im Prinzip, you know, I mean) : suppression automatique avec gardes — pas en début de phrase, pas quand la suppression laisse un fragment inférieur à min_clip.
  • Niveau C — particules modales : also halt eben ja mal doch schon eigentlich genau, et en anglais like just well right so basically actually. Signalez-les uniquement. Ne les supprimez jamais automatiquement.

Le niveau C est l'endroit où les éditeurs automatiques ruinent le discours allemand. doch, eben, halt et ja portent une attitude et une structure de discours ; les supprimer ne rend pas le locuteur plus concis, cela le fait ressembler à une traduction. Si l'utilisateur demande de les supprimer quand même, faites-le — mais dites une fois ce que cela coûte, puis arrêtez d'en parler.

Ordre du signal de détection : correspondance lexicale, puis durée/caractère >= 0,12 s, puis écart adjacent >= 0,10 s, puis énergie à moins de 6 dB du discours environnant.

N'utilisez jamais le score de WhisperX comme signal de bafouillage. Il mesure l'alignement, pas l'hésitation. Les scores faibles se concentrent sur les mots rares et les noms propres — l'inverse des bafouillages. Utilisez-le uniquement comme indicateur de fiabilité des horodatages : score < 0,35 élargit le padding de 60 ms et interdit une coupe à l'intérieur de ce mot.

Étape 3 — Les valeurs par défaut et leur statut

paramètredéfautremarque
pad_in0,08 sfermeture plosive avant /p t k b d g/
pad_out0,10 sles relâchements de /t k s/ dépassent le end de l'aligneur
keep_pauseminimum 0,18 sle souffle laissé là où il y avait du silence
min_gap0,55 sen dessous, jamais coupé
min_removal0,20 sles suppressions plus courtes ne valent pas une coupure
max_cut_density1 par 1,5 sfatigue des jump-cuts
min_clip0,35 sles clips conservés plus courts fusionnent avec un voisin
fondu enchaîné20 ms (10 min, 40 max)curve=tri même prise, qsin entre prises
recherche de passage par zéro+/-5 ms (240 échantillons)audio uniquement, ne déplace jamais la vidéo

Ces valeurs sont dérivées de la recherche, non testées perceptuellement. Tant que project.json a "calibrated": false, dites-le à chaque fois que vous défendez une coupe. Ne présentez pas un seuil non calibré comme un seuil réglé. Le hook de session remonte ce drapeau à chaque session pour cette raison.

L'alignement sur passage par zéro mérite d'être compris : une coupure brutale à un non-passage par zéro produit un saut d'échantillon 29,5 fois plus grand que le maximum naturel du signal — un clic audible. Un alignement sur passage par zéro et un fondu enchaîné de 20 ms le ramènent à la normale. Utilisez les deux. L'alignement ne déplace que l'audio, jamais la vidéo ; un décalage vidéo sous-trame n'est pas représentable.

Étape 4 — Coupes J/L

4 à 12 trames est la plage utile ; défaut 6.

Rejetez toute coupe J/L où les deux côtés partagent un source_id et aucun n'est couvert par un B-roll ou un overlay plein écran. Sur une bouche visible qui n'est pas une coupe J, c'est une erreur de synchronisation labiale, et cela se lit comme un défaut technique plutôt que comme un montage.

Étape 5 — Écrire les segments

Les segments sont écrits dans segments[] avec src_in_frames (inclusif) et src_out_frames (exclusif) comme seule autorité. Aussi requis sur chaque segment :

  • enabled — le matériel rejeté est false avec une raison, jamais supprimé. Chaque décision automatique doit être réversible en retournant un booléen. C'est la propriété qui rend une valeur par défaut agressive sûre.
  • order — ordre de sortie explicite, dense sur les segments activés.
  • provenance — stage (content pour les suppressions au niveau du récit, silence, filler, retake), rule, confidence, applied_by, et la valeur mesurée qui l'a déclenché (original_gap_s). La provenance permet à l'utilisateur de dire « annuler toutes les suppressions de niveau B ».
  • word_range et text dénormalisé. Le texte est pour la lecture seulement et n'est jamais faisant autorité — s'il est en désaccord avec word_range, la plage de mots prévaut.

Les positions temporelles sont dérivées, jamais stockées. Elles sont une somme courante sur les segments activés écrite dans _computed au chargement. N'écrivez jamais _computed à la main.

Définissez stage sur "rough_cut".

Étape 6 — Rendre compte comme un monteur, pas comme un script

Rapport : durée source, durée coupée, pourcentage supprimé, nombre de coupes, densité de coupes (coupes par minute), et le nombre par règle de provenance. Signalez ensuite tout ce qui ressemble à une surcoupe : un tronçon avec plus d'une coupe par 1,5 s, tout clip conservé proche de min_clip, et le nombre de bafouillages de niveau C signalés mais laissés intacts.

Proposez trois prochaines étapes : prévisualiser une section, ajuster un seuil, ou passer aux graphiques/sous-titres.

Modes d'échec

SymptômeCauseCorrectif
Chaque segment fait 1 trameOUT arrondi vers le haut au lieu du basUtilisez snap_out ; jamais de calcul inline
Clics audibles aux coupuresAlignement sur passage par zéro sautéSnap plus un fondu enchaîné de 20 ms
Parole hachée et sans soufflePause conservée uniformeAppliquez le tableau de mise à l'échelle selon la ponctuation
Locuteur robotique et non allemandNiveau C suppriméLe niveau C est signalé uniquement ; restaurez par provenance
Coupes atterrissent en milieu de motLa transcription est de niveau 3 (jetons BPE)Re-transcrivez ; les horodatages de jetons ne peuvent pas être coupés
Dérive A/V croît dans la vidéoPoints de coupe non alignés sur trameAlignez chaque point de coupe, puis relancez la vérification QC (a)

Individual skills in this repo

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

businessbaum/vedit

This skill should be used when the user asks for subtitles or on-screen text of what is being said - "brenn die Untertitel ein", "mach Untertitel", "Untertitel drauf", "leg Untertitel drüber", "brenn die Subs ein", "mach die Captions", "Wort für Wort Untertitel", "Karaoke-Untertitel", "korrigier den Untertitel-Text", "burn in the captions", "add subtitles", "burn the subs", "word-by-word captions", "fix a caption typo". Covers ASS generation, the pixel-width grouping rule for German, the font table, and burn-in through libass.

businessbaum/vedit

This skill should be used when the user asks to decide what the video is actually about before any mechanical cutting - "bau die Story", "was soll ins Video", "was kann raus", "welche Themen bleiben", "kürz das auf 6 Minuten", "mach daraus ein kurzes Video", "wo ist der Hook", "sortier die Themen", "worum geht es hier eigentlich", "build the story", "decide what stays", "structure this", "cut this down to N minutes", "find the hook", "reorder the topics". This is the CONTENT-selection pass that writes the "story" block in project.json; it runs after transcribe and before cut-rough.

businessbaum/vedit

This skill should be used when the user asks for the finished video file - "exportier das", "render das fertig", "mach das final", "renderte das Video", "mach den Endexport", "bau das Video zusammen", "mach es fertig für YouTube", "gib mir die MP4", "export the final", "render the final cut", "make the master", "export for TikTok", "give me the mp4". Covers segment rendering with the cache, guarded concat, the one-pass audio, loudness normalisation and the single mux.

Skills associés