Communitygithub.com

lhaovo/short-video-skills

Transforme les fiches de génération validées (G2) en véritables clips vidéo : soumet des tâches KIE Seedance par segment, interroge, télécharge, vérifie les médias, inspecte les images clés, écoute et valide les dialogues, et enregistre l'état de chaque segment avec son empreinte de requête dans un registre de génération. Trois modes mutuellement exclusifs (texte / première image / première et dernière image). La voix off est lue directement par le modèle, les dialogues sont écrits textuellement dans le prompt, sans doublage TTS indépendant.

Qu'est-ce que short-video-skills ?

Ce skill automatise la production de clips vidéo à partir de fiches de génération pré-approuvées (G2), en se concentrant strictement sur l'animation, le mouvement de caméra et la narration vocale sans recréation visuelle ou textuelle. Il soumet des tâches à l'API KIE Seedance, interroge les statuts, télécharge les fichiers, vérifie les métadonnées (ratio, durée, piste audio), inspecte les images clés, et écoute les dialogues pour valider la conformité. Le registre de génération (journal) assure la traçabilité et empêche les soumissions en double. Le skill propose trois modes mutuellement exclusifs (texte, première image, première et dernière image) et gère les échecs en isolant la cause (audio manquant, texte mal prononcé, etc.). Il est conçu pour les développeurs et utilisateurs d'agents IA qui ont besoin de transformer des storyboards validés en matériel vidéo brut, prêt pour le montage final (S4).

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lhaovo/short-video-skills/tree/HEAD/short-video-generate

Demander à votre IA préférée

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

Documentation

Registre de Génération Vidéo

Ne fait qu'une seule chose : faire bouger ce qui a été déjà figé, et laisser une trace traçable.

Le modèle vidéo est ici responsable de trois choses : le mouvement, le cadrage, et la lecture de la voix off. L'apparence du sujet, les vêtements, le décor, la palette de couleurs, l'éclairage, la composition et le texte à l'écran sont déjà verrouillés en S1/S2 : cette couche n'a pas le droit de recréer. Dès qu'il commence à "interpréter", la cohérence de toute la vidéo s'effondre.

La voix off n'utilise plus de doublage indépendant. Le texte du dialogue est écrit dans le prompt, le modèle le lit directement – c'est la plus grande différence de ce workflow par rapport aux méthodes traditionnelles, et c'est aussi le point le plus critique à surveiller.


1. Prérequis

Quatre éléments sont indispensables. S'il en manque un, retourner à l'étape précédente :

ÉlémentOù le trouverQue se passe-t-il s'il manque
03-génération-spec.mdProduit par short-video-prompt et validé G2On ne sait pas combien de segments faire, ni leur durée
Texte du dialogue de chaque segmentDans le prompt de chaque segment de la spécificationLe modèle ne sait pas quoi dire, il invente
Image d'actif / Première image04-matériel/01-actifs/, 04-matériel/02-première-image/Le sujet change à chaque segment
KIE_API_KEYVariable d'environnementImpossible de soumettre la tâche

Ne pas avoir de première image n'empêche pas de faire : pour les ambiances pures, les plans vides, les transitions, on peut utiliser le mode texte. Mais tout segment avec un sujet doit avoir une image – c'est une règle stricte.

Les segments sans dialogue peuvent ne pas avoir de voix off, comme les plans vides ou les passages purement musicaux. Mais si le segment doit parler, le texte du dialogue doit être dans le prompt – c'est la seule source audio maintenant.


2. Trois modes, mutuellement exclusifs

Une requête API ne peut en choisir qu'un. Un champ supplémentaire le transforme en un autre mode, et la tâche échoue.

ModeRequisQuand l'utiliserInterdiction explicite
text (texte)promptPlans vides, ambiances, effets lumineux purs, transitionsInclure first_frame_url / last_frame_url
first (première image)prompt + first_frame_urlPar défaut : verrouiller la composition de départInclure last_frame_url
first-last (première et dernière image)prompt + première + dernière imageVerrouiller le début et la fin, assurer la continuité entre segments adjacents—

Comment gérer le mode "image de référence" de la spécification

Le champ "mode" de la spécification peut être "première-dernière / référence / texte". Le modèle actuel n'a pas de mode "image de référence" – le champ reference_image_urls n'est pas disponible. Il faut donc faire une correspondance :

Ce que dit la spécificationCe qui est réellement soumisExplication
Première-dernièrefirst-lastDirect
RéférencefirstUtiliser l'image de référence comme première image, verrouiller la composition de départ
TextetextDirect, mais uniquement pour les plans sans sujet

Ce n'est pas un compromis, c'est une limite de capacité. Si un segment a vraiment besoin d'"image de référence pour verrouiller le sujet + composition libre", il faut soit verrouiller la composition avec la première image, soit retourner en S2 pour modifier le découpage.


3. Paramètres

ParamètreValeursDéfautDescription
duration4–15 secondes entières5Plus de 15 → diviser le segment ; moins de 4 → confier à la post-production pour animation ou recadrage
aspect_ratio9:16 / 16:9 / 1:1 / 3:4 / 4:3 / 21:9 / adaptive9:16adaptive réservé au mode texte ; le mode image doit avoir un ratio fixe
resolution480p / 720p480pPour maîtriser le coût ; pour une livraison finale, passer explicitement à 720p
generate_audiotrue / falsetrueNe pas désactiver. La voix off est dans cette piste ; la désactiver = pas de son
web_searchtrue / falsefalseDisponible uniquement en mode texte, généralement inutile

Trois pièges courants :

  1. Le ratio doit correspondre à la sortie réelle. Si le modèle retourne un résultat visiblement différent ou avec des bandes noires, la qualité est jugée échouée. Ne pas ajouter de letterbox et livrer comme si de rien n'était.
  2. L'audio doit être activé. La voix off et les sons ambiants sont dans cette piste. Seul un plan vide sans aucun son justifie --no-audio.
  3. duration doit être un entier. 5.5 sera rejeté.

4. Processus en sept étapes

① Lire la spécification → ② Définir le mode → ③ Écrire le prompt vidéo → ④ Soumettre → ⑤ Interroger et télécharger → ⑥ Vérifier le média → ⑦ Inspecter les images clés

① Lire la spécification, vérifier si c'est faisable

Vérifier trois points pour chaque segment. Si quelque chose ne correspond pas, s'arrêter et demander, ne pas deviner :

  • La duration de chaque segment est-elle entre 4 et 15 ? (Si > 15, diviser d'abord)
  • Le fichier de première image déclaré existe-t-il vraiment ?
  • Les numéros d'actifs référencés sont-ils tous dans la liste des actifs ?

② Définir le mode

Appliquer le tableau de la section 2 pour chaque segment. Essayer d'uniformiser tout le projet. Mélanger les modes n'est pas une erreur, mais rend les transitions plus laides.

③ Écrire le prompt vidéo

Suivre la structure en sept parties de references/video-prompt.md. Deux règles clés :

  1. Ne décrire que le "changement", ne pas redécrire "ce que c'est". La première image donne déjà au modèle l'apparence du produit ; si le prompt la redécrit, le modèle la redessine à partir du texte et la cohérence est perdue immédiatement.
  2. Recopier le texte du dialogue mot pour mot, sans modification. La voix off est maintenant lue directement par le modèle ; le texte original doit être dans le prompt. Changer un seul mot → le sous-titrage ne correspondra pas à l'audio.

④ Soumettre

python scripts/kie_seedance.py create \
  --prompt "…" --mode first \
  --first 04-matériel/02-première-image/S01_f01_v1.png \
  --duration 6 --out 04-matériel/03-clips/S01_v1.mp4 --wait

Dès que la soumission réussit, écrire immédiatement le taskId et l'empreinte dans le registre, avant de faire autre chose. Si on fait d'abord puis on note, on risque de ne pas retrouver l'information en cas d'interruption.

④-2 Traitement par lots (5 en parallèle par défaut)

Lancer les segments un par un prendrait plus de 30 minutes pour 6 segments, la plupart du temps étant de l'attente. Le traitement par lots réduit la durée totale à celle du segment le plus long.

# Prévisualiser les requêtes assemblées
python scripts/kie_seedance.py batch --tasks tasks.json --out-dir 04-matériel/03-clips --dry-run

# Lancer pour de vrai, 5 segments en parallèle par défaut
python scripts/kie_seedance.py batch --tasks tasks.json --out-dir 04-matériel/03-clips

# Réduire en cas de limitation de débit
python scripts/kie_seedance.py batch --tasks tasks.json --out-dir 04-matériel/03-clips --concurrency 2

Le format du fichier de tâches est dans assets/batch-tasks-example.json. Chaque segment a une ligne, les champs mode / first / last / duration / prompt ont la même signification que pour une commande unique.

Le parallélisme n'est pas toujours plus rapide, il y a un vrai piège : le registre peut être corrompu.

Si 5 segments se terminent en même temps et que chacun modifie 00-registre-génération.md, les cinq écritures se chevauchent et il ne reste qu'un seul enregistrement. La bonne méthode :

① Une fois le lot terminé, récupérer les éléments du résumé (déjà dans l'ordre de la spécification)
② Mettre à jour le registre en une seule fois : écrire les cinq segments ensemble, pas un par un
③ Vérifier immédiatement après : la spécification a N segments, le registre doit avoir N lignes

Si vous préférez noter au fur et à mesure, réduisez la concurrence à 1 – le mode séquentiel + notation au fur et à mesure est la seule façon de ne pas corrompre le registre. À vous de choisir, mais vous ne pouvez pas avoir à la fois du parallélisme et des écritures éparpillées.

Un signe de limitation de débit : code != 200 ou HTTP 429, pas "l'image est moins belle". Si vous voyez ce type d'erreur, réduisez d'abord la concurrence, ne modifiez pas le prompt.

L'échec n'interrompt pas le lot : si un segment échoue, les autres continuent. Consultez le champ failed du résumé. Pour tout arrêter en cas d'erreur, ajoutez --stop-on-error : cela arrête la soumission de nouvelles tâches, mais celles déjà en cours ne sont pas affectées.

⑤ Interroger et télécharger

--wait attend la fin du téléchargement. On peut aussi le faire séparément : create obtient le taskId → wait --task-id.

L'intervalle d'interrogation commence à 6 secondes et augmente progressivement jusqu'à 30 secondes, avec une limite de 15 minutes. Un dépassement de temps ne signifie pas un échec : vérifiez d'abord l'état.

⑥ Vérification du média (script)

# Segment avec dialogue : la piste audio doit exister
python scripts/inspect_clip.py --file 04-matériel/03-clips/S01_v1.mp4 \
  --ratio 9:16 --duration 6 --expect-audio

# Plan vide sans dialogue : ne doit pas avoir de piste audio
python scripts/inspect_clip.py --file S02_v1.mp4 --no-expect-audio

Cinq vérifications objectives : le fichier existe-t-il, sa taille est-elle normale, la durée est-elle correcte, le ratio est-il correct, la piste audio est-elle présente. Cela ne garantit que "le fichier téléchargé peut être lu", pas que l'image est utilisable, ni que le dialogue est correct.

La vérification audio est maintenant plus importante qu'avant : la voix off est dans cette piste. Pas de piste audio = pas de son, le clip est inutilisable. Piste audio présente mais texte mal prononcé : le script ne peut pas le détecter, il faut écouter.

⑦ Inspection des images clés + écoute (humain)

Image : extraire au moins trois points (début, milieu, fin) et vérifier selon les sept critères de references/clip-review.md.

Son : la voix off étant lue par le modèle, chaque segment avec dialogue doit être écouté une fois, en comparant avec le texte original pour vérifier trois points :

Quoi écouterCritère
Phrases manquantesLe texte original a N phrases, on doit en entendre N
Mots mal prononcésMots-clés, noms de marque, chiffres : sont-ils corrects ?
Bruits parasitesMusique, voix, bruits indésirables qui ne devraient pas être là

Si ce qui est dit ne correspond pas au texte, ne pas faire de compromis. Deux options : refaire le segment, ou modifier le sous-titrage pour correspondre à ce qui a été réellement dit. La seule chose à ne pas faire est de sous-titrer selon le texte original – si le public entend une chose et en lit une autre, c'est plus dommageable qu'une simple erreur de prononciation.

Cette étape doit être faite à l'oreille. Pour les mots ambigus, on peut utiliser une transcription automatique au moins trois fois pour comparer, mais la validation finale est humaine. Le résultat est écrit dans 04-matériel/00-dialogue-final.json. Voir references/clip-review.md.


5. Trois états, ne pas les mélanger

ÉtatQui jugeSignification
Média OKScriptFichier complet, paramètres conformes, piste audio présente
Image OKHumain (vision)Sujet inchangé, pas de déformation, s'enchaîne bien avec le segment suivant
Dialogue OKHumain (audition)Dialogue lu en entier, mots-clés corrects

Les trois doivent être OK pour que l'état soit "Qualité OK".

Considérer "téléchargé" comme "utilisable" est l'erreur la plus courante de cette chaîne – on découvre en montage que le sujet du 4e segment a changé, tout le travail de préparation est perdu. Maintenant, il y a une couche de plus : même si l'image est bonne, si le dialogue contient une seule erreur, le segment entier est inutilisable car le sous-titrage ne correspondra pas.

La vérification du dialogue est la plus facile à sauter, car elle demande de s'asseoir, de mettre un casque et d'écouter attentivement, pas de jeter un coup d'œil rapide.


6. Registre : dans 04-matériel/00-registre-génération.md

Une ligne par segment, six colonnes : empreinte de la requête, mode, taskId, état, fichier de sortie, raison de l'échec.

Le registre ne sert pas seulement à archiver, mais surtout à éviter les soumissions en double. Si on revient un jour plus tard pour continuer le même projet, le registre indique quels segments sont terminés, lesquels ont été soumis mais pas téléchargés, lesquels ont échoué.

Règles dans references/task-ledger.md, quatre résumés :

  1. État = "Qualité OK" et fichier présent → ignorer
  2. taskId présent et état = "En attente / En cours" → interroger uniquement, ne pas recréer
  3. État = "Généré, en attente de téléchargement" → télécharger uniquement ; si l'URL a expiré, utiliser le même taskId pour en obtenir une nouvelle
  4. État = "Échec" → ne pas relancer automatiquement, attendre que l'utilisateur demande explicitement une reprise

7. Gestion des échecs

D'abord identifier la couche en cause, puis décider quoi modifier. Ne pas commencer par modifier le prompt.

SymptômeCauseCorrection
Sujet déformé, produit différentPas de première image, ou première image incorrecteAjouter / changer la première image
Tremblement, scintillementTrop d'actions décritesSupprimer jusqu'à ne conserver qu'une seule action
Texte illisible, doigts en tropDemander au modèle d'écrire du texte ou de faire des gestes complexes de la mainTexte en post-production, gestes simplifiés
Ratio incorrect, bandes noiresNon-concordance entre paramètre et résultatJuger échec, refaire, ne pas recadrer les bandes noires
Rupture entre segmentsDernière image du segment ≠ première image du suivantUtiliser le mode première-dernière image, ou ajouter une image de transition
Phrase manquante, moitié de phraseTexte du dialogue trop long pour la durée du segmentRéduire le dialogue, ou diviser le segment en deux
Mot mal prononcé, remplacéCaractères rares, homophones, nom de marque noyé dans une longue phraseUtiliser une formulation plus courante ; isoler le nom de marque dans une phrase courte
Voix off couverte par la musiqueLe prompt n'a pas précisé "sans musique" ou "ne pas couvrir la voix"Ajouter une contrainte audio, refaire
Aucun son--no-audio utilisé par erreur, ou generate_audio désactivéVérifier les paramètres, refaire
Erreur 429 dès la soumissionTrop de concurrence, limitation de débitRelancer avec --concurrency 2, ne pas modifier le prompt
Échec répété du même segmentPlusieurs variables changées en même tempsNe changer qu'une seule variable à la fois

Les problèmes de dialogue représentent plus de la moitié des cas. Leur point commun : l'image a l'air correcte, seul l'écoute révèle le problème. Donc chaque segment doit être écouté avant de valider.

Lors d'une reprise, ne changer qu'une seule variable à la fois. Modifier le prompt, la durée et la première image en même temps : même en cas de succès, on ne saura pas ce qui a fonctionné, et le même problème se reproduira.

Diagnostic détaillé dans references/clip-review.md.


8. Limites

  • Ne pas redessiner le visuel : sujet, décor, palette, éclairage sont verrouillés en S2, ici on les anime seulement
  • Ne pas modifier le texte du dialogue : lire exactement ce qui est écrit. Pour changer les mots, retourner en S1/S2
  • Ne pas faire de sous-titres : le texte est toujours ajouté en post-production. Le modèle peut "lire" le chinois, pas "l'écrire"
  • Ne pas traiter l'audio : un segment mal lu doit être refait, ou le sous-titrage ajusté. Pas de mixage, pas de réenregistrement ici
  • Ne pas faire de montage : pas d'assemblage, pas de coupe, pas d'étalonnage – c'est S4
  • Ne pas juger "si c'est beau" : seulement "si c'est utilisable". L'appréciation esthétique est pour la revue des rushes
  • Ne pas promettre un résultat du premier coup : la génération est probabiliste, 2 à 4 essais sont la norme, pas un échec

9. Références

FichierQuand le lire
references/api-and-modes.mdPour l'API, les paramètres, les trois modes, les réponses d'erreur
references/video-prompt.mdPour écrire ou modifier un prompt vidéo
references/task-ledger.mdPour créer le registre, reprendre le travail, décider s'il faut relancer
references/clip-review.mdPour l'inspection des images clés, le diagnostic d'échec, la décision de reprise
references/assembly-ops.mdDétails FFmpeg pour l'assemblage S4, le sous-titrage et le mixage
assets/gen-ledger-template.mdPour créer le registre
assets/dialogue-final-template.jsonPour enregistrer le dialogue final, l'aide à la transcription et la validation humaine
assets/batch-tasks-example.jsonPour exécuter des lots

Scripts :

ScriptUtilisation
scripts/kie_seedance.pySoumettre / lot / interroger / attendre le téléchargement / uploader une image de référence
scripts/inspect_clip.pyVérification du média (nécessite ffprobe)

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

lhaovo/short-video-skills

为视频生成准备可用的图——把资产清单变成能直接喂给图生视频的素材:排生产顺序、定资产级别、出候选图、做一致性验收、按编号落盘、回写清单状态。支持三种来源:实拍、AI 生成、官方素材,不强制实拍。当用户说「准备素材」「出资产图」「首帧图」「角色三视图」「产品图跑一下」「资产对不上」「这条要哪些图」时使用。只管把图做出来并验收,不写分镜,不直接生成视频。

lhaovo/short-video-skills

一条短视频从策划到发布的流程总控:建制作目录、依次走「剧本分镜 → 提示词 → 生成 → 交付 → 发布」五段、每段设门禁、记录流程状态、支持跨会话续做。当用户要开一条新片子、问「下一步做什么」、想接着做某条没做完的片子、要把分镜变成提示词、要整理素材与成片、要准备发布包时使用。本技能只规定流程、目录与产物标准,不重复各环节的写作规范。

lhaovo/short-video-skills

把「我想拍点什么」变成一条想清楚的片子——先定主题(出 5 个候选、标明类型、给出推荐与淘汰理由),再定结构与分段剧本,最后切成镜头级内容分镜。支持两种入口:一句话主题(需要发散选题)与已有拆解剧本(跳过选题,先问复刻需求与复刻强度再判定改写)。当用户提到选题、定主题、短视频策划、写剧本、写大纲、分镜、镜头脚本、不知道拍什么、内容怎么排、科普干货、剧情软广、钩子怎么写、复刻别人的剧本时使用。只管内容层(讲什么、怎么讲),不碰执行层;内置的内容红线只防明显自伤,不替代合规审查。

lhaovo/short-video-skills

把已定稿的分镜表翻成可直接执行的两份清单——资产清单(要准备哪些图、每张图的图像提示词)与生成清单(每段视频的时长、模式、素材引用与提示词)。覆盖画面化、资产编号、切分生成单元、Seedance 视频提示词写法、首帧方案、一致性与失败诊断。当用户说「把分镜变成提示词」「写视频提示词」「这条片子要哪些图」「生成清单」「某个镜头生成不出来」时使用。只做翻译与清单,不重新编排内容,不直接出图出片。

Skills associés