Communitygithub.com

qiaomu-screen2video : capture d'écran → démo bilingue finie

Transforme une capture d'écran existante et sa narration en vidéo finie : alignement micro et débruitage en option, transcription, sous-titres chinois–anglais nettoyés avec mots surlignés, flèches, projecteurs, cartons de chapitre, stickers, musique originale légère et couverture, rendu FFmpeg/ASS.

Qu'est-ce que qiaomu-screen2video : capture d'écran → démo bilingue finie ?

Étape 2 de la recette Vidéo de démo produit (démo complète), issue de joeseesun/qiaomu-screen2video (créé le 2026-10-13, v0.16). Le README montre une image de rendu FFmpeg réel avec sous-titres bilingues surlignés. Garde la voix d'origine, accélère les tutoriels à 1,35x en synchro, utilise un glossaire OCR de l'écran et la détection de mouvement, et ne compte que les ressources réellement produites.

Compatible avec✓Claude Code✓Codex CLI~Cursor
npx skills add joeseesun/qiaomu-screen2video

Demander à votre IA préférée

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

Documentation

Qiaomu Screen2Video

Enregistrement écran existant + narration → alignement/bruit optionnel → ASR → nettoyage/traduction du texte → plan d'effets sémantiques → ASS/FFmpeg pour le rendu final. La couverture et la musique de fond peuvent être préparées en parallèle après la transcription. Seules les ressources effectivement obtenues sont comptées comme terminées.

Choix par défaut

  • Conservation intégrale de l'audio original, sans couper les hésitations ou les pauses. Par défaut, les tutoriels d'enregistrement écran sont synchronisés avec speed: 1.35 pour accélérer images, narration et sous-titres ; lorsque l'utilisateur demande explicitement la vitesse originale, elle est réglée sur 1.0. Suppression dans les sous-titres des mots de remplissage comme « euh », « ah », « alors » sans valeur, mais conservation de « alors » avec une logique séquentielle, des négations, des chiffres et des noms propres. Conservation de la transcription brute et des différences textuelles.
  • Combinaison fixe par défaut signature : chinois 霞鹜新晰黑 Regular 400, anglais Atkinson Hyperlegible Next SemiBold 600. Le chinois a une structure claire et une touche humaine sans être excessivement arrondi ; l'anglais renforce la distinction entre lettres et chiffres facilement confondables. Convient pour les sous-titres bilingues sur petits écrans de téléphone. Les deux polices sources et leurs licences respectives (chinois IPA Font License 1.0, anglais OFL-1.1) sont incluses dans la skill, copiées dans le cache lors de l'exécution.
  • Caractères chinois blancs avec contour noir, caractères anglais noirs avec contour blanc ; chinois en haut, anglais en bas. Les mêmes codes temporels sont partagés par unité de sous-titre. Taille de police de base pour la hauteur 1080 : 56/38, l'anglais représentant environ 68 % du chinois ; pour le chinois, utiliser 1,2 px, ombre noire à 55 % d'opacité, pour l'anglais, 0,8 px, ombre noire à 40 % d'opacité ; le contour et l'ombre sont mis à l'échelle proportionnellement à la hauteur de l'écran. Les deux lignes utilisent un espacement serré de sous-titres de film, avec la ligne de base de l'anglais située dans la zone de sécurité à environ 7,5 % du bas. Ne pas confondre « taille de police 7 » de CapCut avec 7 px de FFmpeg.
  • Effets pilotés par le contenu activés par défaut : mise en évidence mot par mot des mots clés avec timestamps en utilisant la couleur 向阳朱 ; les conclusions, les chiffres et les noms de produits peuvent apparaître en caractères animés; les interactions explicites de l'interface utilisateur utilisent des flèches, des encadrements et des masques de projecteur ; seules les transitions structurelles réelles utilisent des cartes de chapitre. Toutes les durées sont évaluées sur la ligne de temps finale du rendu, et doivent tenir compte de speed : les cartes de chapitre plein écran durent au moins 1,8 seconde, généralement 2,2–4,0 secondes selon la quantité de texte ; pour les rendus de moins de 60 secondes, au maximum une carte par défaut, les autres transitions utilisant des caractères animés ou des indications. Un seul visuel principal est conservé à la fois pour les caractères animés, les indications et les cartes. Les effets sonores associés pop/click/whoosh/chime sont tous composés et mixés de manière originale par le script, avec un mixage léger par défaut, sans dépendre de ressources audio tierces soumises à des droits d'auteur. Les couleurs de la marque sont fixes : noir arbre #111513, 向阳朱 #F05A3C, blanc chaud #F5F0E8. Lire d'abord Méthode de montage, le schéma spécifique se trouve dans Effets sémantiques.
  • Les proportions, le contenu et la taille des pixels de l'image originale sont prioritaires. Par défaut, utiliser overlay de type sous-titre de film, sans ajouter automatiquement de fond noir. Le chinois est placé au-dessus de l'anglais, l'anglais près de la zone de sécurité à 7 % du bas de l'écran ; en cas d'occlusion, ajuster d'abord la position des sous-titres ou la coupe des phrases, utiliser band uniquement si l'utilisateur le choisit explicitement.
  • Par défaut, la couverture dure 0,7 seconde en début de vidéo ; la vidéo originale et les deux sous-titres sont décalés en conséquence. Si l'utilisateur souhaite une couverture indépendante, définir intro_seconds: 0.
  • Fin fixe par défaut terminal de 6 secondes : environ 3 secondes pour l'apparition de l'avatar, la frappe du terminal et l'entrée du compte, environ 2,15 secondes de plan fixe complet, puis 0,7 seconde de fondu enchaîné et environ 0,15 seconde de noir pur à la fin. Le texte utilise une ombre légèrement transparente proportionnelle à la taille de la police, se détachant doucement du fond sombre ; ne pas utiliser de texte lumineux. La zone de compte est fixe : X, GitHub, le compte public WeChat « 向阳乔木推荐看 » et le site web qiaomu.ai, chaque élément avec son icône correspondante. Adapter automatiquement en version paysage ou portrait natif en fonction des proportions de la vidéo source, interdiction de recadrer une fin paysage pour la faire passer pour une fin portrait.
  • Tous les rendus finaux sont testés pour la sonie du mix final et écrits dans output/render.json. Par défaut, ramenés à -17 LUFS-I, LRA cible 7 LU, crête réelle ne dépassant pas -1,5 dBTP : augmenté si trop faible, diminué si trop fort, non livré si dépassement de ±1 LU ou crête réelle supérieure à -1 dBTP. voice_lufs utilisé uniquement pour les voix originales particulièrement instables, par défaut null ; voir Sonie et perception pour plus de détails.
  • Musique de fond exclusivement instrumentale par défaut. Pour les tutoriels, utiliser « vif, concentré, avec une sensation de progression », par défaut 96–112 BPM, percussions légères, motifs courts simples et basses modérées ; ne pas transformer « joyeux » en rythmes agressifs, drops forts ou mélodies dominantes qui couvrent la parole. Volume faible, fondu d'entrée sinusoïdal à mi-amplitude de 0,5 seconde, fondu de sortie de 3 secondes, réduction de volume par sidechain pendant la parole ; la musique de fond doit couvrir la fin complète et le noir final, le sidechain se relâche naturellement après la fin de la parole, la musique remonte légèrement et s'arrête avec l'image. La piste de narration sélectionnée est l'entrée du sidechain.
  • Chaque étape rafraîchit review.html, sans attendre que l'utilisateur l'ouvre, le sélectionne ou l'approuve. Les retours de l'utilisateur influencent les étapes suivantes ou le rerendu ; le HTML en lui-même ne peut pas lancer de tâches.

Chemin rapide (par défaut dans cet ordre, pour réduire les retouches)

  1. init → ASR (en arrière-plan) ; en parallèle visual.py analyze (environ 0,4× la durée source) : mouvement de caméra, fenêtre stable, vocabulaire OCR de l'écran. ASR lit automatiquement le vocabulaire comme prompt, et pour les mots aux timings aberrants (un seul caractère durant plusieurs secondes), ré-exécute automatiquement la reconnaissance et recalibre le timing.
  2. Dès la transcription disponible : vérifier/corriger l'orthographe des noms de produits/modèles en se référant à work/visual-analysis.json.vocabulary (les prompts Whisper ne corrigent pas tout, une vérification manuelle est nécessaire), écrire captions.json (les sous-titres fusionnés, divisés ou retimés reçoivent un nouvel ID + parent_ids), motion-plan.json, brief.json.
  3. En parallèle : générer trois arrière-plans de couverture (trois appels en une fois), music_synth.py pour la musique, outro_compose.py.
  4. Validation motion → un seul render → extraction d'images clés + vérification de sonie par segments → livraison. Un seul rendu final est effectué ; les retours utilisateur déclenchent un nouveau rendu.
  5. Avant la livraison, informer d'abord l'utilisateur du chemin du rendu final, puis effectuer les améliorations de la skill, etc.

Démarrage et exécution

Le chemin de la skill se trouve dans le répertoire contenant ce SKILL.md. Le code source personnel se trouve uniquement dans /Users/joe/Nutstore Files/.agents/skills/qiaomu-screen2video ; les autres chemins de découverte utilisent des liens symboliques. L'installation portable ne dépend pas de ce chemin absolu.

# Environnement créé une seule fois ; les polices de sous-titres par défaut sont incluses dans la skill, les autres polices optionnelles sont mises en cache selon les besoins.
uv venv ~/.cache/qiaomu-screen2video/venv
uv pip install --python ~/.cache/qiaomu-screen2video/venv/bin/python 'fonttools[woff]' pillow numpy opencv-python-headless ocrmac
# Ci-dessous, $PY désigne l'interpréteur Python de cet environnement, $SKILL le répertoire racine de la skill, $JOB le répertoire de sortie de cette exécution.
"$PY" "$SKILL/scripts/fonts.py"
# Samples d'instruments réels pour la musique (recommandé, unique) : FluidSynth + GeneralUser GS (32 Mo, libre de droits) ; en cas d'absence, retour automatique à la synthèse pure par code.
brew install fluid-synth   # Linux: apt install fluidsynth
mkdir -p ~/.cache/qiaomu-screen2video/soundfonts && curl -fL -o ~/.cache/qiaomu-screen2video/soundfonts/GeneralUser-GS.sf2 \
  https://raw.githubusercontent.com/mrbumpy409/GeneralUser-GS/684543d5e5efaef08d02be50dcda8d552478fa60/GeneralUser-GS.sf2
"$PY" "$SKILL/scripts/s2v.py" init "$VIDEO" --project "$JOB"
# Si un débruitage ou un alignement d'enregistrement indépendant est nécessaire, exécutez d'abord la section suivante local_audio.py, puis démarrez ASR.
"$PY" "$SKILL/scripts/visual.py" analyze "$JOB"   # Vocabulaire écran et mouvement de caméra, pour ASR, sous-titres et callouts
"$PY" "$SKILL/scripts/asr.py" "$JOB" --engine auto --context 'Produits et terminologie de cette vidéo'

FFmpeg système doit inclure libass ; le script détecte d'abord ffmpeg-full sur macOS. Les dépendances manquantes sont ajoutées uniquement si nécessaires, sans charger qiaomu-cut ni installer un framework vidéo complet. Avant la reconnaissance, se référer à ASR pour déterminer le moteur et la précision temporelle.

Traitement audio optionnel de la narration

Lorsque l'utilisateur demande un débruitage, ou fournit un enregistrement micro externe de la même narration, lire Audio local. Exécuter après init et avant ASR ; la même piste audio traitée est utilisée pour la reconnaissance, le mixage et le sidechain. Les changements audio invalident les anciens caches de reconnaissance, sous-titres et rendus finaux, nécessitant une ré-exécution de l'ASR et du nettoyage/traduction du texte. Par défaut, l'audio original est conservé.

"$PY" "$SKILL/scripts/local_audio.py" "$JOB" --denoise
# Estime automatiquement le décalage temporel de l'enregistrement indépendant et peut également débruiter en même temps :
"$PY" "$SKILL/scripts/local_audio.py" "$JOB" --voice "$VOICE" --denoise
# Restaurer l'audio original, puis ré-exécuter ASR et rendu :
"$PY" "$SKILL/scripts/local_audio.py" "$JOB" --reset

L'adaptateur ne prend en charge que les bibliothèques/modèles validés de CapCut 11.5.0 sur Apple Silicon macOS ; l'inférence native est interdite sans connexion réseau ; ne pas lancer l'interface utilisateur de CapCut, ne pas empaqueter les bibliothèques/modèles propriétaires. En cas d'échec de détection, signaler clairement, ne pas qualifier le rendu audio original de réussi après débruitage. Les fonctionnalités non encore opérationnelles ou de qualité insuffisante (découpage de plans, séparation vocale, points de synchronisation automatiques, etc.) ne font pas partie de ce processus.

Quatre tâches de contenu pour l'agent

  1. Lire $JOB/transcript.raw.json et les images clés représentatives. Sortie : $JOB/captions.json : {"segments":[{"id":"c0001","start":0.1,"end":2.3,"zh":"Texte chinois nettoyé","en":"Natural English."}]}. Conserver les ID et les timings ; en cas de re-segmentation intentionnelle, utiliser un nouvel ID, parent_ids et des codes temporels dans la plage temporelle d'origine, privilégier l'utilisation de words, ne pas diviser la longueur du texte de manière égale en prétendant à un alignement précis. Les mots de remplissage peuvent être laissés vides en chinois et en anglais. Traduire par contexte global, puis mapper à ces ID ; ne pas faire de traduction mot à mot automatique, ne pas utiliser Whisper turbo pour la traduction.
  2. Lire la transcription complète, les timings par mot et les images clés représentatives. D'abord, selon Méthode de montage, identifier l'accroche, le corps, la preuve et la conclusion. Ensuite, selon Effets sémantiques, écrire $JOB/motion-plan.json. D'abord comprendre « pourquoi cette phrase a besoin d'un effet », puis choisir : mise en évidence mot par mot, caractères animés pour mots clés (label étiquette / stroke contour TikTok / card carte, uniforme pour toute la vidéo, règles esthétiques dans le document sur les effets sémantiques), autocollants d'expression/mèmes, indications d'interface ou cartes de chapitre. Ne pas ajouter sans fonction sémantique. Les caractères animés et autocollants utilisent at_word pour se caler sur la prononciation, densité et position selon les règles du document sur les effets sémantiques. Le target des indications d'interface doit provenir de l'observation réelle de l'écran, en utilisant des coordonnées normalisées de 0 à 1, ne pas deviner la position des boutons à partir des sous-titres. La durée des cartes de chapitre doit être convertie sur la ligne de temps finale du rendu, et être lisible pendant l'entrée, le maintien complet et la sortie. Après l'écriture, exécuter la validation motion ; les avertissements apparaissent dans le HTML, mais ne bloquent pas la génération normale ; si la carte de chapitre est visible moins de 1,8 seconde, le rendu est directement bloqué.
  3. Écrire $JOB/brief.json à partir de la narration réelle, format dans Contenu et ressources. Les promesses de titre doivent être prouvées par la transcription. Par défaut, trois couvertures sont conçues en parallèle : la couverture d'en-tête correspond parfaitement aux pixels et proportions de la vidéo source, la miniature de la plateforme est réalisée séparément en 16:9, la distribution verticale séparément en 9:16 ; les trois sont recomposées, interdiction d'utiliser des bordures noires pour combler les proportions ou de recadrer mécaniquement. Si l'utilisateur ne demande pas de tours de candidature, choisir la direction YouTube/Bilibili la plus claire et continuer. Priorité à l'imagegen intégré du Codex actuel ; si indisponible, appeler une API/compétence tierce configurée. La génération d'image s'occupe du fond sans texte, le titre précis est mis en page par cover_compose.py. Ne pas falsifier d'outils, d'API, de résolutions ou d'états de réussite.
  4. Musique de fond par défaut composée originalement avec du code : scripts/music_synth.py écrit la partition selon brief.json.music_profile, avec FluidSynth + banque de sons, rendu avec des samples d'instruments réels (environ 2 secondes) ; sinon, synthèse pure par code ; enregistrer le fournisseur comme code-synth (le engine dans le JSON de résultat enregistre le rendu réel). Ce n'est que si l'utilisateur demande explicitement YuE2/Suno ou fournit sa propre musique que la route correspondante est empruntée : YuE2 lit le workflow musical yue2-music (Apple Silicon avec --device auto via MPS, environ 30 minutes ou plus par morceau, en arrière-plan, livrer d'abord la version avec musique code), Suno lit qiaomu-suno-master. Chaque fois, n'enregistrer que l'audio réellement obtenu et jouable. Ne pas intégrer le flux complet de qiaomu-cut pour la musique.
"$PY" "$SKILL/scripts/s2v.py" asset "$JOB" cover "$INTRO_COVER" --provider codex-imagegen
"$PY" "$SKILL/scripts/s2v.py" asset "$JOB" music "$BGM" --provider yue2-music
"$PY" "$SKILL/scripts/s2v.py" motion "$JOB"
"$PY" "$SKILL/scripts/outro_compose.py" "$JOB"
# Musique originale par code (repli ou spécifié par l'utilisateur) ; --seconds prend la durée du rendu final :
"$PY" "$SKILL/scripts/music_synth.py" "$JOB/work/code-music/bed.wav" --seconds "$FINAL_SECONDS" --profile calm_explainer
"$PY" "$SKILL/scripts/s2v.py" asset "$JOB" music "$JOB/work/code-music/bed.wav" --provider code-synth
# Pour les ressources de fin communes aux deux plateformes :
"$PY" "$SKILL/scripts/outro_compose.py" "$JOB" --variants
"$PY" "$SKILL/scripts/s2v.py" render "$JOB"

L'échec d'une ressource optionnelle ne bloque pas les autres travaux autorisés. Les ressources déjà acquises avant l'exportation sont utilisées directement ; seules les transcriptions/traductions réellement dépendantes doivent être attendues. Si l'utilisateur demande explicitement toutes les ressources, la version produite en premier est marquée comme « version aperçu des sous-titres », puis un nouveau rendu est effectué après l'obtention des ressources.

HTML et modifications

review.html est une page locale de visualisation/décision ; une fois ouverte, elle permet de lire le rendu final, de voir les sous-titres phrase par phrase et la chronologie des effets sémantiques, de vérifier la couverture et la musique. Il est possible d'activer/désactiver tous les effets, la mise en évidence mot par mot et les effets sonores légers, et d'ajuster le gain des effets sonores. Les sous-titres CSS de la page initiale sont indicatifs ; les polices réelles, contours, retours à la ligne, positions cibles et effets sont rendus par ASS et vérifiés par extraction d'images clés.

"$PY" "$SKILL/scripts/s2v.py" report "$JOB"
"$PY" "$SKILL/scripts/s2v.py" apply "$JOB" /path/to/decisions.json
"$PY" "$SKILL/scripts/s2v.py" render "$JOB"

Les paramètres de téléchargement ne modifient pas les tâches en arrière-plan. Ils ne prennent effet qu'après application explicite par l'agent ; les modifications des entrées, paramètres, sous-titres ou ressources rendent les anciens rendus obsolètes. Par défaut, aucun serveur, démon ou étape d'attente de confirmation n'est créé.

Livraison et vérification

  • Le script vérifie l'appariement des sous-titres, les plages temporelles/chevauchements, la couverture des polices, les retours à la ligne, la durée, les dimensions de l'image, les pistes audio et le décodage complet. En cas d'échec, les logs sont conservés ; les nouvelles tentatives ne remplacent pas la vidéo originale.
  • Examiner les images clés réelles (début, sous-titre le plus long, au moins un exemple de chaque type d'effet, avant/milieu/après de la vidéo principale) et regarder le rendu final complet à la vitesse de lecture 1×, sans se contenter de vérifier les codes temporels des sources originales. La mise en évidence mot par mot doit être synchronisée avec la prononciation ; les cadres d'indication doivent pointer vers les véritables contrôles ; les cartes de chapitre doivent être vérifiées au moins à l'entrée, à mi-parcours du maintien et à la dernière image avant la sortie, en confirmant que le texte peut être lu et ne masque pas les opérations clés en cours. Écouter également une partie de la narration + musique + effets sonores légers. Dans output/render.json, visual_review/audio_review ne doivent être mis à passed qu'après une véritable vérification, les mesures numériques ne peuvent pas se substituer à une écoute/visionnage humains.
  • Livrer output/final.mp4, zh.srt, en.srt, bilingual.srt, subtitles.ass, motion-plan.json, output/motion-qa.json, la couverture, review.html. Signaler le moteur ASR et la précision temporelle, lister les ressources optionnelles non obtenues.
  • Ne pas télécharger/publier le rendu final sur une plateforme vidéo ; cela nécessite une demande explicite de l'utilisateur.

Jugement et rythme du montage : Méthode de montage. Base stylistique et choix : Méthode de sous-titrage. Timing, schéma et zone de sécurité des effets : Effets sémantiques. Règles de fin : Fin et appel à l'action. Validation audio : Sonie et perception. Configuration ASR : ASR. Couverture/musique : Contenu et ressources.

Skills associés