Communitygithub.com

chengfeng-videocut-skills / Sous-titrage

Ajoute des sous-titres à des enregistrements vocaux montés : utilise directement le transcript mot-à-mot et le registre de montage pour calculer les temps après coupe (sans export ni retranscription), corrige les noms propres mal entendus via un dictionnaire et le script, segmente par phrase, et permet une vérification écran par écran dans Studio.

Qu'est-ce que Sous-titrage ?

Cette compétence permet de générer et de corriger les sous-titres d'une vidéo de type 'enregistrement vocal' (par exemple, un tutoriel ou une présentation) **sans avoir à ré-exporter la vidéo ni à retranscrire l'audio**. Elle fonctionne en s'appuyant sur deux fichiers existants : le `transcript.json` (transcription mot-à-mot avec timestamps) et le `edit-list.json` (le 'registre de montage' qui indique quels segments sont conservés et à quel moment dans la vidéo finale). Cela évite les erreurs de désynchronisation et les coûts inutiles de réécoute audio. La compétence est conçue pour les plateformes de montage vidéo où l'utilisateur a déjà effectué une coupe grossière. Elle corrige les noms propres mal reconnus en utilisant un dictionnaire de termes spécifiques à l'auteur (par exemple, pour remplacer 'Skills' par 'Skill'), et peut aligner le transcript sur un script fourni par l'auteur. La segmentation en sous-titres se fait intelligemment en fonction de la ponctuation, des coupes dans le montage et des pauses, sans jamais créer de fragments trop courts. Enfin, elle permet une vérification écran par écran dans l'interface Studio, où l'utilisateur peut ajuster manuellement chaque ligne avant que le résultat ne soit enregistré dans `subtitles.json`.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Agentchengfeng/chengfeng-videocut-skills/tree/HEAD/plugins/chengfeng-videocut/skills/chengfeng-subtitle

Demander à votre IA préférée

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

Documentation

Sous-titres

C'est une tâche, pas une étape d'un processus. L'utilisateur l'appelle quand il en a besoin — juste après un montage, ou après avoir supprimé deux phrases et souhaitant refaire les sous-titres.

Il n'y a qu'un seul prérequis : le registre de montage doit exister. Non pas parce que ça vient après le montage, mais parce que sans lui, le script ne sait pas quelles phrases sont conservées et à quelle seconde elles apparaissent dans le montage final.

Nécessite   edit-list.json (registre), transcript.json (transcription mot-à-mot)
Produit     subtitles.json

La tâche s'arrête là, ne dirige pas l'utilisateur vers l'étape suivante.

Lire et exécuter d'abord le Contrat de phase du skill métier, les critères sont dans Règles de correction des sous-titres, et les écritures des noms propres dans le Dictionnaire de termes AI.

Qui décide de quoi

C'est le fondement de cette section, tout le reste en découle.

Montage vocal   décide « quelles phrases garder et à quel moment »   ← source unique de vérité temporelle
Sous-titres     décident « quel texte afficher à l'écran »           ← source unique de vérité d'affichage

Un sous-titre stocke une liste d'IDs de mots + le texte affiché, pas de secondes. Le temps est recalculé à chaque fois à partir du registre. Ainsi, il n'y a pas de deuxième source de temps qui pourrait dériver. Les sous-titres obsolètes peuvent être détectés avec précision : « Les mots des sous-titres 7 et 12 ont été coupés », plutôt qu'un vague « les sous-titres sont peut-être obsolètes ».

Le sous-titre stocke son propre texte intentionnellement. La transcription répond à « ce qu'il a dit », le sous-titre répond à « ce qu'on montre aux spectateurs » — la ponctuation, les tics de langage supprimés, l'écriture formelle des noms propres, tout ça doit être différent. Forcer une seule chaîne de caractères à faire les deux empêcherait à jamais d'ajouter des virgules.

0. Prêt

Exécuter d'abord la « vérification de prêt » de Vérification des mises à jour — les skills sont-ils à jour, le Runtime est-il compatible ; le répertoire racine du plugin y est aussi localisé (dans les commandes de ce document, <racine-plugin> est remplacé par ce chemin littéral). Continuer seulement si « prêt » ; si « nouvelle session nécessaire » ou « stop », exécuter ses instructions (y compris l'interdiction de créer une interface de substitution). Le skill métier n'a pas sa propre logique d'environnement.

Si le résultat du prêt est runtime.kind=desktop-managed, réutiliser directement le CLI stable déjà installé par l'application de bureau et le même service launchd/tâche windows ; ne pas analyser le chemin d'Electron, installer des dépendances supplémentaires ni lancer un second Runtime.

1. Assertions d'entrée

node "<racine-plugin>/scripts/ensure-running.cjs" --json
node "<racine-plugin>/scripts/videocut-cli.cjs" inspect "<répertoire-projet>" --json
AssertionSi non vérifiée
edit-list.json existe et contient des segmentsDire clairement que le registre manque, demander à l'utilisateur d'appeler d'abord le montage vocal. Ne pas faire le montage soi-même.
transcript.json existeLe projet n'est pas prêt, s'arrêter. Ne pas en créer un soi-même.

Ne pas vérifier l'existence de source_cut.mp4, ni faire de transcription. Les sous-titres n'ont besoin ni de l'un ni de l'autre — voir la section suivante.

2. Correction du texte : d'abord le dictionnaire, puis le script

Pas besoin de retranscrire. La transcription mot-à-mot existante contient déjà les timestamps, et le registre sait quels segments sont conservés — la position de chaque mot dans la vidéo finale est calculée, pas obtenue en réécoutant :

La seconde du mot dans la vidéo source   la transcription la donne
Quels segments sont conservés            le registre le donne
La seconde du mot dans la vidéo finale   le calcul des deux le donne

Renvoyer l'audio à un ASR ne ferait que réécouter la même chose, coûter du temps et de l'argent, et en plus mal — il faudrait à nouveau corriger les noms propres. (transcript retranscribe est un vestige de l'ancien design, où les sous-titres utilisaient la transcription de la vidéo montée pour obtenir la timeline. Maintenant que les sous-titres sont ancrés par IDs de mots, ce problème n'existe plus. Ne pas l'utiliser pour les sous-titres.)

Deux outils différents, tous deux à utiliser.

# Dictionnaire : écriture fixe de ce locuteur, sans besoin de preuve
node "<racine-plugin>/scripts/videocut-cli.cjs" transcript dictionary "<répertoire-projet>" --dictionary "<racine-plugin>/references/ai-term-dictionary.md" --json

# Script : seulement si l'auteur a un script, chaque correction nécessite une preuve
node "<racine-plugin>/scripts/videocut-cli.cjs" transcript align "<répertoire-projet>" --script "<fichier-script>" --json
Dictionnaire   toujours écrire ainsi           sans regarder le contexte, corriger directement, lister les modifications
Script         seulement si le contexte correspond   preuve exigée pour chaque modification, signaler « incertain » sinon, ne pas deviner

Pourquoi le dictionnaire est indispensable, le script seul ne suffit pas : les enregistrements vocaux sont ré-enregistrés. Dans un projet réel, la même phrase a été enregistrée quatre fois, donc des contextes comme « connect叉 » et « 叉is » apparaissent plusieurs fois. L'alignement ne peut que signaler « incertain », car il ne devine pas par règle — un nom mal écrit est pire qu'un mot mal entendu. Sur trois occurrences de « 叉 », il n'en corrige qu'une seule. Le dictionnaire n'a pas ce problème : dans les œuvres de ce locuteur, « 叉 » est bien « X ».

Il n'y a qu'un seul dictionnaire, dans references/ai-term-dictionary.md au niveau du plugin : il corrige la transcription, et le montage vocal et les sous-titres utilisent la même transcription. Ne pas en créer un autre dans ce skill.

Après la correction, il faut examiner la liste. Le dictionnaire ne regarde pas le contexte, donc il peut aussi faire des erreurs — par exemple normaliser « Skills » (Claude Skills, nom propre pluriel) en « Skill ». Si c'est faux, corriger le dictionnaire, ne pas patcher la commande.

transcript align ne fait que signaler, n'applique pas. Pour appliquer ses propositions, convertir les corrections en [{wordId, text}] puis exécuter :

node "<racine-plugin>/scripts/videocut-cli.cjs" transcript correct "<répertoire-projet>" --file "<fichier-correction>" --json

Après avoir corrigé la transcription, les sous-titres qui référencent ces mots sont mis à jour dans la même étape et renvoient subtitles.updated. Ceux qui ne peuvent pas être modifiés (une ligne réécrite manuellement) sont listés dans needsAttention, signalés pour examen, sans deviner.

Quand aucune écriture ne peut être confirmée comme correcte ni par le dictionnaire ni par le script, ne pas deviner. Signaler pour que l'utilisateur complète le dictionnaire — une fois ajouté, la vidéo suivante sera correcte automatiquement. Deviner aujourd'hui, c'est deviner à nouveau la prochaine fois.

3. Segmentation

node "<racine-plugin>/scripts/videocut-cli.cjs" subtitle build "<répertoire-projet>" --json

Quatre règles, dans l'ordre :

① Du contenu a été supprimé ici   Les deux côtés de la coupe sont adjacents dans la timeline mais n'ont aucun rapport sémantique.
                                   Supprimer du « silence » ne compte pas — couper une pause au milieu d'une phrase ne doit pas briser la phrase.
② Tout signe de ponctuation       Ceux donnés par Volcengine, points et virgules sont inclus — **c'est la même granularité que la segmentation du montage vocal**,
                                   les deux coupent au même endroit. La ponctuation est plus forte que toute preuve temporelle : un locuteur peut enchaîner deux phrases sans respirer,
                                   ou faire une pause au milieu d'une phrase.
③ Limite de paragraphe + pause    **Utilisé seulement quand le mot n'a pas de ponctuation.** C'est « quand il n'y a pas de ponctuation, deviner que la phrase se termine par un paragraphe ».
                                   Si la ponctuation existe, la règle ② et la règle de la virgule doivent s'appliquer — elles tiennent compte de la longueur de l'écran, la règle ③ non.
                                   (Déclencher ③ sur une limite avec ponctuation : dans un projet réel, on passe de 40 à 43 écrans, créant plus d'écrans fragmentés.)
④ Longue pause perçue par le public   Pour couper à l'intérieur d'une phrase, un silence plus long est nécessaire.

Montage vocal et sous-titres utilisent la même ponctuation et la même granularité : une virgule = un segment / un écran.

Les fragments (un ou deux caractères) sont fusionnés, mais pas à travers un point — « 你看 » commence une nouvelle phrase, ce n'est pas la queue de la phrase précédente. Le fusionner en arrière donnerait « …utiliser Grok CLI你看 », deux phrases collées ensemble.

Les phrases courtes dites rapidement par le locuteur restent (dans un projet réel, « 每天早上 » et « 执行任务 » font 0,6 seconde chacune). C'est comme ça qu'il parle, pas d'alerte. Un écran par virgule produit forcément ce genre d'écrans. Donner une alerte pour ça reviendrait à alerter pour une parole normale — avec trop d'alertes, personne ne les regarde.

Ce qui dépasse la durée d'un écran est réparti équitablement, un écran par ligne. Si la division crée un fragment d'un ou deux caractères, cela signifie que la limite ② n'était en fait pas un point ; fusionner le fragment avec l'écran précédent.

La commande rapporte quatre choses, toutes à vérifier :

stale              Écrans modifiés par le montage — écran précis, mots perdus
tooFast            Trop de mots, pas assez de temps pour lire
transcriptMoved    La transcription a changé depuis la dernière fois

Quand des sous-titres existent déjà — s'arrêter ici et demander

Sans --replace, la commande refuse. C'est le seul moment dans ce skill où il faut demander le consentement de l'utilisateur, car --replace efface le travail manuel de segmentation et de formulation, que le produit lui-même ne peut pas restaurer.

L'utilisateur veut modifier quelques mots   Ne pas utiliser build. Le laisser modifier directement dans Studio, ou vous dire quels écrans modifier.
L'utilisateur veut tout recommencer         Confirmer puis ajouter --replace.

4. Vérification : écran par écran dans Studio

node "<racine-plugin>/scripts/videocut-cli.cjs" open "<répertoire-projet>" --json

Une fois ouvert, aller à l'onglet « Sous-titres » de la colonne de gauche. Un écran par ligne : à gauche le numéro et le temps, à droite le texte, cliquer pour modifier directement.

  • Entrée = créer un nouvel écran à partir du curseur
  • Retour arrière en début de ligne = fusionner avec l'écran précédent
  • Paramètres → Sous-titres dans la colonne de droite : quatre préréglages au choix, un style pour toute la vidéo
  • Les sous-titres sont visibles directement sur l'image, leur position et leur taille sont proportionnelles à l'image — l'aperçu et la version finale utilisent les mêmes données

Lors de la vérification, demander au moins à l'utilisateur de confirmer : les noms propres sont-ils corrects, aucun mot manquant, la coupe se lit-elle bien, l'écran reste-t-il assez longtemps pour la lecture.

5. Jusqu'à subtitles.json

Cette section est terminée. Pas de coupe physique, pas de storyboard, pas d'animations, pas de rendu vidéo, et ne pas pousser l'utilisateur à l'étape suivante.

Le rapport doit être distinct : le readback structuré Product est API/readback PASS ; la vérification visuelle avec des images réelles du même projet est visual frame PASS ; quand personne n'a réellement vérifié que les sous-titres correspondent à l'image, le rapport doit être human listening UNVERIFIED, sans utiliser de DOM, de captures d'écran ou de sondes de fichiers comme substitut.

Limite : l'incrustation dans l'image n'est pas de cette section

La méthode de sortie prévue est l'incrustation dans l'image, et l'image est dessinée par l'étape d'export. Le produit des sous-titres est subtitles.json — toutes les dimensions sont des pourcentages de l'image, l'export les convertit en pixels selon la résolution de sortie, les deux utilisent les mêmes données.

Aujourd'hui, le mp4 exporté ne contient pas de sous-titres, cette étape n'est pas encore faite. Le rapport doit indiquer clairement cette conséquence, ne pas dire « les sous-titres sont prêts » — l'utilisateur penserait que la vidéo finale en contient.

Récupération et échec

  • subtitles_exist : Des sous-titres existent déjà. Demander d'abord, ne pas utiliser --replace directement.
  • revision_conflict : Un autre processus écrit aussi. Relire, ne pas écraser automatiquement.
  • Le dictionnaire signale « ligne N illisible » : une ligne de tableau mal formatée. Seules les lignes de tableau (| écriture correcte | erreur courante |) sont reconnues ; le texte brut et les listes sont ignorés silencieusement.
  • transcript correct signale « must not change any word id, time or gap flag » : la proposition de modification contient des changements de temps. Modifier uniquement le texte.
  • runtime_unhealthy : Ne pas réinstaller en boucle.
  • En cas d'échec, ne jamais dire « la transcription est terminée » comme « les sous-titres sont prêts ». L'ASR produit la matière première, pas le résultat final.

Individual skills in this repo

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

Agentchengfeng/chengfeng-videocut-skills

剪辑环境的唯一管理者:就绪检查(skills 是否最新 → Runtime 是否配套)、Skills 更新激活、Runtime 安装与体检。用户说检查更新、安装剪辑环境、装播放器、检查剪辑环境、剪辑环境就绪了吗、配置转录凭证时使用;业务 Skill(剪口播/字幕/画面/导出)第 0 步也引用本 Skill 的就绪检查。不用于剪辑、字幕、画面、导出本身或项目数据迁移。

Agentchengfeng/chengfeng-videocut-skills

剪辑中文口播原素材:逐词转录、词典修字出修字表、五轮扫描找口误与重复、汇总表与重复句子表、打开 Studio 让用户复核、复盘沉淀用户偏好与词典。只产出一份已复核的删词账本,不切媒体、不做字幕、不做分镜动画。用户说剪口播、处理口误、生成口播基础素材、继续剪口播,或确认卡回传 action=return_cut_review 时使用。不要用于执行物理剪切、导出剪后视频、单独安装、单独打开工作台或口播分镜成片。

Agentchengfeng/chengfeng-videocut-skills

把剪好的口播烧成一个成片文件:账本切片段、推近、字幕、HTML 画面层,一次全部烧进 mp4。用户说导出、出成片、烧字幕、渲染、导出视频、生成最终文件时使用。不要用于生成删词候选、写字幕、做画面动画。

Agentchengfeng/chengfeng-videocut-skills

整理、脱敏并上报 chengfeng-videocut 的 GitHub Bug。用户说上报 Bug、反馈剪口播问题、提交 GitHub Issue、这个问题告诉开发者,或要求继续提交已预览的 Bug 草稿时使用。不要用于功能建议、普通排错、代码提交或未获用户确认的自动上报。

Agentchengfeng/chengfeng-videocut-skills

操作 chengfeng-videocut 剪辑工作台的已有工程,通过 Runtime CLI 查工程与词句位置、添加或替换画面覆盖层、移除画面、删除明确指定的词句或片段、拆分裁剪移动已有片段、调整画布比例并回读核验。用户说插入片段、删掉这句、移除动画、换个画面、调整顺序或管理时间线时使用;先区分画面覆盖与主轨顺延插入,不负责自动判断口误、创作动画、制作字幕、导出或排查安装故障。

Agentchengfeng/chengfeng-videocut-skills

Create Ian Xiaohei-style HTML/SVG motion illustrations for Chinese articles, scripts, storyboard scenes, workflow explanations, concept metaphors, and short video visual aids. Use when the user asks for 小黑 SVG、漫画感 HTML、分层 SVG 动效、把小黑生图做成 HTML/SVG、可编辑矢量动效、口播流程动画、手绘漫画动效、正文配图动画, or wants a Xiaohei illustration style adapted into controllable HTML/SVG/GSAP output instead of raster image generation.

Agentchengfeng/chengfeng-videocut-skills

给剪好的口播配画面:在录屏上盖 HTML 层(圈重点标注 / 小黑整屏动画 / 推近),层绑字幕屏、由播放器逐帧驱动、直接在预览里看。用户说做分镜、配画面、加动画、圈重点、B-roll、做 storyboard 时使用。不要用于删词剪辑、字幕、物理剪切或成片渲染。

Skills associés