Vidéo courte avec voix off + sous-titres
Pipeline : script .txt → make_video.py (edge-tts lit chaque phrase → fusion audio → sous-titres ASS basés sur la durée réelle → fond + incrustation des sous-titres avec ffmpeg) → MP4 1080x1920.
Mode finalisé : voix existante → vidéo (utilisé par défaut quand l'utilisateur envoie un mp3)
L'utilisateur crée une voix sur EverAI (web, vitesse 0.85), envoie mp3 + texte. Aucun appel API, aucun clonage vocal, aucun modèle vocal (VieNeu) exécuté localement.
- Découper le texte en fichier
.txtavec une ligne par courte phrase (aux virgules/points/"…"), pas de ligne#, pas de[icon]. python3 make_video.py script.txt ~/Downloads/<nom>.mp4 --audio voix.mp3 --style night --no-wave --bg assets/pho-dem.mp4 --target <durée±5>- Imprimer les repères de chaque ligne : relancer la commande ci-dessus avec
--print-timing(sans rendu). Vérifier : si une ligne est anormalement longue/courte par rapport au nombre de caractères → fusionner/séparer puis relancer le rendu. - Extraire 1–2 images pour vérifier les sous-titres, signaler le chemin et la durée. Si aucun son n'est entendu → généralement dû à la sortie Mac sur AirPods.
Guide pour l'utilisateur :
HUONG-DAN.md.
Installation sur une autre machine
Copier tout le dossier ~/.claude/skills/short-video/ vers la nouvelle machine (même chemin), puis exécuter bash ~/.claude/skills/short-video/setup.sh. Prise en charge de macOS et Ubuntu/Debian ; Windows via WSL. Fond nocturne fourni : assets/pho-dem.mp4 (stock Mixkit, utilisable commercialement).
Prérequis (déjà installés sur cette machine)
ffmpeg-full(nécessite le filtresubtitles/libass) :brew install ffmpeg-fulledge-tts:pipx install edge-tts(en cas d'erreur réseau, repli automatique sur la voixsay -v Linh)
Étape 1 — Finaliser le brief
À partir de la demande ; si manquant, utiliser les valeurs par défaut, ne demander que si le sujet est totalement flou :
- Sujet / angle — si aucun angle spécifique n'est donné, en choisir un attrayant et précis.
- Durée — par défaut 45–60s.
- Voix — par défaut féminine
vi-VN-HoaiMyNeural; masculinevi-VN-NamMinhNeural. Autre langue :edge-tts --list-voices | grep <code>(ex.en-US-AriaNeural). - Fond / musique — image/vidéo fournie par l'utilisateur, sinon fond dégradé par défaut.
Étape 2 — Écrire le script
Enregistrer un fichier .txt, la première ligne est le titre, chaque ligne suivante est une phrase à lire :
# Titre court affiché en haut de l'écran (≤ 6 mots)
Phrase d'accroche qui suscite la curiosité, ≤ 12 mots.
Phrase de contenu...
Phrase de conclusion + appel à l'action.
Règles :
- Longueur en français : ~2,5 mots/seconde (approximatif). 45–60s → 110–140 mots ; 30s → ~65 mots ; 15s → ~30 mots.
- Chaque ligne une phrase, 8–20 mots. Les 3 premières secondes sont l'accroche (question / fait surprenant). Milieu : 3–5 idées spécifiques, faciles à retenir. Fin : CTA (sauvegarder, suivre, commenter).
- Les faits doivent être exacts ; pour les sujets santé/finances/juridiques : pas de diagnostic, pas de conseil spécifique de type expert, suggérer de consulter un professionnel si nécessaire.
- Écrire les chiffres/symboles en toutes lettres si la prononciation est ambiguë ("quatre - sept - huit" au lieu de "4-7-8", "pour cent" au lieu de "%"). Éviter les emojis, les caractères
{}et\.
Laisser l'utilisateur consulter le script avant le rendu, sauf s'il a déjà fourni le contenu ou demandé de l'exécuter directement.
Étape 3 — Rendu
python3 ~/.claude/skills/short-video/make_video.py script.txt out.mp4 \
[--voice vi-VN-HoaiMyNeural] [--rate -5%] [--target 45-60] \
[--bg image_ou_video_fond] [--music musique_fond.mp3] [--gap 0.35] \
[--pitch -8Hz] [--style default|night]
- Voix existante :
--audio voix.mp3ignore la TTS. Le script doit correspondre à la lecture, chaque ligne une courte phrase (coupure aux virgules/points) ; les repères des lignes démarrent sur les pauses. Imprimer les repères avec--print-timing(normalement ~12–16 caractères/seconde), si une ligne est anormalement longue/courte, fusionner/séparer puis relancer le rendu. - FPT.AI :
--engine fpt --voice leminh(voix masculine du Nord ; égalementbanmai,thuminhféminin Nord,lannhi,linhsanféminin Sud,myanféminin Centre,giahuymasculin Centre). Nécessiteexport FPT_API_KEY=...(clé sur console.fpt.ai, offre gratuite 100 000 caractères/mois). Pas de repères par mot donc le karaoké est basé sur la longueur des mots ;--rateappliqué via atempo. Ne jamais écrire la clé dans le fichier de compétence. - Tous les moteurs ont un rythme de lecture naturel (légère variation de vitesse/hauteur par phrase, pause plus longue après une question) + traitement de la voix pour la rendre plus chaude, compressée, avec une légère réverbération. Écrire le script comme pour une expression orale, utiliser "…" et des points au milieu des phrases pour créer des pauses.
- Voix masculine du Nord grave et mature (edge) :
--voice vi-VN-NamMinhNeural --pitch=-8Hz --rate=-10%(NamMinh est la seule voix masculine vietnamienne disponible). --style night --no-wave+ script sans ligne#, sans balise[icon]→ seulement fond + sous-titres.--style night(style reel "nuit en ville") : titre en majuscules espacées, couleur teal, souligné ; icônes néon fines ; sous-titres en majuscules karaoké mot par mot (repères temporels réels de edge-tts) ; onde sonore sous forme de barres. Mettre[icon]en début de ligne pour changer l'icône à partir de cette ligne :sun hourglass gift heart leaf book star eye. Le fond doit être une vraie vidéo de nuit en ville : libre de droits sur Mixkit (https://mixkit.co/free-stock-video/night-city-street/, lienassets.mixkit.co/videos/<id>/<id>-1080.mp4), assembler plusieurs clips, rogner en vertical,setpts=1.4*PTSpour ralentir.--style ui(vidéo tutoriel tech) : fond sombre avec grille, barre de série (titre#) + boîtes étape 1..n, fenêtre d'application simulée, terminal avec frappe, cadre de sous-titres coloré en orange avec*mot-clé*. Balises de début de ligne :[step:Nom de l'étape](passer à l'étape suivante),[card:Titre|élément 1|élément 2](fenêtre, reste jusqu'à la scène suivante),[term:commande]. Les phrases lisant des raccourcis claviers doivent les écrire en toutes lettres ("Commande, Majuscule, trois"), mais dans la carte écrire "Commande + Majuscule + 3". Exemple : voixvi-VN-NamMinhNeural --pitch=-4Hz --rate=+15% --gap 0.25.- Sans
--bg→ fond dégradé bleu-violet foncé animé lentement (adapté aux sujets calmes ; pour les sujets dynamiques, demander une image/vidéo de fond). Image → effet zoom lent. Vidéo → bouclage automatique. --musicréduit à 12% du volume, fondu en fin.- Le script affiche la durée et un avertissement si hors de
--target→ ajouter/enlever des phrases ou ajuster--ratepuis relancer le rendu.
Étape 4 — Vérification
Extraire une image pour vérifier que les sous-titres ne sont pas tronqués ou décalés :
ffmpeg -v error -y -ss 5 -i out.mp4 -frames:v 1 frame.jpg puis lire frame.jpg. Signaler à l'utilisateur le chemin absolu de la vidéo et sa durée.
Exemple de script : example-sleep.txt dans le dossier du skill.