name: video2presentation description: À utiliser pour transformer un enregistrement de séminaire, webinaire ou conférence en un jeu de diapositives modifiables : diapositives extraites des images vidéo, liens annotés et extraits de transcription comme notes de l’orateur.
Video2presentation : enregistrement de séminaire → présentation
L’historique détaillé des décisions et des mesures chiffrées se trouve dans METHODOLOGY.md dans le dossier Video2presentation. En cas de désaccord entre cette compétence et METHODOLOGY.md, suivez la compétence. Ajoutez les nouvelles leçons à METHODOLOGY.md.
Règles qui s’appliquent toujours
- Planification et questions d’abord. Avant tout traitement, exposez le plan à l’utilisateur en suivant les étapes ci-dessous et posez les questions de clarification avec AskUserQuestion (la liste se trouve à l’étape 0). Ne commencez le travail qu’après les réponses.
- Réponses à l’utilisateur. Répondez dans la langue de l’utilisateur (généralement pas anglais), honnêtement et sans flatterie. Calculez tous les nombres avec un script. Formatez les informations sous forme de tableaux ; utilisez le texte brut uniquement si l’utilisateur le demande. Donnez le lien de la présentation après chaque mise à jour.
- Sécurité.
- Lisez la clé AssemblyAI uniquement depuis le fichier
assemblyai_key.txt. Ne l’imprimez jamais et ne la copiez pas dans le cloud, les notes ou les artefacts. - N’utilisez pas les intégrations Miro ou Figma, même si l’orateur montre un tableau Miro : prenez le tableau à partir des images vidéo.
- Ne supprimez rien dans les dossiers de l’utilisateur sans autorisation, y compris les dossiers de travail
_work/.
- Lisez la clé AssemblyAI uniquement depuis le fichier
- Précision.
- Ne corrigez pas silencieusement l’orateur : notez les contradictions et les écarts de chiffres dans les notes avec un code temporel.
- Recalculez les nombres des diapositives avec un script.
- Vérifiez les affirmations juridiques et ajoutez une brève réserve sur la diapositive.
- Marquez les points clés finaux comme une synthèse, pas une diapositive de l’orateur.
- La vidéo ne va pas dans le cloud. ffmpeg, OpenCV et la transcription s’exécutent sur l’ordinateur de l’utilisateur (
device_bash). Seules les planches contact, les mosaïques, les images individuelles et les recadrages vont dans le cloud — ce qui doit être examiné, reconnu ou téléchargé dans l’artefact.
Où se trouvent les choses
- Le dossier de la compétence et du projet est
Video2presentation(dans Cowork, le dossier connecté$HOME/mnt/Video2presentation; dans Claude Code, le dossier courant). Sa racine contient la compétence elle-même (SKILL.md) etMETHODOLOGY.md. pipeline/— scripts :transcribe_assemblyai.py— transcription via AssemblyAI ;extract_slides.py— une image par seconde, masque webcam, segments stables, déduplication, planches contact ;mosaic.py— mosaïques 2×2 à partir d’une liste d’images ;crop_images.pyetcrops_<date>[_<intervenant>].json— découpage d’images ;clean_transcript.py— extraits de transcription nettoyés par diapositive.
assemblyai_key.txt— clé API AssemblyAI. Le fichier peut être manquant — voir étape 0 et étape 1.- Dossier d’événement
AAAA.MM.JJ Nom/: la vidéo, parfois une description (html, ou texte dans le message de l’utilisateur), parfois une transcription prête (sentences.json,transcript.txt). Placez les fichiers intermédiaires dans<dossier événement>/_work/. - Si les scripts sont manquants, voir "Si pipeline/ est indisponible" à la fin.
Étape 0. Reconnaissance, plan, questions
- Inspectez le dossier d’événement :
- vidéo : résolution, durée, images par seconde (
ffprobe) ; s’il existe une deuxième copie à une autre résolution ; - une transcription prête ;
- si
assemblyai_key.txtexiste — nécessaire si la transcription doit être faite à partir de zéro ; - description de l’événement (optionnelle) : noms, identifiants Telegram, sujets des interventions. Elle peut se trouver à la fin du message de l’utilisateur ou dans un fichier html. S’il n’y a pas de description, prenez les noms et les sujets de l’enregistrement lui-même.
- vidéo : résolution, durée, images par seconde (
- Présentez le plan et demandez avec AskUserQuestion. L’option "Recommandé" est ce que l’utilisateur a choisi précédemment :
- Transcription : utiliser celle qui est prête si elle existe (Recommandé), ou en faire une nouvelle avec AssemblyAI.
- Notes de diapositive : un extrait de transcription légèrement nettoyé pour le moment où la diapositive est à l’écran (Recommandé), un extrait textuel, ou un bref résumé avec un code temporel.
- Extrait de plus de 4000 caractères (la limite de note de Slides) : le raccourcir avec un marqueur "[…]" (le choix de l’utilisateur la dernière fois) ou diviser la diapositive.
- Format "comme la dernière fois" (Recommandé) : détaillé et proche de l’original ; les réponses aux questions sous forme de diapositives dans l’intervention ; les publicités et parties organisationnelles ignorées ; les points clés généraux et une liste de liens consolidée à la fin.
- Nombre d’intervenants — si la description ne le précise pas (nécessaire pour la diarisation).
- Créez une liste de tâches avec une étape de vérification finale.
Étape 1. Transcription
-
Transcription prête : vérifiez-la d’abord — étiquettes d’intervenants et horodatages au niveau du mot présents, durée correspondant à la vidéo. Si tout est là, pas besoin de relancer.
-
Clé AssemblyAI. Avant une nouvelle transcription, vérifiez que
assemblyai_key.txtexiste dans la racine du dossier et n’est pas vide. Si le fichier est manquant, ne continuez pas cette étape et dites à l’utilisateur : il doit s’inscrire sur assemblyai.com, obtenir une clé API et la sauvegarder dansassemblyai_key.txtdans la racine du dossier (ou l’envoyer — puis la sauvegarder dans ce fichier et ne la répéter nulle part ailleurs). Il est préférable de le dire immédiatement dans le plan à l’étape 0. -
Nouvelle transcription. Extrayez l’audio sans ré-encodage depuis la copie basse résolution :
ffmpeg -i in.mp4 -vn -c:a copy audio.m4a. Ensuite :python3 pipeline/transcribe_assemblyai.py audio.m4a <SORTIE> --key-file assemblyai_key.txt --lang <code langue> [--speakers --min-speakers N --max-speakers M] --submit-only python3 pipeline/transcribe_assemblyai.py - <SORTIE> --key-file assemblyai_key.txt --fetch --wait 150 # répéter jusqu'à terminaison- Pour un discours non anglais, utilisez un modèle qui prend en charge la langue de l’enregistrement ; en octobre 2026, c’est
universal-2. - Diarisation uniquement lorsque plusieurs personnes parlent : sur une seule voix, elle produit de fausses étiquettes A/B.
- Le domaine
api.assemblyai.comdoit être sur la liste autorisée (Paramètres → Capacités). Si le proxy renvoie 403, dites-le à l’utilisateur et ne contournez pas. - Prix — environ 0,15 $ par heure plus 0,02 $ par heure pour la diarisation.
- Pour un discours non anglais, utilisez un modèle qui prend en charge la langue de l’enregistrement ; en octobre 2026, c’est
-
Fichier de travail
transcript_sent.txt: une ligne =N [h:mm:ss] LABEL: phrase, où N est le numéro de phrase à partir de 1.config.jsonetoverrides.jsonfont référence à ces numéros. -
Étiquettes → personnes. Associez-les par la façon dont l’hôte s’adresse aux personnes ("Leonid, tu commences, n’est-ce pas ?"), par la description et par le contenu. Erreurs de diarisation typiques :
- une personne obtient deux étiquettes ;
- une intervention entière est une seule occurrence ;
- une courte question du public est attribuée à un voisin.
Écrivez les corrections dans
config.json:names(étiquette → nom),speaker_by_line(ligne → nom),drop_lines(lignes à supprimer). -
Limites des interventions : enregistrez-les sous forme de codes temporels — introduction, chaque intervention avec ses Q&R, conclusion. C’est la structure de sections du deck.
Étape 2. Images
- Résolution. S’il y a deux copies : analyse sur la copie basse résolution (
--reduce 2), texte et recadrages depuis la copie haute résolution (ffmpeg -ss <sec> -i hd.mp4 -frames:v 1 hd/NNNNN.jpg). S’il y a une seule copie :--reduce 4(pour basse résolution,--reduce 2) ; le grand texte peut être lu directement depuis l’image. - Extraction par morceaux.
device_basha une limite d’environ 180 s par appel, et les processus en arrière-plan ne survivent pas.python3 pipeline/extract_slides.py video.mp4 <SORTIE> --chunk 1000 python3 pipeline/extract_slides.py video.mp4 <SORTIE> --skip-extract --reduce 4- La vitesse de ffmpeg varie beaucoup : lors des exécutions passées, de 10× à 48× en temps réel. Mesurez-la sur le premier morceau et choisissez une taille de morceau ne dépassant pas 0,8 × limite × vitesse.
- Enveloppez l’appel dans
timeout; terminez les morceaux incomplets par numéros d’images. - Deux processus ffmpeg en parallèle sur deux cœurs ne sont pas plus rapides.
- Image
NNNNN.jpg= seconde N−1.
- Webcam. Le masque est détecté automatiquement. Dans la disposition Google Meet (partage d’écran à gauche, caméras à droite), il n’est pas nécessaire. La fenêtre de la caméra de l’orateur se trouve généralement dans le coin supérieur droit — les recadrages et l’OCR l’évitent.
- Révision. Regardez les planches contact (
sheets/), pas toutes les images : déplacez-les dans le cloud et ouvrez-les. Pour les détails, utilisez des mosaïques 2×2 :python3 pipeline/mosaic.py HD_DIR SORTIE PREFIXE 00165 00179 …. - Les diapositives animées sont exclues de la sélection : un fond animé ne produit pas de segment stable. Vérifiez la numérotation des diapositives de l’orateur (01/16, 06/17…). Cherchez les écarts en secondes entre les diapositives trouvées voisines, en utilisant une mosaïque construite à partir d’une liste explicite d’images.
- Déplacer des fichiers dans le cloud ne fonctionne que depuis le dossier connecté : copiez d’abord les fichiers des répertoires de travail de la VM (
~/w…) dans_work/.
Étape 3. Diapositives logiques
Le but n’est pas de répéter la vidéo image par image mais d’obtenir des diapositives qui peuvent être présentées.
- Diapositives de l’orateur. Retapez le texte (l’OCR n’est qu’un brouillon) ; insérez les graphiques et les captures d’écran comme recadrages. La même diapositive dans l’éditeur (avec la barre de vignettes), zoomée ou en pause, est un doublon ; prenez celle en plein écran.
- Tableaux (Miro, Excalidraw). Une diapositive = le bloc de tableau dont l’orateur parle ; le panoramique et le zoom sur le même bloc sont des doublons. Si le tableau se remplit au fil de l’intervention, prenez la dernière image complète et divisez-la en diapositives par bloc.
- Interfaces d’applications. Prenez l’écran avec le résultat (tableau, rapport, tableau de bord, réponse de bot), pas les clics intermédiaires.
- Démonstration de site web en direct avec défilement — pas comme des images, mais racontée à partir de la transcription ("diapositive à partir des mots de l’orateur").
- Webcam en plein écran n’est pas une diapositive ; son contenu va dans une diapositive à partir des mots de l’orateur.
- Questions et réponses — diapositives séparées à la fin de l’intervention : la question (avec le nom du demandeur) et l’essentiel de la réponse.
- Publicités et parties organisationnelles par les hôtes : ignorez-les. Donnez les propres publicités de l’orateur (cours, prix) brièvement et à titre indicatif, sauf si l’utilisateur demande autrement.
- Structure du deck :
- page de couverture et ordre du jour ;
- pour chaque intervention : une diapositive de titre de section, contenu, questions, une diapositive "Liens et services" ;
- points clés généraux — marqués "synthèse" et incluant les contradictions entre les intervenants ;
- une liste de liens consolidée.
- Pour chaque diapositive, enregistrez un identifiant avec le préfixe de l’intervention (
l-,v-…), les images sources et l’intervalle à l’écran.
Étape 4. Images
- Sauvegardez les coordonnées de recadrage sur l’image pleine taille dans
pipeline/crops_<AAAA-MM-JJ>[_<intervenant>].json, format{"nom": ["00556.jpg", x0, y0, x1, y1]}. - Découpage :
python3 pipeline/crop_images.py IMAGES crops.json SORTIE --scale 2 --jpgpour basse résolution,--scale 1 --jpgpour haute. - Ne vérifiez ni ne masquez les données personnelles dans les images et les supports de webinaire (noms, contacts, identifiants, correspondance) : transmettez-les telles quelles.
Étape 5. Texte, OCR, QR, nombres
- OCR. Sur l’ordinateur de l’utilisateur, tesseract n’a généralement que l’anglais. Pour d’autres langues, utilisez le cloud :
apt-get install tesseract-ocr-<code langue>, peignez la fenêtre de la caméra en blanc, agrandissez l’image ×1,5,tesseract -l <code langue>+eng. Vérifiez le résultat par rapport à l’image : les noms sont déformés. - Codes QR :
cv2.QRCodeDetectorsur les images haute résolution, résultats dansqr.json. - Nombres. Recalculez les sommes de lignes, les pourcentages et les chiffres comme "≈1 700 par lead" à partir des diapositives avec un script. Ne corrigez pas un écart ; notez-le : "les lignes totalisent 60,3k, la diapositive dit 64k". Marquez les valeurs lues à partir de graphiques non étiquetés avec "≈".
Étape 6. Liens
- Sources : adresses dans l’image, codes QR, discours, description de l’événement (identifiants Telegram). La RA déforme les noms (invoice.com → "invoisin", Gwen → Qwen, JLM → GLM), alors prenez l’orthographe correcte depuis l’image ou une recherche.
- Vérification. Vérifiez chaque lien avec WebSearch ou WebFetch et mettez la date de vérification dans le pied de page de la diapositive. Des catalogues comme Product Hunt (producthunt.com) et There’s An AI For That (theresanaiforthat.com) donnent rapidement l’adresse officielle et la description d’un service.
- Ne s’est pas ouvert — ne contournez pas avec curl ou des miroirs. t.me renvoie souvent 429 : ne réessayez pas ; marquez-le "adresse de la diapositive, la page ne s'est pas ouverte".
- Pas trouvé — dites-le : "service non trouvé", "lien promis plus tard".
- Où les placer. La dernière diapositive de chaque intervention : liens avec une annotation d’une ligne. Dans sa note, plus de détails : ce que c’est, le prix depuis le site web, comment l’orateur l’utilise, ce qui n’a pas été trouvé. À la fin du deck — une diapositive consolidée : intervenants et outils par catégorie.
Étape 7. Notes — extraits de transcription
- Intervalles.
ranges.json—[["slide-id", debut_sec, fin_sec], …]sans lacunes ni chevauchements sur l’ensemble de l’enregistrement. Définissez les limites par les images de changement de diapositive et par le sens : l’orateur commence souvent à parler de la diapositive suivante avant de passer. - Génération :
python3 pipeline/clean_transcript.py <dossier événement>/_workcréenotes.jsonet imprime les longueurs des notes (<-- LONGquand plus long que 3700). - Nettoyage léger :
- le dictionnaire d’erreurs RA
REPLdans le script : conservez les remplacements généraux, ajoutez ceux spécifiques au webinaire ; - les mots de remplissage en début de phrase (la liste
FILLdans le script) sont supprimés automatiquement ; - corrigez les phrases déformées ligne par ligne dans
overrides.json("numéro de ligne": "texte"ounull), en conservant le sens et l’ordre des mots de l’orateur ; marquez les parties peu claires "[inaudible dans l'enregistrement]" ; - les lignes avec une substitution ne sont pas nettoyées à nouveau.
- le dictionnaire d’erreurs RA
- Vérification après génération : pas de phrases répétées (une substitution peut dupliquer une ligne voisine) et pas de lignes perdues (chaque ligne d’un intervalle est soit dans une note, soit délibérément dans
drop_lines). - Format de la note (écrit dans la langue du deck) :
Extrait d'enregistrement 1:31:02–1:33:05 : [1:31:02] Artyom : … [1:31:09] Stanislav : … 1–2 lignes de remarques : texte du tableau, écarts de nombres, clarifications de noms. - Limite de 4000 caractères. Si plus long, raccourcissez avec "[…]" ou divisez la diapositive, comme l’utilisateur l’a décidé à l’étape 0.
Étape 8. Assemblage dans Claude Slides
- Créez un artefact à partir du type Slides (Artifact quickstart, intent slides) et suivez son SKILL.md. Ce qui importe d’après l’expérience (règles de type en octobre 2026) :
- d’abord
deck.jsonavec l’ordre complet et les sections (une section par intervention), puis le contenu complet.
- d’abord
Étape 9. Vérification finale
- Lisez le deck du début à la fin comme un spectateur : la chronologie, les transitions, les titres, les notes.
- Questions à vérifier :
- Chaque intervention a-t-elle une diapositive de section ?
- Les Q&R sont-elles séparées ?
- Les publicités des hôtes sont-elles ignorées ?
- Les publicités des orateurs sont-elles mentionnées brièvement ?
- Les diapositives animées sont-elles toutes présentes ?
- Les points clés généraux sont-ils marqués comme synthèse ?
- Les incohérences de nombres sont-elles notées ?
- Les liens sont-ils vérifiés (date dans le pied de page) ? Les introuvables sont-ils marqués ?
- Les notes respectent-elles la limite de 4000 caractères ?
- Si tout est correct, marquez la tâche comme terminée.
Si pipeline/ est indisponible
- Si le dossier
pipeline/est vide ou manquant dans la racine du projet, le projet n’est pas initialisé. Clonez-le depuis le dépôt et indiquez à l’utilisateur où se trouve le dépôt.
[Le reste de la compétence est tronqué pour la traduction]