Create Template Video (version chinoise)
Transformez un contenu chinois en une courte vidéo verticale 9:16. La conception et les animations sont entièrement gérées par les modèles HyperFrames dans templates/, vous ne faites que remplir les emplacements de texte et le script.json.
Informations d'installation locale (environnement DSH, à lire impérativement)
-
PROJECT_DIR =
/Users/ming/.agents/skills/create-template-video-zh(skill lui-même + pipeline + modèles ;node_moduleslié en symlink à la version vietnamienne, dépendances partagées) -
Structure des répertoires :
SKILL.md,templates/(11 modèles +CATALOG.md),src/(CLI/pipeline),package.json,.env(endpoint TTS chinois). -
Table de correspondance des outils : les noms d'outils Claude Code de l'original correspondent ici à DSH :
WebFetch→web_fetch,Read→read,Write→write,Bash→bash. -
Dépendances d'environnement :
ffmpeg/ffprobe✓, Chrome ✓, Node ✓. -
TTS chinois déployé localement : OmniVoice (MPS) + voix clonée mandarin
voice-zh.pt, fonctionne sur le port 8124 (la version vietnamienne utilise fixement 8123, les deux versions ne s'interfèrent pas) :bash "$HOME/.agents/skills/create-template-video-zh/scripts/start-tts-zh.sh"Le script vérifie
/health, lance le service en arrière-plan et attend qu'il soit prêt (environ 4 s), les logs se trouvent dans/tmp/omnivoice-zh.log. Une fois lancé, confirmez d'abord avec une sonde chinoise :curl -s -X POST http://127.0.0.1:8124/tts -H 'Content-Type: application/json' \ -d '{"text":"大家好,这是中文配音测试。"}' -o /tmp/zh-probe.mp3 && ls -l /tmp/zh-probe.mp3000/pas de connexion = non démarré ; en cas d'échec, arrêtez et informez l'utilisateur, ne créez pas d'audio factice. Répertoire du service et notes de déploiement :/Users/ming/Documents/dsh_workspace/omnivoice(SETUP.md). -
Le premier rendu sera effectué par
npx -y [email protected]pour télécharger HyperFrames (nécessite une connexion Internet, environ 15–20 s par scène ; 8–10 scènes totalisent 3–5 minutes). -
Langue : intégralement en chinois. Les textes à l'écran peuvent mélanger chinois et anglais (
AI,GPT,Apple,Applesont conservés en original), maisvoiceTextdoit être en chinois, et les chiffres doivent être écrits en caractères chinois selon les règles ci-dessous.
Entrée
1 paramètre : URL d'actualité (http:///https://) ou chemin de fichier .txt.
Workflow (strictement dans l'ordre)
Étapes 1–3 : Récupérer le contenu + créer le répertoire de sortie
- URL →
web_fetchpour récupérer le corps du texte, extrairetitle,content(800–2000 caractères),ogImage(og:image ou null),domain. En cas d'échec (paywall/pure JS/4xx) → demandez à l'utilisateur de sauvegarder le contenu dans un fichier.txtet réexécutez, puis arrêtez. .txt→readpour lire ;title= première ligne (≤40 caractères),content= reste du corps,ogImage=null,domain="local".slug: utilisez de préférence des mots-clés en anglais ou en pinyin (≤40 caractères,[a-z0-9-]), par exemplexiaomi-17-price,ai-coding-jobs. Si le titre purement chinois ne peut être converti en ASCII, vous écrivez en pinyin ; en dernier recours, utilisezzh-video(le code a également ce fallback du même nom).timestamp=YYYYMMDD-HHmm;outputDir=<espace de travail actuel>/videos/<slug>-<timestamp>/— dans l'espace de travail : pratique pour la livraison, et ne pollue pas le répertoire du skill (le sandbox DSH n'autorise généralement l'écriture que dans l'espace de travail).mkdir -p. L'emplacement de la bibliothèque d'effets sonores est pointé parSFX_DIRdans.envversassets/sfxdans le skill, découplé du répertoire de sortie ; si la bibliothèque est vide, cette étape est automatiquement ignorée, sans affecter le flux principal.
Étape 4 : Lire le répertoire des modèles
Lisez PROJECT_DIR/templates/CATALOG.md, confirmez les modèles et leurs emplacements.
Utilisez uniquement les templateId du CATALOG. Actuellement :
HOOK (un seul) : frame-liquid-bg-hero — auréole aurora + grand titre + CTA.
BODY (à choisir selon le contenu, voir Étape 5) :
frame-vignelli— 1 chiffre, fond charbon foncé + rouge.frame-pentagram-stat— 1 chiffre/référence, fond sombre néon (grille suisse, chiffre orange lumineux + accent cyan + graphique à barres).frame-bold-poster— déclaration forte multi-lignes + grand chiffre.frame-build-minimal— phrase courte percutante, fond sombre + un mot très grand et gras (glow orange, apparaît lettre par lettre).frame-creative-voltage— slogan créatif, séparation bleu électrique + écriture manuscrite.frame-glitch-title— décalage cyberpunk RGB (fond bruité), adapté aux actualités soudaines/technologies.frame-aicoding-list— liste 2–5 éléments (chaque élément icône + étiquette de niveau), fond dégradé sombre.frame-aicoding-comparison— comparaison A vs B (deux cartes dégradées + badge WIN + données).
OUTRO : frame-logo-outro (par défaut : logo glow + marque + tagline + url) ;
frame-statement-outro (alternative : fond papier carte rouge).
Les valeurs d'exemple intégrées aux 11 modèles (
data-composition-variables) ont toutes été remplacées par des exemples chinois, vous pouvez voir l'effet final directement dans l'aperçu, ou les copier dansscript.jsonen les modifiant. Mais lors du rendu, passez explicitementinputs: sinon les variables ne seront pas accessibles à l'exécution et le texte sera vide.
Étape 5 : Générer script.json
{
"version": "1.0",
"renderer": "hyperframes",
"aspect": "9:16",
"metadata": {
"title": "...",
"source": { "url": "...", "domain": "...", "image": null },
"channel": "Nom de la chaîne chinoise"
},
"voice": { "provider": "omnivoice", "speed": 1.0 },
"scenes": [
/* 8–12 scènes : 1 hook + 6–10 body + 1 outro */
]
}
providerfixeomnivoice(TTS local, pas besoin de voiceId/API key).- Chaque scène :
{ id, type, voiceText, templateId, inputs };inputsdoit couvrir les emplacements obligatoires de ce modèle dans le CATALOG. scenes[0].type = "hook";scenes[-1].type = "outro"(frame-logo-outro).- 8–12 scènes ;
voiceTexttotal environ 350–450 caractères (≈90–120s, vitesse chinoise environ 4,5 caractères/s ; la durée finale est déterminée par la voix, le pipeline s'adapte à la voix). Chaque scène body 30–45 caractères, ne traite qu'un seul point ; si un paragraphe a deux points, divisez-le en deux scènes. Objectif : chaque scène dure 6–10s.
Correspondance contenu → modèle :
- hook → fixe
frame-liquid-bg-hero(emplacements : kicker, headline, subheadline, cta, brand).headlinepar défaut dégradé jaune→violet, peut être modifié avecheadline_from/headline_to(deux hex). - body → vous choisissez le modèle le plus adapté selon le contenu, et variez autant que possible, n'utilisez pas le même pour tous les body :
frame-vignelli: scène avec 1 chiffre à mettre en avant (kicker, number, label, note, brand).frame-pentagram-stat: 1 chiffre de référence/pourcentage + effet graphique à barres (label, headline=chiffre, subtitle, anchor, footer_left, footer_right).frame-build-minimal: phrase courte percutante/un mot-clé (eyebrow, hero=un seul mot, desc, side_left, side_right).frame-bold-poster: déclaration forte multi-lignes + grand chiffre (kicker, date, figure, headline[], standfirst, footer_left, footer_right). La 2ème ligne deheadlinedevient automatiquement rouge.frame-creative-voltage: slogan créatif (meta, display_lines, accent_index, script, caption).frame-glitch-title: sensation soudaine/technologique/horreur (title, subtitle).frame-aicoding-list: liste/comparaison 2–5 éléments (title, accent, accent_from, accent_to, subtitle, items[]). Chaque élément{icon, title, desc, tag, level}:iconà choisir par vous (emoji 🚫 ⚠️ ✅ ❌ 📈 💡 🔒 🚀 …) ;level∈danger|warn|good|infodétermine la couleur ;tagdoit être un court libellé chinois (高危 / 注意 / 利好 / 稳健) ;accent_from/accent_toà choisir par vous (deux hex).frame-aicoding-comparison: compare deux choses (badge, pre, vs, post, left{}, right{}). Chaque côté{label, from, to, icon?, bullets[], stat?, stat_label?, win?};from/tosont deux hex de dégradé (de préférence contraste chaud/froid entre les deux côtés) ;win: truemarque le gagnant.- Suggestion de rythme : si les scènes avec chiffres sont nombreuses, alternez
frame-vignelli(charbon+rouge/jaune) avecframe-pentagram-stat(néon sombre orange/cyan) ; pour les scènes sans chiffres, utilisezframe-build-minimal.
- outro →
frame-logo-outro(brand_name, tagline, primary_url).
Règles de mise en page chinoise (textes à l'écran inputs)
- Le chinois prend plus de place que l'anglais/vietnamien : limitez chaque ligne à 10–14 caractères chinois, sinon passez à la ligne ou réduisez le texte ;
headlinemaximum 3 lignes. Mieux vaut deux caractères en moins que de créer deux lignes et demie. - La police des modèles est
Inter Tight+system-ui, le chinois tombe en fallback sur PingFang SC, normalement correct ; si le rendu affiche des carrés/豆腐块, insérez"PingFang SC", "Noto Sans SC",au début defont-familydans lecompositions/portrait.htmldu modèle concerné, puis refaites le rendu. - Le chinois n'a pas besoin d'espaces entre les mots ; n'ajoutez pas manuellement de
letter-spacingnégatif, le-3pxpar défaut des modèles peut coller les caractères ; si le titre semble trop serré, remplacez dans la classe concernée parletter-spacing: -1px. - Les émoticônes sont autorisées dans les textes à l'écran, mais 0–1 par champ ; ne les insérez pas dans les champs qui apparaissent lettre par lettre
(comme
herodeframe-build-minimal), sinon l'animation sera cassée. - Les chiffres conservent leur joli format à l'écran (
4499 元,82.7%,17), ce n'est que dansvoiceTextqu'ils sont convertis en caractères chinois.
Règles du TTS chinois (voiceText à respecter impérativement)
OmniVoice lit caractère par caractère, les chiffres arabes, les points décimaux, les symboles monétaires sont souvent mal lus ou lus en anglais.
Par conséquent, dans voiceText, écrivez tous les chiffres en caractères chinois ; dans inputs (textes à l'écran), conservez les chiffres.
| Forme | Exemple incorrect | Écriture correcte |
|---|---|---|
| Décimal | 82.7% | 百分之八十二点七 |
| Version | iOS 18.2 | iOS 十八点二 |
| Modèle produit | 小米 17 | 小米十七 |
| Pixel | 200MP | 两百万像素 |
| Capacité batterie | 5000mAh | 五千毫安时 |
| Ordre de grandeur | 1M tokens | 一百万 token |
| Renminbi | ¥4499 | 四千四百九十九元 |
| Dollar | $5 | 五美元 |
| Multiple | 2x | 两倍 |
| Pourcentage | 30% | 百分之三十 |
| Durée | 60s | 六十秒 |
| Ratio | 3:1 | 三比一 |
| Année | 2026 年 | 二零二六年 |
| Billion | 21 万亿 | 二十一万亿 |
| Classement | Top 3 | 前三名 |
- Abréviations anglaises : testez d'abord avec une sonde avant de décider :
AI,GPT,API,5G,GPUpeuvent parfois être lues lettre par lettre ("A-I"), parfois lues comme un mot anglais. Avant de les inclure dans la vidéo, testez deux phrases en parallèle :AI 很强大vs人工智能很强大, choisissez la version qui sonne naturelle, et unifiez tout le film. - Les noms de marque conservent leur original (
Apple,OpenAI,小米), les marques chinoises s'écrivent en chinois. voiceTextinterdit formellement : émoticônes/icônes, URL, et symboles comme& % $ # + = /; terminez les phrases par。ou?pour une pause naturelle ; utilisez,pour les virgules.- Choix entre "两" ou "二" pour les chiffres : utilisez "两" pour les quantificateurs oraux (两千, 两万, 两倍), et "二" pour les ordinaux/années (二零二六年, 第二季度).
Étape 6 : Auto-vérification
scenes[0]est le hook, le dernier est l'outro ; chaquetemplateIdest dans le CATALOG ; chaqueinputscouvre les emplacements obligatoires ;- Largeur des lignes chinoises ≤14 caractères, headline ≤3 lignes ;
voiceTextsans chiffres arabes/symboles/émoticônes ; émoticônes uniquement dansinputs; cohérence des termes et de la prononciation des abréviations dans tout le film ; voiceTexttotal 350–450 caractères. Maximum 2 tours de correction silencieuse.
Étape 7 : Écrire script.json
Utilisez l'outil write pour écrire dans <outputDir>/script.json (faites d'abord mkdir -p du répertoire de sortie).
Étape 8 : Exécuter le pipeline
Démarrez d'abord le TTS chinois (voir début) et confirmez que la sonde produit bien un fichier audio, puis exécutez au premier plan :
cd "$HOME/.agents/skills/create-template-video-zh" && npm run pipeline -- "<outputDir>/script.json"
Le CLI suit le pipeline des modèles avec renderer: "hyperframes" : TTS → rendu modèle par modèle → alignement sur la durée de la voix → assemblage + mixage. En cas d'échec, signalez clairement l'erreur et donnez le chemin du outputDir (les voice/scene-*.mp3, clips/scene-*.mp4 déjà rendus seront réutilisés, supprimez-les pour refaire le rendu).
Lorsque vous modifiez le texte chinois et relancez, supprimez d'abord les voice/scene-*.mp3 correspondants, sinon les anciens enregistrements seront réutilisés.
Étape 9 : Livraison
Copiez les trois fichiers produits dans le répertoire de travail de la session, pour faciliter l'ouverture par l'utilisateur :
mkdir -p "<cwd>/videos/<slug>" && cp "<outputDir>"/{video.mp4,voice.mp3,script.txt} "<cwd>/videos/<slug>/"
Puis rapportez (avec des liens cliquables) :
✓ Vidéo : videos/<slug>/video.mp4
✓ Audio : videos/<slug>/voice.mp3 — pour Jianying (sous-titres automatiques/synchronisation labiale)
✓ Script : videos/<slug>/script.txt — texte des plans, facile à modifier manuellement
Durée totale : XX.Xs
Remarques
- Le rendu de chaque scène prend environ 15–20 s (Chromium) ; 8–10 scènes prennent environ 3–5 minutes.
- Le TTS est idempotent (conserve
voice/scene-*.mp3), les clips aussi (conserventclips/scene-*.mp4). - Le TTS chinois a un RTF (facteur temps réel) d'environ 2,8 sur M2 Max : 1 minute de vidéo finale prend environ 3 minutes de TTS pur.
Pour accélérer, réglez
OMNIVOICE_STEPSà16sur le serveur (qualité légèrement réduite, temps divisé par deux) puis redémarrez. - Quand
assets/sfxest vide, la couche d'effets sonores est absente, sans impact sur le flux principal ; pour des effets sonores, exécuteznpm run sfx:download(nécessite Internet) avant de générer (par défaut, ils sont téléchargés dansassets/sfx/du skill, c'est-à-dire l'emplacement pointé parSFX_DIRdans.env). Les mots-clés sémantiques ont déjà été ajoutés en chinois (警告/失败/纪录/首次/倒计时/史诗/悬念…). - Différences avec la version vietnamienne
create-template-video: port TTS 8124 + voix chinoise, table de lecture des chiffres chinois, contraintes de mise en page chinoise, mots-clés SFX chinois, fallback slugzh-video. Le code est une copie indépendante (seulnode_modulesest lié en symlink à la version vietnamienne) ; modifier les modèles/le pipeline n'affecte que ce répertoire. Si vous supprimez la version vietnamienne, pensez à exécuternpm cipour reconstruire les dépendances. - Nouveaux modèles : suivez les instructions de la dernière section de
templates/CATALOG.md, puis ajoutez une ligne dans le CATALOG.