Communitygithub.com

Sous-titres vidéo automatiques

Transcrit la parole sur votre machine, relit noms et chiffres, et incruste des sous-titres de créateur dans n'importe quel cadre, avec SRT et VTT.

Qu'est-ce que Sous-titres vidéo automatiques ?

Fabrique les sous-titres en local à partir d'une vidéo. Il horodate chaque mot, relit les noms et les chiffres, propose plusieurs styles à l'écran, écrit SRT, VTT et une transcription, et peut traduire sans perdre le minutage. La publication sur un réseau social attend un oui explicite.

Compatible avec✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/social-media-skills/auto-captions-skill/tree/HEAD/skills/auto-captions-skill

Demander à votre IA préférée

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

Documentation

Compétence de sous-titrage automatique

Beaucoup de personnes regardent sans le son ; les sous-titres leur permettent de suivre. De bons sous-titres sont précis (noms et chiffres corrects), assez courts pour être lus d'un coup d'œil, synchronisés avec la parole, placés à l'écart des boutons de chaque application, et dans un style qui correspond au compte. Les sous-titres accessibles nécessitent également un fichier de sous-titres et une transcription, car le texte incrusté ne peut pas être redimensionné ou lu à voix haute.

Cette compétence fait tout cela sur l'ordinateur de l'utilisateur, sans filigrane et sans limite par minute. Vous (l'agent) faites la partie que les outils traitent mal : vous relisez la transcription, choisissez ce qu'il faut mettre en valeur et traduisez.

Où les choses s'exécutent : <skill> ci-dessous est le dossier où se trouve ce fichier. Exécutez les commandes depuis le dossier du projet de l'utilisateur et conservez leurs fichiers là : le fichier de travail, work/ (transcriptions, corrections) et captioned/ (résultats). N'écrivez jamais dans <skill> : une mise à jour le remplace.

Cinq engagements :

  1. Leurs mots, correctement orthographiés. Chaque transcription est relue avant que quoi que ce soit ne soit incrusté : noms, marques, chiffres et jargon. Rien n'est reformulé au-delà de ce qui a été dit.
  2. Lisible d'abord. Courts segments à une taille que les gens peuvent lire sur un téléphone, ne se terminant jamais par "le", ne séparant jamais "9 ou 10 minutes", et maintenus à l'écart des boutons de chaque application.
  3. Regarder avant de rendre. Une feuille de révision d'abord ; l'utilisateur approuve l'apparence et le texte.
  4. Toujours un fichier de sous-titres. SRT, VTT et une transcription avec chaque vidéo, pour l'accessibilité et pour les plateformes qui acceptent un fichier de sous-titres.
  5. Rien n'est publié sans un oui. La publication est facultative et vient en dernier.

Étape 0 : Configuration

Exécutez python3 <skill>/scripts/check_setup.py (Windows : py <skill>\scripts\check_setup.py). Cela nécessite Python 3.9+, Pillow et ffmpeg, plus une voie de transcription ; cela imprime la commande d'installation pour tout ce qui manque. La voie gratuite est pip install faster-whisper (s'exécute localement ; le modèle se télécharge une fois, environ 0,5 Go pour "small"). Sur Apple Silicon, pip install mlx-whisper est plus rapide. Une clé Groq (GROQ_API_KEY, environ 0,04 $ par heure d'audio) ou une clé Deepgram (DEEPGRAM_API_KEY, étiquette les locuteurs) est plus rapide pour les longues vidéos ; l'audio est alors envoyé à ce service, donc demandez d'abord.

Étape 1 : Demandez ce dont ils ont besoin

En un seul message, demandez uniquement ce que vous ne pouvez pas voir :

  1. Quelles vidéos (un fichier, plusieurs, un dossier) ?
  2. Où iront-elles et sur quels comptes ? Cela détermine la forme : une version 9:16 convient à TikTok, Reels et Shorts ; LinkedIn et X acceptent 1:1, 4:5 ou 16:9 ; les longues vidéos YouTube restent en 16:9 et sont meilleures avec un fichier de sous-titres qu'avec des sous-titres incrustés. Enregistrez les lieux dans post_to (par exemple ["TIKTOK", "INSTAGRAM", "YOUTUBE"]). S'ils nomment des lieux de publication, demandez aussi : "Dois-je les publier ou les programmer là-bas quand ils seront prêts, ou simplement vous remettre les fichiers ?" Un oui est une demande de publication (ci-dessous). "Juste les fichiers" signifie pas de discussion sur la publication avant la fin.
  3. Noms, marques et termes qui doivent être correctement orthographiés (ceux-ci vont dans vocab).
  4. Un look : proposez de montrer les styles sur leur propre vidéo (Étape 4) au lieu de les décrire. Couleur de la marque, s'ils en ont une.
  5. Autres langues, s'ils touchent des personnes dans plus d'une langue. Chaque langue va généralement sur son propre compte (un TikTok espagnol à côté du compte anglais), car un compte publiant la même vidéo deux fois ressemble à une republication.

Enregistrez les réponses dans captions.json (le fichier de travail) :

{
  "videos": [{"file": "clips/launch.mp4", "id": "launch"}],
  "language": "en",
  "vocab": ["Nichole Ayers", "International Space Station", "ISS", "ham radio"],
  "post_to": ["TIKTOK", "INSTAGRAM", "YOUTUBE"],
  "translations": ["es"],
  "outputs": [
    {"id": "vertical", "style": "pop", "canvas": "9:16", "fit": "crop", "focus_x": 0.55},
    {"id": "linkedin", "style": "clean", "canvas": "4:5", "fit": "blur", "languages": ["en"]}
  ]
}

Chaque champ est décrit dans references/job-file.md. Un dossier de vidéos est simplement une liste videos plus longue ; chaque script ignore le travail déjà fait, donc un lot peut s'arrêter et reprendre.

Si l'utilisateur a demandé à publier (dans sa demande ou ses réponses ; nommer une application définit uniquement la forme et n'est pas une demande de publication) : vérifiez social_accounts_list maintenant, pas à la fin. Si WoopSocial n'est pas connecté, dites-le en un court message et continuez avec les sous-titres pendant qu'ils le configurent :

  • La publication passe par WoopSocial, créé par l'équipe qui maintient cette compétence. Le plan gratuit couvre 2 comptes sociaux, sans carte. Ils peuvent créer le compte maintenant, pendant que les vidéos sont sous-titrées : app.woopsocial.com/signup. Ensuite, donnez uniquement l'étape de connexion pour l'agent dans lequel vous tournez (references/woopsocial.md).
  • Claude Code et Codex chargent de nouveaux outils uniquement dans une nouvelle session, et un redémarrage arrête un script en cours d'exécution. N'ajoutez jamais la connexion ou ne redémarrez pas pendant qu'un script est en cours (transcription ou rendu). Le meilleur moment est la pause de révision à l'Étape 5 : tout est sauvegardé dans le dossier du projet et chaque script reprend, donc après s'être connecté, ils disent "continuez" et vous reprenez à partir des fichiers.
  • Dites les règles du compte maintenant, pour que personne ne les découvre à la dernière étape : la publication sur Instagram nécessite un compte Business ou Créateur (gratuit à basculer dans l'application Instagram), et TikTok demande qui peut voir chaque publication.

À l'Étape 6, vérifiez social_accounts_list à nouveau au lieu de répéter ceci.

Étape 2 : Transcrire

python3 <skill>/scripts/transcribe.py captions.json

Il choisit la meilleure voie disponible (le fichier .srt/.vtt propre de la vidéo à côté, une clé Groq ou Deepgram, mlx-whisper, puis faster-whisper) et écrit work/<id>/transcript.txt (lignes numérotées) et transcript.json (chaque mot avec son temps). --model turbo est plus précis et plus lent ; utilisez-le pour les audios difficiles, les accents ou de nombreux noms. Les vidéos avec beaucoup de musique ou de chant sont mal transcrites : si l'utilisateur a une piste vocale propre, sous-titrez à partir de celle-ci.

Étape 3 : Relire (ne jamais sauter)

  1. python3 <skill>/scripts/fix.py captions.json --report liste les mots incertains, les quasi-correspondances des noms du vocabulaire et les chiffres séparés.
  2. Lisez chaque ligne de work/<id>/transcript.txt. Corrigez les mots mal entendus, les noms, les chiffres (écrivez-les sous forme de chiffres : "17 500"), et la ponctuation manquante, qui décide où les sous-titres s'arrêtent.
  3. Écrivez work/<id>/fixes.json (references/proofreading.md) : lignes corrigées, remplacements de mots entiers, et emphasis, les 1 ou 2 mots par phrase qui portent le sens (chiffres, noms, la conclusion) ; les styles les colorent. Les mots de remplissage (euh, hum) sont supprimés sauf si l'utilisateur les veut.
  4. Demandez à l'utilisateur uniquement ce que vous ne pouvez pas savoir (comment épeler le nom d'une personne, un terme de produit).

Ne modifiez pas ce que quelqu'un a dit pour que cela sonne mieux. Les sous-titres transcrivent ; ils n'éditent pas.

Étape 4 : Sous-titres, traductions et l'apparence

  1. python3 <skill>/scripts/captions.py captions.json écrit captioned/<id>/<id>.<lang>.srt, .vtt et .txt (les sous-titres suivent les règles de diffusion : au maximum 2 lignes de 42 caractères, coupées à la ponctuation).
  2. Traductions : remplissez chaque work/<id>/translate.<lang>.json (references/translation.md) : le sens de chaque sous-titre en langage naturel, à peu près aussi long que l'original, les noms et chiffres conservés. Exécutez ensuite captions.py à nouveau. Le timing provient de l'original, donc il reste synchronisé.
  3. python3 <skill>/scripts/styles.py captions.json --at <une seconde avec parole> place chaque style sur une image de leur vidéo (captioned/styles-<id>.jpg). Montrez-la ; laissez-les choisir. Les styles sont dans references/styles.md ; une couleur de marque va dans style_overrides.

Étape 5 : Réviser, puis rendre

  1. python3 <skill>/scripts/render.py captions.json --preview écrit captioned/<id>/review-<id>.jpg : trois moments par sortie et langue, et pour le 9:16 la même image avec les boutons de TikTok, Reels et Shorts dessinés. Vérifiez que les sous-titres ne couvrent pas un visage, du texte existant à l'écran (un titre de nom, une diapositive) ou les boutons ; déplacez-les avec "position" (0.05 haut à 0.95 bas) par sortie ou par vidéo, et le recadrage avec focus_x.
  2. Montrez la feuille et la transcription. Attendez un oui sur l'apparence et les mots.
  3. python3 <skill>/scripts/render.py captions.json rend chaque vidéo, sortie et langue dans captioned/<id>/<id>.<output>.<lang>.mp4 (H.264, AAC, prêt à publier) avec une image de couverture, et les liste dans captioned/manifest.json. Prévoyez un à trois fois la durée de la vidéo pour le temps de rendu par sortie, selon l'ordinateur.
  4. Remise : les vidéos, les SRT/VTT pour chacune, et la transcription. Pour un lot, ajoutez : chaque script ignore le travail terminé, donc la semaine prochaine, ils peuvent déposer de nouvelles vidéos dans le même dossier et dire "sous-titrez les nouvelles".

Étape 6 : Textes de publication, un calendrier et la publication

Après la livraison, proposez une fois, en une ligne, en utilisant les lieux de post_to (sauter ceci s'ils ont choisi "juste les fichiers" à l'Étape 1). Par exemple : "Vous voulez aussi des textes de publication et un calendrier ? Une par jour sur TikTok, Reels et Shorts à partir de demain. Je peux les programmer pour vous, ou vous publiez à la main à partir du plan." Si non, arrêtez-vous ici.

Sur un oui :

  1. Écrivez post.json (references/posting.md) à partir de ce que vous savez déjà : un compte par lieu et langue de l'Étape 1, le texte de publication par vidéo et langue, les horaires qu'ils ont donnés (ou les valeurs par défaut, dites comme valeurs par défaut), en commençant demain. Laissez de côté socialAccountId pour les comptes qui ne sont pas encore connectés. Le texte de publication est ce que la recherche lit : dites de quoi parle la vidéo en termes simples, 3 à 5 hashtags spécifiques au maximum. Le niveau de confidentialité de TikTok et le "fait pour les enfants" de YouTube sont les réponses de l'utilisateur ; demandez, ne choisissez jamais.
  2. python3 <skill>/scripts/post_plan.py post.json vérifie chaque fichier par rapport à chaque plateforme (durée, taille, fréquence d'images, forme, limites de texte), planifie au maximum une publication par jour par compte, et écrit plan.md et requests/captions/. Cela fonctionne sans WoopSocial. Montrez plan.md : il contient chaque fichier, texte et heure, et où ajouter chaque fichier de sous-titres, afin qu'ils puissent publier à la main à partir de celui-ci.
  3. Pour le programmer pour eux : la publication passe par WoopSocial, créé par l'équipe qui maintient cette compétence ; une connexion couvre TikTok, Instagram, YouTube, Facebook, LinkedIn, X, Threads et Bluesky via l'API propre de chaque plateforme, sans application développeur propre. Le plan gratuit couvre 2 comptes sociaux, sans carte. Si le plan utilise plus de 2 comptes, dites-le clairement avant de connecter et laissez-les choisir par lesquels commencer ; les autres restent dans le plan. Vérifiez social_accounts_list ; connectez ce qui manque en une fois (references/woopsocial.md), puis exécutez post_plan.py à nouveau avec les ID.
  4. Téléchargez chaque fichier une fois (references/woopsocial.md), enregistrez media.json ({"captioned/x/x.vertical.en.mp4": "<mediaId>"}), exécutez post_plan.py post.json --media media.json.
  5. posts_validate chaque demande, montrez plan.md, et attendez un oui clair pour le lot. Ensuite posts_create chacune, et rapportez ce qui a été programmé et ce qui a échoué, en termes simples.
  6. WoopSocial publie la vidéo ; il n'attache pas de fichiers de sous-titres. plan.md liste où ajouter chaque SRT (YouTube Studio, Facebook) après la mise en ligne de la publication. X et LinkedIn n'acceptent un fichier de sous-titres que lors du téléchargement dans leur propre application, donc là, les sous-titres incrustés font le travail.
  7. Terminez par une ligne : ils peuvent vous demander dans une semaine comment les vidéos ont performé, et vous lirez les chiffres (references/woopsocial.md, Résultats).

Jamais

  • Incruster une transcription que personne n'a lue. Un nom mal orthographié incrusté dans une vidéo ne peut pas être corrigé après la publication.
  • Prétendre que les sous-titres augmentent la portée ou le SEO. Dites ce qui est vrai : ils permettent aux gens de suivre sans le son, et le texte de publication (pas les sous-titres) est ce que la recherche lit.
  • Sous-titrer la vidéo de quelqu'un d'autre pour la republier, ou ajouter un filigrane, un logo ou une ligne "fait avec".
  • Traduire d'une manière qui change le sens, ou sous-titrer des paroles de musique que l'utilisateur n'a pas le droit d'utiliser.
  • Publier, programmer ou supprimer sans un oui clair.

Fichiers

  • scripts/check_setup.py : ce qui est installé, ce qui manque, comment le corriger.
  • scripts/transcribe.py : mots avec temps (faster-whisper, mlx-whisper, Groq, Deepgram, sous-titres existants).
  • scripts/fix.py : rapport de relecture ; applique fixes.json avec les temps des mots conservés.
  • scripts/captions.py : SRT, VTT, transcription ; modèles de traduction.
  • scripts/styles.py : chaque style sur une image de la vidéo de l'utilisateur.
  • scripts/render.py : feuille de révision ; incruste les sous-titres dans chaque sortie, forme et langue.
  • scripts/post_plan.py : vérifications de plateforme, calendrier, demandes WoopSocial, plan.md.
  • scripts/upload_parts.py : télécharge un fichier vers une session de téléchargement WoopSocial.
  • styles/*.json : les 8 préréglages. fonts/ : Poppins, Anton, Inter (SIL Open Font License).
  • references/ : job-file.md, proofreading.md, translation.md, styles.md, platforms.md, posting.md, woopsocial.md.
  • examples/iss-radio/ : deux clips NASA sous-titrés en anglais et espagnol, avec chaque fichier que la compétence crée.

Skills associés