📚 Introduction
Dans ce cours, vous allez apprendre à créer des vidéos éducatives professionnelles en utilisant uniquement des outils gratuits et des APIs libres. Cette méthode permet de générer automatiquement des vidéos avec:
- ✅ Synthèse vocale (Text-to-Speech)
- ✅ Images générées par IA
- ✅ Animations et transitions
- ✅ Sous-titres automatiques
- ✅ Musique de fond
🛠️ Les Outils Gratuits
🎨 Pollinations.ai
API gratuite de génération d'images par IA. Pas de clé API nécessaire, pas de limite.
Imageshttps://image.pollinations.ai/prompt/
{votre_description}
🗣️ Edge-TTS
Synthèse vocale gratuite de Microsoft. Voix naturelles en français, aucune limite.
Audionpm install -g edge-tts
🎥 FFmpeg
Outil puissant pour créer, éditer et convertir des vidéos. Open source et gratuit.
Vidéohttps://ffmpeg.org/download.html
🤖 ChatGPT/Claude (Gratuit)
Génération de contenu éducatif. Versions gratuites suffisantes pour créer du contenu.
Contenu🖼️ Picsum Photos
Photos gratuites et libres de droits via API simple.
Imageshttps://picsum.photos/1920/1080
📝 Node.js
Environnement JavaScript gratuit pour automatiser tout le processus.
Automation⚙️ Workflow de Génération
Création du Contenu
Définir le sujet et générer le script avec ChatGPT/Claude. Structurer en slides avec texte et descriptions d'images.
Génération des Images
Utiliser Pollinations.ai pour générer automatiquement les images basées sur les descriptions.
Synthèse Vocale
Convertir chaque texte en audio avec Edge-TTS (voix française naturelle).
Assemblage Vidéo
Combiner images + audio avec FFmpeg, ajouter transitions, sous-titres et musique.
Export Final
Générer la vidéo MP4 finale, optimisée pour YouTube, TikTok ou Instagram.
💻 Structure du Code
1. Structure de Données
Voici comment structurer votre contenu de cours:
const coursData = {
titre: "Introduction à la Photosynthèse",
voix: "fr-FR-VivienneMultilingualNeural",
slides: [
{
texte: "Qu'est-ce que la photosynthèse?",
narration: "La photosynthèse est le processus par lequel les plantes...",
imagePrompt: "illustration scientifique d'une plante avec le soleil, style éducatif",
duree: 5 // secondes
},
{
texte: "Les étapes clés",
narration: "La photosynthèse se déroule en deux phases principales...",
imagePrompt: "schéma des étapes de la photosynthèse avec flèches colorées",
duree: 7
}
// ... autres slides
]
};
2. Génération d'Images
async function genererImage(prompt, outputPath) {
const url = `https://image.pollinations.ai/prompt/${encodeURIComponent(prompt)}?width=1920&height=1080&nologo=true`;
const response = await fetch(url);
const buffer = await response.buffer();
await fs.writeFile(outputPath, buffer);
console.log(`✅ Image générée: ${outputPath}`);
}
3. Synthèse Vocale
async function genererAudio(texte, voix, outputPath) {
return new Promise((resolve, reject) => {
const commande = `edge-tts --voice "${voix}" --text "${texte}" --write-media "${outputPath}"`;
exec(commande, (error, stdout, stderr) => {
if (error) {
reject(error);
} else {
console.log(`✅ Audio généré: ${outputPath}`);
resolve();
}
});
});
}
4. Assemblage Vidéo avec FFmpeg
async function creerVideoSlide(imagePath, audioPath, outputPath) {
const commande = `ffmpeg -loop 1 -i "${imagePath}" ` +
`-i "${audioPath}" ` +
`-c:v libx264 -tune stillimage -c:a aac -b:a 192k ` +
`-pix_fmt yuv420p -shortest ` +
`-vf "scale=1920:1080:force_original_aspect_ratio=decrease,` +
`pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fade=t=in:st=0:d=0.5,fade=t=out:st=duration-0.5:d=0.5" ` +
`"${outputPath}"`;
return new Promise((resolve, reject) => {
exec(commande, (error) => {
if (error) reject(error);
else {
console.log(`✅ Slide vidéo créée: ${outputPath}`);
resolve();
}
});
});
}
5. Fusion de Tous les Segments
async function fusionnerVideos(videoPaths, outputPath) {
// Créer un fichier liste
const listeContenu = videoPaths
.map(path => `file '${path}'`)
.join('\n');
await fs.writeFile('liste_videos.txt', listeContenu);
const commande = `ffmpeg -f concat -safe 0 -i liste_videos.txt ` +
`-c copy "${outputPath}"`;
return new Promise((resolve, reject) => {
exec(commande, (error) => {
if (error) reject(error);
else {
console.log(`✅ Vidéo finale créée: ${outputPath}`);
resolve();
}
});
});
}
🎮 Démo Interactive: Générer une Image
⚡ Optimisations et Astuces
🚀 Performance
- Parallélisation: Générer images et audio en parallèle avec Promise.all()
- Cache: Stocker les images générées pour réutilisation
- Compression: Optimiser les vidéos avec les bons paramètres FFmpeg
// Génération parallèle de toutes les images
const imagePromises = slides.map((slide, index) =>
genererImage(slide.imagePrompt, `images/slide_${index}.png`)
);
const audioPromises = slides.map((slide, index) =>
genererAudio(slide.narration, voix, `audio/slide_${index}.mp3`)
);
// Attendre que tout soit généré
await Promise.all([...imagePromises, ...audioPromises]);
console.log('✅ Toutes les ressources générées!');
🎯 Sous-titres Automatiques
function genererSousTitres(slides) {
let srtContent = '';
let startTime = 0;
slides.forEach((slide, index) => {
const endTime = startTime + slide.duree;
srtContent += `${index + 1}\n`;
srtContent += `${formatTemps(startTime)} --> ${formatTemps(endTime)}\n`;
srtContent += `${slide.texte}\n\n`;
startTime = endTime;
});
return srtContent;
}
function formatTemps(secondes) {
const h = Math.floor(secondes / 3600).toString().padStart(2, '0');
const m = Math.floor((secondes % 3600) / 60).toString().padStart(2, '0');
const s = Math.floor(secondes % 60).toString().padStart(2, '0');
const ms = Math.floor((secondes % 1) * 1000).toString().padStart(3, '0');
return `${h}:${m}:${s},${ms}`;
}
📊 Comparaison: Gratuit vs Payant
| Fonctionnalité | Solution Gratuite | Solution Payante | Économie |
|---|---|---|---|
| Génération Images IA | Pollinations.ai | DALL-E 3 ($0.04/image) | ~$4/vidéo |
| Text-to-Speech | Edge-TTS | ElevenLabs ($22/mois) | $22/mois |
| Montage Vidéo | FFmpeg | Adobe Premiere ($24/mois) | $24/mois |
| Génération Contenu | ChatGPT Free | ChatGPT Plus ($20/mois) | $20/mois |
| Total mensuel | 0€ | ~66€ | 792€/an |
⚖️ Avantages et Limites
✅ Avantages
- Coût zéro absolu
- Automatisation complète
- Scalabilité infinie
- Contrôle total du code
- Pas de watermark
- Open source et modifiable
- Apprentissage des technologies
⚠️ Limites
- Configuration initiale nécessaire
- Qualité d'images variable
- Temps de traitement plus long
- Nécessite connaissances techniques
- Moins de contrôle créatif direct
- Debug parfois complexe
📦 Script Complet Fonctionnel
Voici un script Node.js complet et prêt à l'emploi:
const fs = require('fs').promises;
const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);
// Configuration du cours
const coursData = {
titre: "Les Planètes du Système Solaire",
voix: "fr-FR-VivienneMultilingualNeural",
slides: [
{
texte: "Le Système Solaire",
narration: "Notre système solaire contient huit planètes fascinantes",
imagePrompt: "beautiful solar system with 8 planets, space illustration",
duree: 4
},
{
texte: "Mercure - La Plus Proche",
narration: "Mercure est la planète la plus proche du Soleil",
imagePrompt: "planet Mercury close up, realistic space photography",
duree: 4
},
{
texte: "Jupiter - Le Géant",
narration: "Jupiter est la plus grande planète de notre système",
imagePrompt: "massive Jupiter with great red spot, stunning space view",
duree: 4
}
]
};
// Fonction principale
async function genererVideo() {
console.log('🎬 Démarrage de la génération...');
// 1. Créer les dossiers
await fs.mkdir('images', { recursive: true });
await fs.mkdir('audio', { recursive: true });
await fs.mkdir('videos', { recursive: true });
// 2. Générer toutes les images en parallèle
console.log('🎨 Génération des images...');
const imagePromises = coursData.slides.map(async (slide, i) => {
const url = `https://image.pollinations.ai/prompt/${encodeURIComponent(slide.imagePrompt)}?width=1920&height=1080&nologo=true`;
const response = await fetch(url);
const buffer = Buffer.from(await response.arrayBuffer());
await fs.writeFile(`images/slide_${i}.png`, buffer);
console.log(` ✅ Image ${i + 1}/${coursData.slides.length}`);
});
// 3. Générer tous les audios en parallèle
console.log('🗣️ Génération de l\'audio...');
const audioPromises = coursData.slides.map(async (slide, i) => {
await execPromise(
`edge-tts --voice "${coursData.voix}" --text "${slide.narration}" --write-media "audio/slide_${i}.mp3"`
);
console.log(` ✅ Audio ${i + 1}/${coursData.slides.length}`);
});
await Promise.all([...imagePromises, ...audioPromises]);
// 4. Créer les vidéos pour chaque slide
console.log('🎥 Création des vidéos...');
for (let i = 0; i < coursData.slides.length; i++) {
await execPromise(
`ffmpeg -loop 1 -i "images/slide_${i}.png" -i "audio/slide_${i}.mp3" ` +
`-c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p ` +
`-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" ` +
`-shortest "videos/slide_${i}.mp4"`
);
console.log(` ✅ Vidéo ${i + 1}/${coursData.slides.length}`);
}
// 5. Fusionner toutes les vidéos
console.log('🔗 Fusion finale...');
const liste = coursData.slides.map((_, i) => `file 'slide_${i}.mp4'`).join('\n');
await fs.writeFile('videos/liste.txt', liste);
await execPromise(
`ffmpeg -f concat -safe 0 -i "videos/liste.txt" -c copy "output/${coursData.titre}.mp4"`
);
console.log('✅ Vidéo générée avec succès!');
console.log(`📁 Fichier: output/${coursData.titre}.mp4`);
}
// Lancer la génération
genererVideo().catch(console.error);
🚀 Pour utiliser ce script:
- Installer Node.js
- Installer FFmpeg
- Installer edge-tts:
npm install -g edge-tts - Sauvegarder le script en
generer-video.js - Exécuter:
node generer-video.js
🎯 Cas d'Usage Réels
1. YouTube Shorts Éducatifs
Créer des vidéos de 60 secondes sur des sujets variés (histoire, science, culture).
2. Cours en Ligne
Générer automatiquement des vidéos de cours à partir de scripts.
3. Contenu Social Media
Produire du contenu engageant pour Instagram, TikTok, Facebook.
4. Formation Entreprise
Créer des modules de formation interne rapidement.
5. Contenu Multilingue
Générer la même vidéo dans plusieurs langues en changeant simplement la voix.
// Exemple: générer en plusieurs langues
const langues = [
{ code: 'fr-FR-VivienneMultilingualNeural', nom: 'français' },
{ code: 'en-US-JennyNeural', nom: 'anglais' },
{ code: 'es-ES-ElviraNeural', nom: 'espagnol' }
];
for (const langue of langues) {
coursData.voix = langue.code;
await genererVideo();
console.log(`✅ Version ${langue.nom} créée!`);
}
📚 Ressources et Documentation
🗣️ Edge-TTS Voix
Liste des voix disponibles
edge-tts --list-voices
🎓 Conclusion
Vous avez maintenant toutes les connaissances pour créer des vidéos éducatives professionnelles sans aucun coût. Cette méthode vous permet de:
- ✅ Automatiser la production de contenu vidéo
- ✅ Scaler votre création de contenu sans limites
- ✅ Économiser des centaines d'euros par mois
- ✅ Apprendre des technologies utiles (Node.js, FFmpeg, APIs)
- ✅ Personnaliser complètement vos vidéos
Prochaines étapes:
- Installer les outils nécessaires
- Tester le script de base
- Créer votre premier cours
- Optimiser et personnaliser
- Publier et partager!