Recommandé : Charger les bonnes pratiques Remotion
Ce skill bénéficie de
remotion-best-practices(non inclus) pour la bibliothèque complète des motifs Remotion. Il est optionnel — les règles minimales sont ci-dessous si absent.
- Pi : lisez le skill chargé à
remotion-best-practices(listé dans les skills disponibles).- Claude Code : invoquez le skill/outil
remotion-best-practicesavant de continuer.Pas installé ? Récupérez-le depuis remotion-dev/skills (docs : remotion.dev/docs/ai/skills).
Si
remotion-best-practicesn'est pas installé, règles minimales : chromium doit être disponible, enveloppez toujours le contenu 4K dans<Scale4K>, utilisez<TransitionSeries>aveclinearTiming, et traitez l'audio comme horloge maîtresse.
Générateur de Podcast Vidéo
Pipeline automatisé pour vidéos de connaissance Bilibili horizontales en 4K à partir d'un sujet. Agent de codage + backend TTS + Remotion + FFmpeg.
Sommaire
- Amorçage — prérequis (à exécuter avant l'étape 1)
- Modes d'exécution — Auto vs Interactif → references/workflow-script.md
- Régénérer une vidéo existante — itérer sur une vidéo terminée
- Workflow — le pipeline en 11 étapes + pointeurs de fichiers de phase + arrêts obligatoires
- Règles strictes — contraintes de production non négociables
- Horloge maîtresse audio et synchronisation
- Structure par vidéo
- Ressources supplémentaires — quand charger chaque fichier
references/ - Préférences utilisateur
- Dépannage
Amorçage
Résoudre SKILL_DIR vers le répertoire contenant ce fichier SKILL.md :
- Pi : l'agent connaît le chemin du skill depuis la liste des skills chargés — définissez
SKILL_DIRsur ce répertoire avant d'exécuter les commandes. - Claude Code :
${CLAUDE_SKILL_DIR}est automatiquement renseigné.
SKILL_DIR="${SKILL_DIR:-${CLAUDE_SKILL_DIR}}"
# Prérequis (CLI + variables d'environnement du backend)
python3 "${SKILL_DIR}/scripts/check_prereqs.py"
Les mises à jour transitent par le CLI des skills (npx skills update video-podcast-maker -g) ; les installations par clone git direct utilisent git pull selon le README. Ce skill n'effectue aucune vérification de mise à jour.
Échecs des prérequis — voir README.md pour l'installation. La vérification est consciente du backend (résout la variable d'environnement TTS_BACKEND → user_prefs.json global.tts.backend → edge par défaut), donc seules les variables d'environnement requises par le backend actif sont validées.
Première vidéo d'un nouveau projet ? Préférez réutiliser un projet Remotion existant avec node_modules/ déjà installé — créer un nouveau projet télécharge ~2,2 Go de paquets npm plus un shell headless Chrome de 90 Mo (une fois par projet). Si l'utilisateur a un projet d'une vidéo précédente, utilisez-le. Si un nouveau projet est nécessaire, lancez npm install en arrière-plan pendant les étapes 1 à 4 (recherche du sujet et rédaction du script).
Tout le rendu va dans videos/{name}/ — chaque output.mp4, final_video.mp4 et thumbnail_*.png atterrit directement dans le répertoire par vidéo. Ne rendez jamais dans un répertoire out/ ou dist/ ; la convention --public-dir videos/{name}/ garde tout autonome.
Moteur TTS — deux backends locaux, aucun skill externe :
edge(par défaut) — gratuit, sans clé, via edge-tts.azure— nécessiteAZURE_SPEECH_KEY+AZURE_SPEECH_REGION(Microsoft Speech SDK).
Chacun synthétise en interne (scripts/tts/backends/native.py) — la prononciation (affichage → parole → retour à l'affichage pour les sous-titres) et l'application de phonèmes sont intégrées. check_prereqs.py valide les variables d'environnement du backend actif.
TTS multi-plateforme ? L'ancien skill composant ttscn qui fournissait la matrice de 9 backends n'est plus une dépendance de ce skill. Si vous souhaitez ces plateformes, installez Agents365-ai/ttsCN séparément et appelez-le directement — ce skill ne fournit que edge + azure.
Raccourci d'apprentissage du design : Si l'utilisateur fournit une vidéo/image de référence ou demande de sauvegarder/lister/supprimer des profils de style, voir references/design-learning.md au lieu d'exécuter le workflow ci-dessous.
Modes d'exécution
Détectez le mode Auto (par défaut) vs le mode Interactif au début du workflow — la table de décision Auto-par défaut et les surcharges par requête se trouvent dans references/workflow-script.md.
Régénérer une vidéo existante
Si videos/{name}/ existe déjà et que l'utilisateur itère sur une vidéo terminée ou en cours, réutilisez ce répertoire. Ne démarrez PAS un nouveau projet ou un nouveau videos/{nouveaunom}/.
Choisissez la plus petite ré-exécution pour ce qui a réellement changé :
| Changé | Ré-exécution | Réutilise (ne refaites pas) |
|---|---|---|
Script de narration (podcast.txt) | Étape 7 (TTS) → Étape 8 prévisualisation → rendu+mixage | recherche du sujet + conception des sections |
| Visuels uniquement (composants, disposition, couleurs) | Étape 8 prévisualisation → rendu+mixage | audio (podcast_audio.wav / timing.json) |
| Musique de fond uniquement | Re-mixage BGM | output.mp4 (pas de nouveau rendu) |
| Sous-titres uniquement | Étape 10.1 finalisation | output.mp4 / video_with_bgm.mp4 |
Toute ré-exécution qui modifie ce que le spectateur voit ou entend repasse par la porte de l'étape 8 : appliquez le changement, laissez le Studio se recharger à chaud, et attendez une nouvelle confirmation explicite de « rendre la 4K » — la confirmation précédente ne se reporte pas. Un changement de script décale chaque horodatage en aval, donc régénérez toujours timing.json via TTS — ne le modifiez jamais manuellement. Après toute ré-exécution, revérifiez :
python3 ${SKILL_DIR}/scripts/verify_output.py videos/{name}/
Workflow
Itération sur une vidéo terminée ? Si
videos/{name}/existe déjà, voir Régénérer une vidéo existante ci-dessus pour la ré-exécution minimale — ne commencez PAS à l'étape 1.
Au début de l'étape 1, créez une tâche par étape dans le tracker de votre agent. Marquez in_progress au début, completed à la fin. Les fichiers dans videos/{name}/ sont l'enregistrement durable — en cas d'interruption, inspectez le répertoire pour déterminer où reprendre.
| # | Étape | Sortie | Fichier de phase |
|---|---|---|---|
| 1 | Définir l'orientation du sujet | topic_definition.md | workflow-script.md |
| 2 | Rechercher le sujet | topic_research.md | workflow-script.md |
| 3 | Concevoir 5 à 7 sections | (en mémoire) | workflow-script.md |
| 4 | Écrire le script de narration | podcast.txt | workflow-script.md |
| 4.5 | Pré-vol de prononciation (zh-CN) | phonemes.json | workflow-script.md |
| 5 | Plan des assets et résolution | assets/manifest.json | workflow-assets.md |
| 6 | Générer les miniatures (16:9 + 4:3) | thumbnail_*.png | workflow-production.md |
| 7 | Générer l'audio TTS | podcast_audio.wav, timing.json | workflow-production.md |
| 8 | Composition Remotion + prévisualisation Studio | — | workflow-production.md |
| 9 | Rendu 4K + mixage BGM | output.mp4, video_with_bgm.mp4 | workflow-production.md |
| 10 | Infos de publication + vérification de la sortie | publish_info.md, final_video.mp4 | workflow-publish.md |
| 11 | Générer les formats verticaux (optionnel) | shorts/ | workflow-publish.md |
Arrêts obligatoires (lignes en gras ci-dessus) :
- Étape 8 — Revue Studio. DOIT lancer
npx remotion studioet attendre les retours de l'utilisateur avant de rendre. Ne rendez JAMAIS la 4K avant que l'utilisateur ne confirme explicitement (« rendre la 4K » / « rendu final »). Une réponse contenant des demandes d'ajustement n'est pas une confirmation — appliquez les modifications, laissez le Studio se recharger à chaud, et redemandez. Chaque cycle d'ajustements nécessite sa propre confirmation fraîche avant l'étape 9. - Étape 10 —
verify_output.py. DOIT réussir avant de déclarer la vidéo terminée. Code de sortie 0 = vert ; code 2 = avertissements, mais publiable. Corrige automatiquement les omissions courantes (créefinal_video.mp4si manquant). Valide les informations de publication (titre, description, tags, chapitres) par rapport à la matrice de plateforme — générez-les aux étapes 5.5 et 10.2. Pour une sortie lisible par machine, ajoutez--format json.
Audit pré-rendu (recommandé) — avant l'étape 8 :
python3 ${SKILL_DIR}/scripts/audit_beat_sync.py <Video.tsx> <timing.json>
Signale les beats qui dérivent de plus de 1,5 s de la narration.
Mode Auto : auto-examen visuel. En mode Auto (aucun utilisateur ne regarde Studio), rendez 3 à 5 images clés avant de demander la confirmation de rendu :
npx remotion still src/remotion/index.ts <CompositionId> videos/{name}/_review_001.png --public-dir videos/{name}/ --frame=<image_milieu>
Choisissez les images à : titre principal (~10 %), un milieu de section dense, et la conclusion. Relisez les images fixes en tant qu'images et appliquez les listes de vérification de design-guide.md et visual-taste.md sur le rendu réel. Attrapez les débordements, les problèmes de contraste et de disposition avant le rendu 4K. Supprimez _review_*.png après l'examen.
Points de contrôle de validation
| Après l'étape | Vérification |
|---|---|
| 7 (TTS) | podcast_audio.wav se joue · timing.json couvre toutes les sections · SRT est en UTF-8 |
| 9 (Rendu) | output.mp4 est 3840×2160 · synchronisation audio-vidéo · pas d'images noires |
| 10 (Vérifier) | verify_output.py sort 0 (ou 2 avec avertissements examinés) |
Règles strictes
| Règle | Exigence |
|---|---|
| Projet unique | Toutes les vidéos sous videos/{name}/ dans le projet Remotion de l'utilisateur. Ne créez JAMAIS un nouveau projet par vidéo. |
| Sortie 4K | 3840×2160 (ou 2160×3840 vertical), utilisez le wrapper scale(2) sur un espace de conception 1920×1080 |
| Sync audio | L'audio (podcast_audio.wav + podcast_audio.srt) est l'horloge maîtresse. timing.json DOIT être généré à partir de la sortie TTS réelle, jamais estimé manuellement. Avant le rendu, la durée de la vidéo finale doit correspondre à l'audio à ±0,5 s près. Voir Horloge maîtresse audio et synchronisation. |
| Miniature | DOIT générer à la fois 16:9 (1920×1080) ET 4:3 (1200×900) — voir design-guide.md |
| Studio avant rendu | DOIT lancer remotion studio pour examen. Ne rendez JAMAIS la 4K avant confirmation explicite de l'utilisateur. Un retour avec ajustement ≠ confirmation — appliquez, rechargez à chaud, redemandez. |
--public-dir | Chaque commande Remotion utilise --public-dir videos/{name}/. Tous les fichiers de sortie (output.mp4, final_video.mp4, thumbnails) vont directement dans videos/{name}/ — jamais dans un répertoire out/ ou dist/. |
Les minimums visuels (tailles de texte, largeur du contenu, zones de sécurité, sécurité d'animation) se trouvent dans references/design-guide.md. DOIT être chargé avant l'étape 8.
Horloge maîtresse audio et synchronisation
Règles d'or
- L'audio est l'horloge maîtresse. Chaque début de diapositive, sous-titre, chapitre et beat d'animation est dérivé de
podcast_audio.wavetpodcast_audio.srt. - Générez le timing à partir du TTS, pas d'estimations de texte. Pipeline :
podcast.txt→generate_tts.py→podcast_audio.wav+podcast_audio.srt+timing.json→ composition → rendu. - N'écrivez jamais
timing.jsonmanuellement avant que l'audio n'existe. Si vous avez déjà des diapositives organisées, exécutezalign_timing_from_srt.pypour les ancrer au SRT réel. - Compensez le chevauchement de TransitionSeries.
TransitionSeriesrendsum(section.duration_frames) - (N-1) * transitionFramesimages. Mettez à l'échelle chaque section proportionnellement pour que la durée rendue soit égale àtiming.total_frames. Ne mettez pas toutes les images de chevauchement dans la première section. Le motif corrigé se trouve danstemplates/Video.tsx.
Points de contrôle de synchronisation obligatoires
| Quand | Vérification |
|---|---|
| Après l'étape 7 (TTS) | timing.json.total_duration correspond à podcast_audio.wav à ±0,5 s près |
| Avant le rendu | Video.tsx met à l'échelle toutes les sections pour le chevauchement de transition |
| Après le rendu | La durée de final_video.mp4 correspond à podcast_audio.wav à ±0,5 s près |
| Étape 10 (vérification) | verify_output.py sort 0 et rapporte vert sur audio/timing |
Si un point de contrôle échoue, arrêtez-vous. Ne publiez pas.
Spécifications de sortie
| Paramètre | Horizontal (16:9) | Vertical (9:16) |
|---|---|---|
| Résolution | 3840×2160 (4K) | 2160×3840 (4K) |
| Fréquence d'images | 30 ips | 30 ips |
| Encodage | H.264, 16 Mbit/s | H.264, 16 Mbit/s |
| Audio | AAC, 192 kbit/s | AAC, 192 kbit/s |
| Durée | 1 à 15 min | 60 à 90 s (point fort) |
Structure par vidéo
racine-du-projet/ # Racine du projet Remotion
├── src/remotion/ # Source Remotion (Root.tsx, compositions, index.ts)
├── videos/{nom-de-la-vidéo}/ # Répertoire par vidéo
│ ├── topic_definition.md # Étape 1
│ ├── topic_research.md # Étape 2
│ ├── podcast.txt # Étape 4 : script de narration
│ ├── phonemes.json # Étape 4.5 : surcharges de prononciation zh-CN
│ ├── assets/manifest.json # Étape 5 : registre des assets par section
│ ├── publish_info.md # Étape 10 : titre/description/tags
│ ├── podcast_audio.wav # Étape 7 : audio TTS
│ ├── podcast_audio.srt # Étape 7 : sous-titres
│ ├── timing.json # Étape 7 : timeline (pilote les animations)
│ ├── thumbnail_*.png # Étape 6
│ ├── output.mp4 # Étape 9 : rendu 4K
│ ├── video_with_bgm.mp4 # Étape 9 : avec BGM
│ ├── final_video.mp4 # Étape 10 : sortie finale
│ └── bgm.mp3 # Musique de fond
└── remotion.config.ts
--public-dir par vidéo
Chaque commande Remotion utilise --public-dir videos/{nom}/ — les assets de chaque vidéo restent dans son propre répertoire, permettant des rendus parallèles :
npx remotion studio src/remotion/index.ts --public-dir videos/{nom}/
npx remotion render ... videos/{nom}/output.mp4 --public-dir videos/{nom}/ --video-bitrate 16M
Ressources supplémentaires
| Quand charger | Fichier |
|---|---|
| Toujours (avant l'étape 1) | workflow-script.md — tableaux de décision de mode, scénario de workflow complet |
| Toujours (avant l'étape 5) | workflow-assets.md — planification des assets, politique de licence, motifs de composition |
| Toujours (avant l'étape 6) | workflow-production.md — pipeline de production détaillé (TTS, rendu, prévisualisation) |
| Toujours (avant l'étape 8) | design-guide.md — tailles minimales de texte, zones de sécurité, palette de couleurs, tolérances d'animation |
| Toujours (avant l'étape 10) | workflow-publish.md — matrice de plateforme, format de publish_info.md, génération de contenu court |
| À la demande | visual-taste.md — ne le chargez que pour l'auto-examen visuel en mode Auto (image clé) |
| À la demande (vidéo d'amorçage) | workflow-research.md — amorçage de recherche pour les sujets qui en ont besoin |
| À la demande (apprentissage du design) | design-learning.md — lorsque l'utilisateur fournit une référence ou demande la gestion de profil |
Préférences utilisateur
Toutes les préférences persistent dans user_prefs.json à la racine du projet. Valeurs par défaut :
{
"global": {
"tts": {
"backend": "edge", // ou "azure"
"voice": null, // auto-sélectionné par le backend
"speed": 1.0,
"pitch": 1.0
},
"platform": {
"primary": "bilibili",
"secondary": []
},
"brand": {
"watermark": false
}
},
"videos": {
"bgm_path": null,
"intro_path": null,
"outro_path": null
}
}
Dépannage
Problèmes courants
| Symptôme | Cause probable | Solution |
|---|---|---|
check_prereqs.py échoue | Backend TTS manquant ou variables d'environnement non définies | Exécutez python3 scripts/check_prereqs.py --verbose pour des messages détaillés. Voir README.md. |
timing.json ne correspond pas à l'audio | Timing estimé manuellement | Régénérez via align_timing_from_srt.py ou TTS complet. |
| TransitionSeries hors sync | Chevauchement non compensé | Appliquez la mise à l'échelle proportionnelle de templates/Video.tsx. |
| Rendu 4K lent | Première exécution ou cache vidage | Les rendus ultérieurs utilisent le cache Webpack de Remotion. |
final_video.mp4 manquant | verify_output.py non exécuté | Exécutez verify_output.py — il le crée automatiquement. |
Obtenir de l'aide
- Ouvrez un problème sur github.com/Agents365-ai/video-podcast-maker
- Documentation Remotion : remotion.dev/docs