Communitygithub.com

egitim-videosu

Crée des vidéos éducatives YouTube 1080p avec narration, animations et sous-titres à partir d'un document (docx, pdf, md, txt, Claude Doc).

Qu'est-ce que egitim-videosu ?

Cet outil transforme un document pédagogique (PDF, DOCX, Markdown, etc.) en une vidéo YouTube éducative complète, avec narration en turc (voix naturelle Chatterbox, MIT), animations, sous-titres et jaquette. Il gère aussi les longs documents en une seule vidéo avec chapitres ou en série. Le processus automatisé inclut la création d'un plan, d'un scénario, d'un storyboard, de la synthèse vocale, du rendu vidéo 1080p et d'un contrôle qualité automatique. L'outil est gratuit et open-source, fonctionne sans GPU ni API payante, et est idéal pour les enseignants, formateurs et créateurs de contenu qui souhaitent produire rapidement des cours vidéo professionnels à partir de leurs supports écrits.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/alpay-web/egitim-videosu/tree/main

Demander à votre IA préférée

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

Documentation

Générateur de Vidéos Éducatives

Document → carte de couverture → plan → scénario → test de couverture → storyboard → narration → vidéo → contrôle → livraison. Aucun GPU ni API payante nécessaire. Code : https://github.com/alpay-web/egitim-videosu

0. Préparation

Version : cat $R/VERSION (modifications dans CHANGELOG.md). À chaque push, le job Test (tests unitaires + courte vidéo) s'exécute ; s'il est rouge, corrigez-le d'abord. Les erreurs de scénario (mauvais type, débordement goster, hors cevap_cumle) sont détectées avant chaque rendu. Lorsque vous apportez une amélioration permanente au package : mettez à jour VERSION et CHANGELOG.md, pushez, puis exécutez le job surum.yml.

[ -d /tmp/egitim-videosu ] || git clone --depth 1 https://github.com/alpay-web/egitim-videosu /tmp/egitim-videosu
R=/tmp/egitim-videosu
pip install -q -r $R/requirements.txt 2>/dev/null || pip install -q --break-system-packages -r $R/requirements.txt

1. Comprendre le document → carte de couverture

python $R/scripts/belge_oku.py belge.pdf -o belge.md     # PDF/Word/PowerPoint/Excel/HTML/EPUB → belge.md + belge_harita.md

Ordre de lecture : markitdown (MIT) → pandoc → pdftotext. belge_harita.md donne pour chaque titre le nombre de mots, le nombre de tableaux et une suggestion de scène ; il avertit pour les PDF scannés (très peu de texte par page) — dans ce cas, demandez un OCR, ne fabriquez rien. Lien Claude Doc / artifact : lisez avec les outils docs, enregistrez le texte en .md et exécutez la même commande. Chaque ligne de la carte est soit mappée à une scène, soit notée comme « exclue : raison ». Vitesse d'élocution ≈ 130 mots/min ; durée d'explication estimée = mots de contenu ÷ 130 × 0,6 (marge de résumé).

2. Plan et approbation (avant les étapes coûteuses)

  • Par défaut : l'intégralité du document en UNE SEULE VIDÉO (l'utilisateur préfère cela). Pour un document long, cela peut durer 30–40 min ; on navigue avec les marqueurs temporels des chapitres YouTube. Ordre : accroche + feuille de route → stratégie → leçons thématiques (chaque leçon : scène de règle + question « Teste-toi ») → vocabulaire → exemples de lecture/écoute/expression → test → conclusion. Tous les exercices ne sont pas lus ; 1–2 questions représentatives sont sélectionnées par bloc, le reste est mentionné comme « exercices dans le guide ».
  • Série (vidéos de 5–8 min) uniquement si l'utilisateur le demande. Les narrations précédentes sont automatiquement réutilisées (voir « Cache vocal » ci-dessous).
  • Présentez un plan court à l'utilisateur (chapitres, durée estimée, types de scènes) et montrez qu'aucun titre n'est ignoré. Ne passez pas à la narration sans approbation (si l'utilisateur a dit « continuez », avancez directement).

3. Écrire le scénario → senaryo.json (exemple : $R/ornek/senaryo_b1.json)

L'art du scénario (obligatoire) :

  • Commencez par une accroche (5 premières secondes) : un fait surprenant, un risque ou une question ; ajoutez "kanca": "phrase percutante courte" à la première scène — elle s'affiche en grand sur le tableau jusqu'à l'arrivée du premier élément (le tableau ne reste jamais vide). Interdits : « Bonjour, dans cette vidéo… », « Aujourd'hui, nous allons apprendre… ». Accroche → pourquoi c'est important → feuille de route.
  • Structure : accroche → mise en contexte (pourquoi s'en soucier) → développement → point culminant (moment « ah ») → conclusion (une phrase résumée + appel à l'action). Les transitions entre scènes ne sont pas « et ensuite » mais « donc / mais ».
  • Budget de mots : ~130 mots/min ; 50–110 mots par scène. Phrases courtes, vouvoiement « tu », langage parlé.
  • Un événement visuel toutes les 8–10 secondes : nouvel élément/ligne/carte/étape ou question.
  • Performance vocale : ajoutez "ton" à la scène : "merakli" (intro), "canli" (tactique), "ciddi" (avertissement), "sakin" (conclusion). Après une phrase importante, ajoutez [dur] (0,9 s de silence). Les questions/exclamations s'allongent naturellement.
  • Fidélité : uniquement les informations du document ; n'inventez pas de chiffres ou de règles.

Types de scènes — choisissez selon la forme du contenu (n'utilisez pas le même type 3 fois de suite) :

{"baslik": "...", "maddeler": ["≤40 caractères", "..."], "anlatim": "...", "goster": [0, 2, 3]}
{"baslik": "...", "tur": "tablo", "tablo": {"basliklar": ["Si tu vois", "Réponse"], "satirlar": [["since", "have + V3"]], "stil": "yanlis-dogru"}}
{"baslik": "...", "tur": "rakam", "kartlar": [{"deger": "30", "birim": "minutes", "etiket": "Durée de l'examen"}]}
{"baslik": "...", "tur": "karsilastirma", "sol": {"baslik": "À l'écoute", "renk": "mavi"}, "sag": {"baslik": "À la lecture", "renk": "yesil"}, "satirlar": [["gauche", "droite"]]}
{"baslik": "...", "tur": "zaman", "adimlar": [{"baslik": "Jour 1", "metin": "Grammaire"}]}
{"baslik": "...", "tur": "ipucu", "ipucu": {"tip": "ipucu|uyari|not", "metin": "Un seul message fort"}}
{"baslik": "Teste-toi 1/3", "tur": "soru", "soru": {"metin": "Yes, ___.", "secenekler": ["I'm", "I am", "I do"], "dogru": 1, "cevap_cumle": 2, "bekle": 4}}
  • maddeler : liste/résumé. tablo : tableaux du document, « si tu vois → réponse », listes vrai/faux. rakam : 1–3 chiffres marquants (durée, score, quantité). karsilastirma : deux côtés (d'abord la colonne de gauche, puis la droite s'ouvre ; goster = lignes de gauche + lignes de droite respectivement). zaman : étapes/plan/processus (vertical pour ≥4 étapes). ipucu : un seul message percutant. soru : à partir des exercices ; lisez la question et les options à VOIX HAUTE (« {Le musée} blanc {en 1890}. Options : A, {built} ; B, {was built} ; C, {has built}. »), cevap_cumle = index de la phrase « La bonne réponse… » ; avant, compte à rebours, puis bonne option en vert + « ding ».
  • TOUT CE QUI EST ÉCRIT À L'ÉCRAN EST LU (obligatoire) : les deux colonnes du tableau, les deux côtés de la comparaison, l'étiquette de la carte numérique, la question et les options doivent figurer dans la narration. Consacrez une phrase séparée à chaque élément (rythme des éléments). Si --kontrol donne un avertissement « non lu », corrigez la narration. Écriture goster : la vidéo ouvre chaque élément à la phrase où il est lu, au moment où ce mot est prononcé (oto_goster) ; il y a au moins 1,2 s entre deux éléments consécutifs.
  • Anglais entre {accolades} (obligatoire) : « {had better} », « {I'm late, aren't I?} ». L'intérieur des accolades est généré en anglais (en) par Chatterbox, l'extérieur en turc ; la même voix de référence, niveaux égalisés (Chatterbox ne peut pas changer de langue en un seul appel : resemble-ai/chatterbox#346). N'ajoutez pas de suffixes turcs aux mots anglais (pas « {had better}'dan », mais « du modèle {had better} »). Pour marquer automatiquement l'ébauche, utilisez --ingilizce-isaretle (wordfreq), puis révisez : des mots turcs comme « not », « on » peuvent être mal marqués ; ajoutez manuellement de courtes expressions comme « {at} », « {I am} ».
  • goster : dans quelle phrase (à partir de 0) chaque élément s'ouvre ; le pointeur se déplace à ce moment-là (--tik si léger clic). Synchronisation des mots (par défaut) : l'élément s'ouvre non pas au début de la phrase, mais lorsque le premier mot significatif de l'élément est prononcé (si l'horodatage du mot Whisper est présent dans SS_CC.json, c'est seconde précise ; sinon, basé sur sa position dans la phrase). Ancrage manuel : "3:enough" (au mot « enough » de la 3ème phrase) ou 2.5 (au milieu de la 2ème phrase). Pour désactiver : --kelime-senkron-yok.
  • L'écran précède le son (règle de la vidéo explicative) : que la parole ne commence pas sur un tableau vide, qu'il n'y ait rien de nouveau sur le tableau pendant plus de 14 secondes. Si le premier élément arrive tard, la vidéo affiche la première phrase en grand comme texte d'introduction sur le tableau (fournissez le texte dans le champ "giris" ; pour désactiver : --giris-yok).
  • bolum : pour une scène qui commence un chapitre, écrivez "bolum": "Grammaire 5 : Passive". Il apparaît dans la barre inférieure du tableau, une ligne de chapitre apparaît dans la barre de progression et la liste des chapitres YouTube est automatiquement générée. Ajoutez youtube_baslik (≤100 caractères) et etiketler au scénario.
  • telaffuz : noms d'abréviations/niveaux en lettres turques (« B1 » : « be bir », « C1 » : « se bir », « IELTS » : « ay elts », « A » : « a », « B » : « be »). Pour les mots anglais, n'ÉCRIVEZ PAS la prononciation, utilisez {…}. telaffuz_kok : {« fiil » : « fiyil »}. Au lieu de « şık » que Chatterbox prononce mal, écrivez « seçenek ».

4. Test de couverture (idée PresentQuiz)

À partir de la source, extrayez 8–10 questions critiques des sections couvertes par la vidéo (uniquement basées sur le document). Vérifiez une par une si la réponse à chacune apparaît dans le scénario. Si une question critique reste sans réponse, ajoutez-la au scénario ou indiquez explicitement dans la livraison que vous l'avez délibérément exclue.

5. Storyboard + contrôle (étape d'approbation)

python $R/scripts/video_uret.py senaryo.json --kontrol [--ses-dizini sesler]  # rapport d'uniformité + DISPOSITION + SYNCHRONISATION
python $R/scripts/video_uret.py senaryo.json --storyboard storyboard.png  # état final de chaque scène, en une seule image

Les rapports --kontrol vérifient : disposition (texte débordant/coupé, police < 30 px, options/cartes ne tenant pas) et synchronisation (temps mort : la parole a commencé mais le tableau est vide ; écran figé : pas de nouvel élément pendant 14+ secondes). Exécutez à nouveau avec --ses-dizini après la génération audio pour les durées réelles. Ne laissez pas d'avertissement de disposition. Regardez le storyboard : débordement, superposition, tableau vide, mauvais type. Corrigez, montrez à l'utilisateur, obtenez l'approbation.

6. Narration (Chatterbox, MIT) — --kalite 3 Le portail Whisper vérifie chaque phrase

A) GitHub Actions (rapide, parallèle ; nécessite un accès en écriture au dépôt) : commitez le scénario sous senaryolar/<nom>.json, puis :

curl -X POST -H "Accept: application/vnd.github+json" -H "Content-Type: application/json" \
  https://api.github.com/repos/alpay-web/egitim-videosu/actions/workflows/ses_uret.yml/dispatches \
  -d '{"ref":"main","inputs":{"senaryo":"senaryolar/<nom>.json","etiket":"ses-<nom>","parcalar":"[\"1-3\",\"4-6\",\"7-9\",\"10-12\",\"13-15\"]"}}'
curl -fsSL -o sesler.zip https://github.com/alpay-web/egitim-videosu/releases/download/ses-<nom>/sesler.zip && unzip -q sesler.zip -d sesler

Cache vocal (adressé par contenu, idée manim-voiceover) : chaque dossier vocal contient dizin.json qui associe phrase → résumé de texte. Ajouter/supprimer/réorganiser des scènes ne rend pas les anciens fichiers vocaux inutiles ; une phrase dont le texte a changé n'utilise jamais l'ancien fichier. Flux :

python $R/scripts/video_uret.py senaryo.json --eksik --ses-dizini ancien1,ancien2   # quelles phrases manquent ? donne les parties + --cumleler

Donnez l'entrée "taban":"ses-b1-tam-kurs,ses-<nom>" au workflow : si le même texte existe dans ces releases, il est copié ; seules les phrases nouvelles/modifiées sont synthétisées. Plusieurs dossiers peuvent être donnés lors du rendu : --ses-dizini sesler,ancien_sesler. Pour étiqueter un ancien dossier (sans index.json) : --dizin-olustur DOSSIER (si vous êtes sûr qu'il appartient à ce scénario). Brouillon : pour un contrôle visuel/temporel sans attendre la narration, utilisez --ses sessiz pour une vidéo brouillon 720p. B) Dans cet environnement (lent, ~10 min/1 min de vidéo) : python $R/scripts/video_uret.py senaryo.json --sadece-ses sesler --ses chatterbox --kalite 3 (exécutez en arrière-plan). Dans kalite_raporu.txt, corrigez la prononciation des phrases dont le score est < 0,8 et régénérez-les uniquement avec --cumleler 04_05,06_07.

7. Vidéo

python $R/scripts/video_uret.py senaryo.json -o video.mp4 --ses-dizini sesler     # 1080p + video_kapak.jpg

Par défaut : professeur de dessin simple (au pupitre), caméra lente, pointeur, « ding » uniquement pour la bonne réponse, pas de musique. Son propre (pas de frottement de micro/clic) : les clips de phrases se fondent avec des fondus doux ; la chaîne inclut adeclick, afftdn (réduction de bruit légère) et deesser ; l'effet de « clic » sur la parole est désactivé par défaut. Bruit (solution générale, en couches) : (1) le job de narration nettoie chaque phrase avec DeepFilterNet3 (scripts/ses_temizle.py, suppression max 30 dB ; pour les anciens fichiers, ses_temizle.yml), (2) klip_temizle coupe les queues de début/fin de phrase et les longues zones de souffle, (3) agate dans la chaîne de rendu supprime les résidus entre les mots. Nettoyage souffle/frottement (par défaut) : Chatterbox ajoute parfois à la fin de certaines phrases une queue de souffle/frottement de faible niveau, aiguë (4–7 kHz), durant 0,5–2 s ; klip_temizle coupe les queues non voisées situées 24 dB en dessous du pic de la parole et réduit de 24 dB les souffles ≥150 ms à l'intérieur des phrases. Les sons comme « s/ş » en fin de phrase sont préservés car plus forts. Pour désactiver : --temizleme-yok. Synchronisation labiale : la bouche du professeur dessiné ne s'ouvre et ne se ferme pas simplement ; à partir des bandes de formants de l'audio, la forme 'a' (ouverte), 'o' (ronde) et 'i' (large, dents visibles) est choisie pour chaque image. Aucun modèle requis, n'affecte pas le temps de rendu. (Les visages réalistes parlants comme SadTalker/Wav2Lip/LivePortrait nécessitent un GPU et ralentissent considérablement la production.) Options : --tik, --muzik, --efekt-yok, --kamera-yok, --altyazi-yok, --karakter chemin.json (personnage photo), --sahne 2-3 --cozunurluk 720 (essai rapide).

8. Contrôle (obligatoire avant livraison, maximum 2 tours de correction)

python $R/scripts/kalite_raporu.py video.mp4      # durée, LUFS/crête, silence, images noires/figées + tableau d'images

Regardez le tableau d'images. Rédigez sérieusement les constatations (critique / suggestion) et apportez une correction concrète à chacune (« Tableau de la scène 6 : titres superposés → raccourcir les titres ») ; n'écrivez pas de constat vague comme « peut-être un peu long ». Notez le tableau d'images selon 5 critères de TheoremExplainAgent (1–5) : précision (fidèle au document ?), intérêt visuel (le tableau montre-t-il ce qui est expliqué ?), flux (les sujets sont-ils dans un ordre logique ?), disposition (débordement/superposition ?), cohérence (couleur, police, style identiques ?). Pour chaque critère inférieur à 4, apportez une correction concrète. Corrigez les critiques, régénérez ; après 2 tours, indiquez clairement dans la livraison ce qui reste.

9. Livraison

La vidéo écrit également le package de publication à chaque rendu : video.srt (sous-titres YouTube ; ≤2 lignes × 42 caractères) et video_youtube.txt (titre, description avec chapitres, tags, mention IA). Envoyez MP4 + jaquette + .srt + youtube.txt ; indiquez la durée, le nombre de scènes et les chapitres couverts. Rappelez que le SRT sera téléchargé dans YouTube Studio > Sous-titres et que la case « contenu modifié/généré par IA » sera cochée.

Skills associés