Communitygithub.com

zaddy99999/captions

Transcrivez la parole localement avec des horodatages au niveau des mots (faster-whisper, aucune clé API) et incrustez des légendes stylisées avec mise en évidence des mots dans une vidéo, ou exportez au format SRT. Utilisez quand l'utilisateur souhaite des sous-titres ou légendes sur une vidéo, une transcription avec le minutage des mots, ou des points de coupe qui n'atterrissent jamais à l'intérieur d'un mot.

Qu'est-ce que captions ?

Ce skill fournit un pipeline complet de transcription et d'incrustation de sous-titres fonctionnant entièrement en local, sans nécessité de clé API. Il utilise faster-whisper pour la transcription avec horodatages au niveau des mot, puis génère des fichiers ASS (avec mise en évidence du mot actif) et SRT. L'incrustation se fait via le filtre `ass` ou `subtitles` de ffmpeg avec libass, ce qui permet un contrôle précis du style (taille, marge, contour, couleur d'accentuation). Le skill inclut également un outil `snap-to-words.mjs` pour ajuster les points de coupe vidéo aux espaces entre les mots, garantissant qu'aucune coupe ne tombe à l'intérieur d'un mot. Il est conçu pour les plateformes comme Claude Code, Cursor et autres agents IA, et prend en charge les workflows vidéo où les sous-titres doivent être la dernière étape (après les coupes, overlays et corrections colorimétriques).

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/zaddy99999/video-editing-skills/tree/main/skills/captions

Demander à votre IA préférée

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

Documentation

Que fait captions ?

Transcription locale au niveau du mot, stylisation et incrustation de légendes pour formats courts.

Les scripts se trouvent dans scripts/ :

ScriptFonction
transcribe.pyfaster-whisper avec word_timestamps=True vers words.json (mis en cache)
make-captions.mjswords.json vers ASS (stylisé, mise en évidence du mot actif) et SRT
burn.mjsIncruste ASS/SRT avec libass (filtre ass/subtitles)
snap-to-words.mjsDéplace les points de coupe vers l'espace le plus proche entre les mots

Workflow

  1. Transcrire (une fois par source ; le résultat est mis en cache) :
    pip install faster-whisper            # une fois
    python3 scripts/transcribe.py --input clip.mp4 --out edit/clip.words.json --model small --language en
    
    Le premier téléchargement télécharge le modèle depuis Hugging Face. Si celui-ci est bloqué, le script se termine avec le code 4 et un message JSON fix au lieu d'une trace ; il n'écrit jamais de transcription factice. Pointez --model vers un dossier de modèle CTranslate2 local pour travailler hors ligne.
  2. Générer les légendes :
    node scripts/make-captions.mjs --words edit/clip.words.json --out-ass edit/clip.ass --out-srt edit/clip.srt
    
    Le style provient du pack de marque (bloc captions : taille, marge, contour, mise en évidence ; colors.accent est la couleur du mot actif).
  3. Incruster comme toute dernière étape visuelle :
    node scripts/burn.mjs --input edit/clip-hook.mp4 --subs edit/clip.ass --out edit/clip-captioned.mp4
    
    Utilisez --fonts-dir lorsque la police des légendes est un fichier plutôt qu'une police installée.
  4. Vérifier avec une planche de contrôle render-qc : lisible, à l'intérieur de la zone de sécurité, pas au-dessus de la plaque d'accroche.

Règles

  • Ne jamais couper à l'intérieur d'un mot. Avant de diviser la parole, ajustez les coupes aux espaces entre les mots : node scripts/snap-to-words.mjs --words edit/clip.words.json --markers edit/cuts.json --out edit/cuts.json
  • Les légendes se mettent en dernier : après les coupes, les incrustations et la colorimétrie. Si vous rognez le clip après la transcription, passez --offset -<secondes rognées> à make-captions.mjs.
  • 1 à 3 mots par bloc pour les courts métrages (maxWords, maxChars). Les blocs se coupent sur la ponctuation et les pauses.
  • Gardez les légendes hors des ~15 % inférieurs (interface utilisateur de la plateforme) et loin de la plaque d'accroche : réglez captions.marginV.
  • Les transcriptions sont mises en cache : réexécutez avec --force uniquement lorsque l'audio a changé.
  • Vérifiez ponctuellement les mots par rapport à l'audio ; Whisper peut mal entendre les noms et le jargon. Corrigez words.json à la main si nécessaire.

Sans libass dans ffmpeg

Si burn.mjs signale qu'aucun filtre ass n'est disponible, la version de ffmpeg ne possède pas libass. Installez une version complète (la plupart des gestionnaires de paquets en fournissent une), ou téléchargez le SRT en tant que piste de sous-titres séparée au lieu de l'incruster.

Individual skills in this repo

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

Skills associés