Communitygithub.com

chuonglife/lesson-video-producer-skill

Transforme un jeu de diapositives de leçon (slides.json + .pptx + images de diapositives du skill lesson-slide-designer) en une vidéo de leçon narrée complète (1080p mp4) avec une voix de synthèse locale (Kokoro pour l'anglais et d'autres langues, VieNeu pour le vietnamien). Chaque carte et étape apparaît en synchronisation avec la narration, avec des transitions variées, des cercles d'attention dessinés à la main, des effets sonores et un fond musical piano en ducking, des comptes à rebours pour pauses, des sous-titres .vtt/.srt séparés, des enregistrements d'écran réels avec défilement fluide pour les leçons pratiques, et un rapport de qualité mesuré. Suit les normes de vidéos pédagogiques (un sujet par vidéo, script, introduction-corps-conclusion, transitions, interaction). Ne re-rend que les diapositives modifiées. Utilisez ce skill chaque fois que l'utilisateur souhaite créer, rendre ou exporter une vidéo de leçon, une vidéo de cours, une conférence Udemy, un diaporama narré, une voix-off pour diapositives, une explication à partir d'un deck, ou un enregistrement d'écran dans une leçon, même s'il dit simplement « transforme ces diapositives en vidéo ». Pas pour créer les diapositives ou écrire...

Qu'est-ce que lesson-video-producer-skill ?

Ce skill transforme un jeu de diapositives de leçon (slides.json, .pptx et images de prévisualisation générées par le skill lesson-slide-designer) en une vidéo pédagogique complète au format 1080p mp4. Il utilise une synthèse vocale locale (Kokoro pour l'anglais et d'autres langues, VieNeu pour le vietnamien) pour lire la narration. Chaque carte, étape ou ligne apparaît en synchronisation avec la voix, avec des transitions variées, des cercles d'attention dessinés à la main, des effets sonores subtils et un fond musical piano en ducking. Il produit également des fichiers de sous-titres séparés (.vtt/.srt), des enregistrements d'écran réels avec défilement fluide pour les leçons pratiques, et un rapport de qualité complet. Le skill suit les normes de production vidéo pédagogique : un sujet par vidéo, script, structure introduction-corps-conclusion, transitions et interaction. Il optimise le rendu en ne re-rendant que les diapositives modifiées, ce qui le rend particulièrement efficace pour les itérations. Utilisez ce skill dès que vous avez besoin de créer une vidéo de cours, une conférence Udemy, un diaporama narré ou une voix-off, même si la demande est aussi simple que « transforme ces diapositives en vidéo ».

Compatible avec~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/chuonglife/lesson-video-producer-skill/tree/HEAD

Demander à votre IA préférée

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

Documentation

Producteur de Vidéos de Leçon

Transformez le jeu de diapositives d'une leçon en une vidéo pédagogique finie : une voix de synthèse lit la narration, chaque carte, étape ou ligne apparaît exactement quand la voix l'atteint, les transitions varient, des effets sonores doux marquent chaque révélation, un fond musical piano s'efface sous la voix, un compte à rebours s'affiche là où les apprenants font une pause, les éléments clés sont entourés d'un cercle dessiné à la main, les sous-titres sont fournis dans des fichiers séparés, et de véritables enregistrements d'écran s'insèrent dans les leçons pratiques. Une leçon à la fois ; exécutez-la, regardez-la, puis remettez-la.

Entrée, provenant du skill lesson-slide-designer : slides/<cours>/<leçon>/slides.json, <nom_fichier>.pptx et _preview/diapo-NN.png. S'ils sont manquants, construisez d'abord le deck. Les decks de l'édition vietnamienne (kieu, loi_doc, _kiem/) sont également lus.

Sortie dans videos/<cours>/<leçon>/ (reflète le chemin des diapositives ; sinon <dossier slides>/video/) :

FichierCe que c'est
<nom_fichier>.mp4La vidéo : 1920x1080, 30 ips, H.264, AAC 48 kHz, -16 LUFS
<nom_fichier>.<langue>.vtt / .srtSous-titres dans des fichiers séparés, jamais incrustés (ils couvriraient le texte des diapositives) ; téléchargez le .vtt comme légendes
<nom_fichier>.narration.txtNarration propre, un temps de parole par ligne ; `
<nom_fichier>.storyboard.json / .mdCe qui se passe et quand : régions mesurées à partir du pptx, ligne sur laquelle chacune apparaît, effets, transitions, cercles, zooms, comptes à rebours ; le .md est pour une vérification visuelle
<nom_fichier>.voice.mp3 + .timeline.jsonLa narration et les instants exacts de début et de fin de chaque ligne (lignes mises en cache dans .voice.mp3.cache/)
<nom_fichier>.events.json, .audio.mp3Événements sonores et le mix à trois couches
video.json (optionnel, vous l'écrivez)Surcharges par diapositive : lignes de révélation, transition, maintien, cercle, zoom, enregistrement d'écran
_check/contact-NN.png (images de la vidéo finie), <nom_fichier>.report.md (mesures), voice-review.txt (Whisper), voice-exceptions.txt
_segments/Un segment rendu par diapositive, réutilisé lorsque cette diapositive n'a pas changé

Outils : Python 3.10+ avec python-pptx, numpy, Pillow (opencv-python pour lisser les enregistrements, faster-whisper pour la revue vocale) ; Node 18+ avec puppeteer-core (npm install dans assets/engine) et Chrome, Chromium ou Edge ; ffmpeg/ffprobe. Voix : Kokoro (pip install kokoro soundfile) ou VieNeu-TTS, tous deux sous licence Apache 2.0 et locaux. Si un moteur réside dans son propre environnement virtuel, définissez KOKORO_PYTHON ou VIENEU_PYTHON vers ce Python. Un GPU aide mais est optionnel.

Flux de travail

Étape 0. Lire le deck et préciser le brief

  1. Lisez slides.json (narration, notes de production, types de diapositives) et jetez un œil à _preview/contact-sheet.png. Si la source de la leçon existe, lisez-la pour savoir où les apprenants pratiquent et où on leur pose des questions.
  2. Lisez references/video-standards.md (la norme : un sujet, script, introduction-corps-conclusion, transitions, interaction) et references/motion-and-sound.md (ce que chaque type de diapositive reçoit, et pourquoi la vidéo doit bouger sans devenir chargée).
  3. Précisez : la langue et la voix (language dans slides.json ; l'anglais par défaut utilise Kokoro am_michael, af_heart pour une voix féminine, les autres langues Kokoro par préfixe de voix, le vietnamien vers VieNeu) ; si la leçon a besoin d'enregistrements d'écran réels (toute leçon qui enseigne des clics, de la frappe ou un logiciel : oui, voir Étape 2) ; quelles diapositives de questions font une pause et pendant combien de temps ; quoi entourer d'un cercle ou zoomer. La narration a été écrite pour la synthèse vocale dans l'étape de diapositive. Ne réécrivez pas le contenu pédagogique ici ; corrigez seulement la prononciation d'un mot lorsque la voix se trompe.

Étape 1. Construire le storyboard et le vérifier

python scripts/storyboard.py slides/<cours>/<leçon>/slides.json

Lisez <nom_fichier>.storyboard.md : régions par diapositive, ligne sur laquelle chacune apparaît, transitions, maintiens, cercles. Vérifiez-le par rapport à la section 4 de motion-and-sound.md : la troisième carte apparaît quand la voix atteint la troisième idée ; les voisins ne partagent jamais une transition ; les diapositives de questions font une pause ; une note comme « entoure la réponse B » a produit un cercle. Corrigez avec video.json (voir templates/video.example.json) et relancez. « Aucune région trouvée » signifie que la diapositive apparaît entière : c'est bien pour image, vérifiez le pptx pour les autres types.

Étape 2. Enregistrements d'écran réels (leçons pratiques, pratiques et logicielles)

Lorsque la leçon enseigne une action, montrez l'action réelle. Ne la remplacez jamais par une capture d'écran ou une page simulée. Règles dans references/screen-recording.md. En bref :

  1. Préparez la fenêtre : une fenêtre de navigateur privée ou un compte propre, pas de notifications, pas de vrais noms dans les barres latérales. Sous Windows, python scripts/record_screen.py --list donne les titres des fenêtres.
  2. Enregistrez : python scripts/record_screen.py videos/<cours>/<leçon>/clips/S07-nom.mp4 --window "<titre>" --seconds 40 --size 1280x720 [--crop-top 90] [--scroll "6:200:4"] (Windows ; ailleurs, utilisez OBS ou ffmpeg). Conduisez vous-même les clics et la frappe via les outils du navigateur, ou laissez l'utilisateur le faire. Défilez uniquement avec --scroll ou un défilement fluide dans la page (window.scrollBy({top: 200, behavior: 'smooth'}) toutes les 0,6 à 0,8 s), jamais pas à pas. Restez immobile 3 à 5 s après chaque résultat ; faites défiler les longs résultats lentement (150 à 250 px/s) pour que les apprenants puissent les lire.
  3. check_motion.py s'exécute après chaque enregistrement. Tout saut restant : python scripts/smooth_scroll.py <entrée> <sortie>, puis mesurez à nouveau jusqu'à zéro. Regardez la bande supérieure du clip pour les noms de compte et les onglets errants.
  4. Déclarez-le dans video.json : "S07" : {"clip" : {"file" : "clips/S07-nom.mp4", "mode" : "frame", "speed" : "auto"}}. La diapositive doit être une diapositive image ou two-column avec un grand cadre ; mettez la première image du clip dessus (composite_clips.py --first-frame clips/S07-nom.mp4 slides/<cours>/<leçon>/S07-first-frame.png) et reconstruisez le deck, afin que le clip fonde sans saut.
  5. Exécutez make_video.py ... --extend : cela ajoute du silence là où un enregistrement dure plus longtemps que sa narration. N'accélérez jamais un enregistrement au-delà de 1,25x.

Étape 3. Rendre avec une seule commande

python scripts/make_video.py slides/<cours>/<leçon>/slides.json [--extend]

Neuf étapes : storyboard, narration (via gpu_lock.py), vérification Whisper, plan de rendu, mix à trois couches, image (Chrome headless, diapositive par diapositive), enregistrements d'écran, sous-titres, vérification finale. Lancez-le en arrière-plan pour les leçons de plus de 3 minutes (le rendu prend environ une à deux minutes par minute de vidéo la première fois, quelques secondes pour une correction au niveau d'une diapositive). Quand il s'arrête :

  • Vérification vocale (_check/voice-review.txt) : Whisper écoute le fichier entier une fois, puis seules les lignes suspectes sont régénérées et revérifiées, jusqu'à 3 tours. Il filtre ses propres erreurs sur les mots courts, les phrases qu'il invente sur la musique, et tout ce qu'une deuxième écoute focalisée entend correctement ; il s'arrête uniquement sur les longs mots, les termes, les noms ou plusieurs mots à la suite. Écoutez l'endroit (ffmpeg -ss 1:23 -t 4 -i <voice.mp3> clip.wav). Si la voix est erronée, ajoutez une réécriture à PRONUNCIATION dans make_voice.py (les légendes conservent l'orthographe réelle) ou modifiez le mot dans slides.json ; si Whisper a mal entendu, ajoutez le mot à _check/voice-exceptions.txt. Puis --from-step 2 (les lignes mises en cache ne sont pas régénérées).
  • Échec de la vérification finale (_check/<nom_fichier>.report.md) : corrigez la cause (volume sonore avec --music-db, sauts en lissant l'enregistrement, longueur en re-rendant) et relancez à partir de cette étape.

Étape 4. Regarder avant de rapporter

  1. Regardez _check/contact-NN.png (trois images par diapositive : arrivée, stable, sur le point de partir) avec la liste de contrôle dans references/quality-checks.md : un cachet laissé sur le texte, du texte coupé par un zoom, deux diapositives visibles en même temps pendant une transition, un compte à rebours sur du texte, un enregistrement hors de son cadre, une première image vide. Pour inspecter un moment de près : node assets/engine/render.mjs sheet <storyboard.json> <timeline.json> _check/zoom --from 40 --to 46 --every 0.25.
  2. Écoutez deux endroits : les 20 premières secondes et une transition (ffmpeg -ss 0 -t 20 -i <mp4> -vn test.mp3). Effets audibles mais clairement sous la voix, musique basse.
  3. Corrigez avec video.json ou les scripts, rendez à nouveau (seules les diapositives modifiées sont re-rendues), regardez à nouveau jusqu'à ce qu'un passage complet ne trouve rien. Ne rapportez jamais une vidéo comme terminée avant d'avoir regardé les feuilles de contact du rendu le plus récent.

Étape 5. Rapporter

Donnez à l'utilisateur : les chemins du mp4 et du vtt ; la durée réelle ; la voix et le débit (mots par seconde) ; les diapositives, effets, pauses ; le rapport de vérification (verdict, LUFS, sauts) ; quels enregistrements ont été composités ; les mots ajoutés à la table de prononciation ou aux exceptions Whisper ; les avertissements restants et pourquoi. Montrez une feuille de contact.

Plusieurs leçons à la suite

Gardez la voix, le niveau musical et les sons cohérents d'un cours à l'autre ; les leçons ne doivent pas différer de plus de 1,5 LU (comparez la ligne LUFS de chaque rapport). La table de prononciation et les exceptions Whisper s'agrandissent avec le temps ; ne les réinitialisez pas. Conservez les enregistrements dans videos/<cours>/<leçon>/clips/, un nouveau nom de fichier par prise. Un deck divisé en vidéos thématiques (V<k>-<nom>/slides.json) est rendu un sous-deck à la fois.

Principes

  • La norme est fixe (video-standards.md) : un sujet par vidéo, un script, introduction-corps-conclusion, transitions parlées entre les parties, interaction. Le rythme, l'image et le son sont là où vous créez.
  • L'image et la voix se complètent ; la voix ne lit jamais la diapositive. Une région apparaît quand la voix l'atteint ; le texte qui est lu ne bouge pas.
  • Pauses en accord avec l'écran : une narration qui dit « mettez la vidéo en pause » obtient un maintien de 3 s et pas de compte à rebours (l'apprenant appuie sur pause ; un chronomètre à côté d'une étiquette « 60 secondes » le contredirait). Une question sans cette phrase fait une pause pour la durée indiquée, au maximum 60 s, avec un compte à rebours.
  • Cercles d'attention : les réponses et notes comme « entoure B » obtiennent un cercle délibéré ; une idée lue avec un mot d'emphase obtient un cercle automatique qui s'estompe ; des ellipses pour les cartes, des boîtes arrondies pour les lignes ; au maximum trois par diapositive.
  • Curseur désactivé par défaut. Un pointeur dessiné est perçu comme une souris errante par la plupart des spectateurs. Activez-le avec {"_all" : {"cursor" : true}} dans video.json pour les vidéos de démonstration ; il se déplace sur des courbes, reste en dehors du texte et n'apparaît jamais sur les diapositives de titre, de section, de message clé ou de clôture.
  • Vivant, pas chargé : quelque chose change toutes les 5 à 10 secondes et rien ne reste immobile plus de 25 secondes ; mais un point focal par image, pas de rotations ou de retournements, au maximum 16 effets sonores par minute, des sons de transition uniquement lors des changements de diapositives, musique de 17 à 23 dB sous la voix.
  • La voix est la qualité que les gens entendent en premier. Ne faites pas d'étirement temporel sur un modèle qui sonne mal étiré (VieNeu) ; ralentissez-le avec des pauses plus longues à la place. La vérification Whisper n'est pas optionnelle : un terme mal prononcé est une erreur pédagogique.
  • Les sous-titres sont des fichiers séparés, jamais incrustés.
  • Le contenu ne change pas à l'étape vidéo : pas de nouvelles idées, pas de chiffres inventés. Un problème de narration retourne à l'étape de la leçon ou de la diapositive.
  • Exécutez, mesurez, regardez avant de remettre : volume sonore, sauts, durée, feuilles de contact.
  • Un enregistrement est un enregistrement : pas de captures d'écran remplaçant des actions ; le défilement doit être mesuré comme fluide.
  • Pour ajouter une transition, un effet ou un son : étendez assets/engine/video.js, les tables dans scripts/storyboard.py et references/motion-and-sound.md, rendez un test, regardez-le, puis utilisez-le.

Références

  • references/video-standards.md : la norme pédagogique pour les supports d'apprentissage audio et vidéo, mappée aux types de diapositives, plus les spécifications de plateforme (Udemy et similaires).
  • references/motion-and-sound.md : comment les régions et les actions sont déduites, le tableau des types de diapositives, les chiffres de mouvement, la bande sonore, la syntaxe video.json, comment garder les apprenants éveillés.
  • references/narration-voice.md : Kokoro et VieNeu, rythme, corrections de prononciation, la vérification Whisper.
  • references/screen-recording.md : enregistrer une fenêtre, défilement fluide, mesurer et lisser les sauts, composition, confidentialité.
  • references/quality-checks.md : seuils de la vérification finale et liste de contrôle de la feuille de contact.
  • templates/video.example.json : surcharges par diapositive.

Skills associés