Doublage – Édition de rushes
D'une vidéo brute à un registre de coupes (Cuts + EDL) vérifié manuellement, sans toucher aux fichiers média. Sept étapes en ligne :
0 Préparation Vérification "Mise à jour" (cette compétence n'a pas sa propre logique d'environnement)
1 Création Vidéo réelle → transcription cloud mot à mot → création de projet → démarrage du service → lecture de l'état
2 Correction Dictionnaire corrige les caractères (générique + utilisateur) → tableau de corrections
3 Détection Lecture des préférences et règles → cinq passes, chaque passe ne cherche qu'une catégorie
4 Synthèse Tableau récapitulatif des coupes + tableau des phrases répétées → vérification par relecture
5 Révision Soumission complète → présentation des deux tableaux à l'utilisateur → ouverture de Studio pour vérification manuelle
6 Bilan & Passation Comparaison proposition vs version finale → archivage trois tiroirs → rapport quatre points
Ne pas couper les médias : modifier un registre prend quelques dizaines de millisecondes, couper un fichier est irréversible. Jusqu'à la fin de cette compétence, aucun nouveau fichier vidéo n'est écrit sur le disque. La compétence effectue des jugements sémantiques et de l'organisation ; le Runtime du produit est le seul autorisé à écrire les projets, les Cuts et l'état de Studio.
L'utilisateur ne parle qu'à trois endroits : choisir de continuer ou de recommencer un projet déjà coupé (même source), vérification dans Studio, confirmation de fin. Tout le reste est un rapport unidirectionnel, sans attendre de réponse. Le critère d'achèvement de chaque étape est son artefact de sortie : pas de tableau, pas d'achèvement.
Lire et exécuter d'abord le contrat de phase du Skill métier. Correspondance des étapes ici avec les phases du contrat : 1=preflight+Product state readback, 5=proposal+Product CAS, révision=project-level review binding. Les trois dernières phases (validation, exécution, réception) appartiennent au Skill d'export.
L'historique des incidents de chaque règle se trouve dans le registre des leçons — les règles sont ici, les histoires là-bas.
0. Préparation
Exécutez d'abord la « vérification préparatoire » de Vérification des mises à jour — skills à jour, Runtime compatible ; la racine du plugin y est également localisée (les <racine-du-plugin> dans les commandes de ce document sont remplacées par ce chemin littéral). Ne continuez que si le résultat est « prêt » ; pour « nouvelle session requise » ou « arrêt », suivez ses instructions (y compris l'interdiction de créer une interface de substitution personnalisée).
Si le résultat de la vérification est runtime.kind=desktop-managed, il partage la même entrée stable et le service launchd/windows-task que l'installation CLI. Continuez directement ; ne cherchez pas de répertoire d'installation Electron, n'installez pas Bun/FFmpeg, et ne démarrez pas un second Runtime.
1. Création : entrée réelle → transcription → création de projet
Que faire : transmettre la vidéo réelle locale et la transcription cloud mot à mot au produit, créer le projet de manière atomique, démarrer le service, lire l'état.
# Après la transcription cloud mot à mot (génération d'un candidat de transcription dans le répertoire de tâche) :
node "<racine-du-plugin>/scripts/videocut-cli.cjs" project create "<répertoire-projet>" --video "<fichier-vidéo-dans-répertoire-tâche>" --transcript "<fichier-transcription-dans-répertoire-tâche>" --json
node "<racine-du-plugin>/scripts/ensure-running.cjs" --json # Service garanti déclaratif du produit (5190)
node "<racine-du-plugin>/scripts/videocut-cli.cjs" workflow get "<répertoire-projet>" --json # Product state readback
node "<racine-du-plugin>/scripts/videocut-cli.cjs" cuts get "<répertoire-projet>" --json
Règles :
- N'acceptez que les vidéos de doublage réelles données par l'utilisateur ou un projet réel existant ; en l'absence de média réel, arrêtez-vous, interdisez d'utiliser des exemples ou des vidéos factices.
- La transcription utilise uniquement le cloud ASR autorisé par l'environnement courant ; interdiction de revenir à un ASR local ; si aucun cloud ASR n'est disponible, signalez
missing_cloud_transcription_adapter, n'ouvrez pas Studio, ne fabriquez pas de transcription. --video/--transcriptdoivent être de vrais fichiers dans le répertoire de tâche ; ne transmettez pas le ratio d'aspect — le produit le déduira automatiquement des dimensions réelles de la vidéo (Runtime 0.4.4+). N'ajoutez--aspect-ratio W:Hque si l'utilisateur demande explicitement un ratio spécial.- Si un projet standard existe déjà, inspectez-le d'abord et réutilisez-le, ne créez pas un nouveau
projectId; si la même vidéo a déjà été coupée, demandez à l'utilisateur : continuer ou recommencer (c'est l'un des trois points de parole).project prepareest un compilateur idempotent, à utiliser uniquement pour reprendre une interruption ou un rafraîchissement explicite ; en cas d'interruption, relancez directement. project createest la seule entrée : pas de passage par la bibliothèque de médias, de session de téléchargement ou d'autre Skill ; le Skill ne doit pas écrireproject.jsonen premier.- Le service doit être confirmé par le script :
healthy=true,runtimeMode=launchd(macOS) ouruntimeMode=windows-task(Windows), version compatible, URL en 5190 canonique avant de continuer ; en cas d'échec, transmettez l'erreur structurée et arrêtez-vous, interdiction de revenir en foreground, de changer de port ou de tuer un processus inconnu. - Les deux readbacks doivent pointer vers le même
projectId, sauvegarder le workflow stage et les trois révisions (Project / Cuts / EditList) ; en cas d'absence ou d'incohérence, arrêtez-vous.
2. Correction : corriger les caractères, produire le tableau de corrections
Que faire : avant tout jugement de coupe, utilisez le dictionnaire pour corriger les caractères mal transcrits — si les caractères sont faux, les jugements suivants seront erronés ; un caractère mal entendu n'est pas un mot superflu, la coupe ne le corrigera pas.
node "<racine-du-plugin>/scripts/videocut-cli.cjs" transcript dictionary "<répertoire-projet>" --dictionary "<racine-du-plugin>/references/ai-term-dictionary.md" --json
Avec votre outil de fichiers, vérifiez si $HOME/.chengfeng-videocut/dictionary.md existe ; si oui, exécutez à nouveau (solution transitoire : le CLI n'accepte qu'un seul fichier à la fois, exécutez en deux passes ; elle peut compléter mais pas annuler la passe précédente — fusion complète priorité utilisateur attend un CLI multilingue) :
node "<racine-du-plugin>/scripts/videocut-cli.cjs" transcript dictionary "<répertoire-projet>" --dictionary "$HOME/.chengfeng-videocut/dictionary.md" --json
Artefact : tableau de corrections — fusionnez les listes applied des deux appels en un petit tableau (mot original → correction → contexte), rapportez-le à l'utilisateur. Après correction, lisez impérativement ce tableau — le dictionnaire peut aussi faire des erreurs sans contexte ; si une erreur est constatée, corrigez le dictionnaire, ne faites pas de rustine ailleurs.
Uniquement lorsque le dictionnaire ne peut pas résoudre le problème et que l'auteur dispose d'un script manuscrit, ajoutez une passe d'alignement contextuel :
node "<racine-du-plugin>/scripts/videocut-cli.cjs" transcript align "<répertoire-projet>" --script "<fichier-script-doublage>" --json # rapport uniquement, pas de modification
node "<racine-du-plugin>/scripts/videocut-cli.cjs" transcript correct "<répertoire-projet>" --file "<fichier-correction>" --json
Règles :
- Ne modifiez que le texte, pas le temps, le nombre de mots, ni le wordId — le produit compare mot à mot les horodatages, une modification est refusée directement.
- Changez uniquement la graphie, pas le sens — les vrais lapsus suivis d'une reformulation sont des phrases interrompues, gérés par la coupe.
- Si le dictionnaire n'a pas le mot et que le script ne le confirme pas, ne devinez pas : signalez-le pour que quelqu'un complète le dictionnaire. Inventer un nom est pire que laisser un nom mal entendu.
- Conservez l'oral chinois tel quel : « chā », « dà mó xíng » est ce qu'il a dit.
- Le dictionnaire est une barrière à franchir à chaque transcription (la même piste audio transcrite deux fois donne des résultats différents, voir le registre des leçons).
Segmentation du script par ponctuation : chaque mot dans la transcription porte sa ponctuation, un segment par virgule dans le script, une ligne par phrase ; les sous-titres utilisent la même ponctuation, les coupures sont cohérentes. Les projets antérieurs au 28 juillet 2026 n'ont pas de ponctuation ; exécutez node "<racine-du-plugin>/scripts/videocut-cli.cjs" transcript regroup "<répertoire-projet>" --json pour recouper les segments (vérification mot à mot de l'identifiant/temps/texte, sûr pour un projet déjà coupé) ; pour avoir la ponctuation, il faut retranscrire — la ponctuation n'existe tout simplement pas dans l'ancienne transcription.
3. Détection : cinq passes, chaque passe ne cherche qu'une catégorie
Que faire : lisez les matériaux, puis relisez intégralement l'ordre de lecture cinq fois, chaque passe avec un seul critère. Avec un seul critère à la fois, la qualité du jugement est bien supérieure à six critères à la fois ; chaque passe produit peu de données et est vérifiable.
Commencez par lire les matériaux :
node "<racine-du-plugin>/scripts/videocut-cli.cjs" transcript playback "<répertoire-projet>" --json
Puis, avec votre outil de lecture de fichiers, lisez $HOME/.chengfeng-videocut/cut-preferences.md (préférences utilisateur ; ce qu'il a dit compte ; si le fichier n'existe pas, c'est un nouvel utilisateur, passez).
Critères dans Règles de suppression sémantique (principes + cas). Hiérarchie du matériel pédagogique : préférences utilisateur > cas utilisateur > cas génériques.
Passe 1 Répétitions Répétitions entre phrases, à l'intérieur d'une phrase (le plus objectif : deux fois identiques)
Passe 2 Phrases interrompues et reformulations S'arrêter à moitié, reformuler différemment
Passe 3 Lapsus suivis d'une correction Nombres, noms propres, mots dits de travers, suivis d'une correction correcte
Passe 4 Bégaiements en anglais Répétition de début de mot / lettre / syllabe
Passe 5 Tics de langage et interjections Le plus subjectif, selon la densité et la tolérance des préférences utilisateur
Action fixe par passe : consulter les cas par type → trouver une occurrence → noter une ligne (wordIds + type + risque) → ne pas juger d'autres types. Lors des passes suivantes, si un mot déjà marqué est rencontré, passez ; les conflits sont résolus lors de la synthèse.
Règles :
- Utilisez uniquement l'ordre de lecture
transcript playbackpour le jugement, ne recréez pas depuistranscript.json— « dit deux fois » se vérifie par contiguïté à l'écoute ; recréer soi-même peut interpréter des numéros sautés comme un contenu manquant et les rejeter à tort (voir registre des leçons). - La suppression n'a que deux états : « supprimé / non supprimé » ; la cause IA ne forme pas un troisième état « suggestion de suppression ».
- Les lapsus, répétitions, phrases interrompues suppriment par défaut la première occurrence, gardent la seconde ; les phrases longues, complètes, les bifurcations entières doivent être vérifiées avec un risque élevé.
- Les pauses normales ne sont pas calculées par le Skill : la fusion des silences adjacents et
natural-pause-v2sont exécutés de manière déterministe par le produit.
4. Synthèse : deux tableaux, n'agissez qu'après leur création
Que faire : fusionnez les lignes des cinq passes en deux tableaux — c'est l'artefact de cette étape, et ce que l'utilisateur verra.
Tableau récapitulatif des coupes (décision de coupe par ligne) :
| # | Temps | Type | Suppression | Ce qui est lu | Risque | Référence |
|---|--------|--------|----------------------|---------------------------|--------|-----------|
| 1 | 00:12 | Répét. | cette fonction donc | cette fonction, en fait | Faible | Cas R2 |
| 2 | 02:31 | Reform. | par exemple je lui ai fait suivre | Par exemple j'ai fait suivre à grok | Élevé | Cas R5 |
Tableau des phrases répétées (phrases dites plusieurs fois ; le tableau mot à mot ne montre pas "combien de fois a été dit, quelle version gardée", c'est pourtant ce que l'utilisateur veut le plus vérifier) :
| Début de phrase | Combien de fois | Quelle version gardée | Quelles versions supprimées | Risque |
|-----------------------|-----------------|----------------------|-----------------------------|------------------------|
| Parce qu'aujourd'hui… | 3 | 3ème 00:08 | 1ère & 2ème | Faible — trois quasi identiques |
| La plupart des agents… | 2 | 2ème 04:40 | 1ère | Élevé — formulations divergentes, à écouter |
Puis relecture : lisez à voix haute le texte complet après suppression, dans l'ordre de lecture du tableau ; toute ligne qui ne se lit pas correctement est annulée. C'est la définition de la vérification : l'IA se relit elle-même, ne demande pas à l'utilisateur ; en cas d'incertitude = ne pas lister (deux états).
5. Révision : n'ouvrir Studio qu'à la révision manuelle
Que faire : soumettez l'intégralité des candidats, présentez les deux tableaux à l'utilisateur, puis ouvrez la page de révision du produit pour que l'utilisateur vérifie personnellement.
node "<racine-du-plugin>/scripts/videocut-cli.cjs" cuts get "<répertoire-projet>" --json # Récupérer la révision actuelle des Cuts
node "<racine-du-plugin>/scripts/videocut-cli.cjs" cuts set "<répertoire-projet>" --file "<fichier-proposition>" --expected-revision "<révision actuelle des Cuts>" --json
Le candidat ne référence que des wordIds stables :
{
"schemaVersion": 1,
"cutWordIds": ["word-12", "word-13"],
"reasons": [
{ "wordIds": ["word-12", "word-13"], "kind": "repeat", "risk": "low" }
]
}
Règles de soumission :
- Le candidat est la conclusion complète de ce cycle de jugement, pas un incrémental —
cuts setsémantique de remplacement ; soumettre un incrémental entraînerait la perte silencieuse des coupes sémantiques du cycle précédent (voir registre des leçons) ; lors de la soumission du candidat, interdisez de lire ou de fusionner manuellementinitialization.baselineCutWordIds(le produit intègre automatiquement la ligne de base des pauses). reasonsest persisté, écrivez fidèlement ; le produit supprimera les parties mentionnant des mots non supprimés.- N'écrivez pas directement
cut-selection.json,project.jsonou les logs d'événements. cuts get.data.revisionest la révision des Cuts,workflow get.data.revisionest celle du projet, interdiction de les mélanger.- Après une soumission réussie, consultez impérativement
noLongerCut(nombre de mots cette fois non supprimés) : si non nul et pas un retrait intentionnel = soumission incrémentale, retournez soumettre l'ensemble complet ; lisez-le même si la valeur est"unknown". - Immédiatement après, relancez
workflow get+cuts getpour confirmercut_review_readyet les trois révisions ; en cas d'incohérence, arrêtez-vous, n'écrivez jamais directement du JSON et ne faites pas de remplacement automatique. - Conservez le
<fichier-proposition>dans le répertoire de tâche — l'étape 6 de bilan en aura besoin (les reasons seront tronquées par le produit après édition utilisateur, une reconstitution depuis le registre n'est pas fiable).
Ensuite, présentez d'abord les tableaux, puis ouvrez la page : envoyez les deux tableaux à l'utilisateur, puis dites-lui d'aller vérifier avec les tableaux dans Studio.
node "<racine-du-plugin>/scripts/ensure-running.cjs" --json # Assurer idempotence avant d'ouvrir
node "<racine-du-plugin>/scripts/videocut-cli.cjs" open "<répertoire-projet>" --json # Récupérer l'URL du projet retournée par le produit
node "<racine-du-plugin>/scripts/ensure-studio.cjs" --url "<URL-du-projet-produit>" --view koubo --json # Contrôle d'accès : vérifier que 5190 a enregistré la vue koubo
Règles :
- Ouvrez l'URL
studio.urldans le navigateur intégré de Codex uniquement si le contrôle d'accès retourneok=true, puis arrêtez la progression automatique et attendez que l'utilisateur sélectionne, restaure, enregistre. - Avant d'ouvrir, comparez strictement le
#project/<projectId>duproductUrlavec leprojectIddu readback, et liezstage=cut_review_readyavec les trois révisions —ok=truedu contrôle d'accès prouve la capacité du produit, ne remplace pas la liaison au niveau projet ; en cas d'incohérence, relisez l'état. studio_capability_missing: arrêtez-vous et expliquez l'incompatibilité de version, vous pouvez suggérer$chengfeng-report-bug; interdiction d'utiliser la présence de?view=koubodans l'URL pour considérer la nouvelle interface comme existante, interdiction de revenir à l'ancien panneau de tâche.- Ne faites pas de « ouvrir le poste de travail » une première étape de la tâche ; n'accédez pas à l'ancien
review.html, 8898/8899 ; ne contrôlez pas le DOM de Studio, ne modifiez pas directement les éléments média ; ne créez pas de piste audio indépendante ni de piste de sous-titres factices.
6. Bilan et passation : ne jetez pas les devoirs corrigés par l'utilisateur
Après la fin de la vérification par l'utilisateur, relisez d'abord :
node "<racine-du-plugin>/scripts/videocut-cli.cjs" workflow get "<répertoire-projet>" --json
node "<racine-du-plugin>/scripts/videocut-cli.cjs" cuts get "<répertoire-projet>" --json
Bilan (solution transitoire, remplacée quand la commande cuts diff du produit sera disponible) : comparez le <fichier-proposition> conservé à l'étape 5 avec les cutWordIds de la version finale relue :
- Ce que l'utilisateur a restauré (présent dans la proposition, absent de la version finale) = l'IA a mal supprimé. Comparez avec le reason que vous avez écrit dans la proposition : quel type d'erreur ?
- Ce que l'utilisateur a ajouté en suppression (présent dans la version finale, absent de la proposition, et pas dans
initialization.baselineCutWordIdsde la ligne de base des pauses) = l'IA a oublié. Demandez : quel type, pourquoi n'a-t-il pas été identifié ? (La ligne de base n'est utilisée ici que pour exclure les mots de pause, il reste interdit de la fusionner dans la soumission.)
Archivage dans trois tiroirs :
- Différence de goût → ajoutez à
~/.chengfeng-videocut/cut-preferences.md(markdown maintenu par l'Agent, n'ajoutez et ne réécrivez que vos propres sections ; créez le fichier s'il n'existe pas). - Erreur de nom propre → ajoutez à
~/.chengfeng-videocut/dictionary.md(tableau à deux colonnes, dédoublonnez avant d'ajouter). - Lacune dans les règles → notez dans la section « cas à mettre à jour » du fichier de préférences ; à la troisième occurrence du même type, signalez à l'utilisateur et suggérez de promouvoir en cas générique (ne modifiez le dépôt skills qu'après validation humaine).
- Même sans différence : notez dans le fichier de préférences, ligne de projet « adopté intégralement ».
Rapport des quatre points : nombre de mots supprimés, temps gagné en secondes ; stage actuel (devrait être cut_review_ready) ; trois révisions (projet / Cuts / EDL) ; résumé du bilan (N propositions, X adoptées, Y restaurées, Z ajoutées, une phrase sur le principal désaccord). Ensuite, dites à l'utilisateur de lancer l'export.
Ne pas afficher de carte de confirmation, ne pas exécuter de coupe — la carte de confirmation de la coupe physique appartient au Skill d'export ; cette carte doit figer la révision au moment où l'utilisateur appuie sur confirmer.
return_cut_review : réexécutez d'abord node "<racine-du-plugin>/scripts/ensure-running.cjs" --json, puis retournez dans le même Studio pour continuer la vérification ; ne déclenchez pas de bilan, le bilan n'est fait qu'une seule fois à la passation finale.
Niveaux de rapport : la révision structurée Product est API/readback PASS ; la véritable vérification d'image du navigateur est visual frame PASS ; si personne n'a réellement écouté l'audio, mentionnez systématiquement human listening UNVERIFIED, n'utilisez pas la lecture, le DOM, une capture d'écran ou une détection de média pour la remplacer.
Reprise et échec
revision_conflict: relisez l'état, expliquez la modification récente de l'utilisateur, ne remplacez pas automatiquement.runtime_unhealthy: ne réinstallez pas en boucle.service_identity_mismatch/service_port_conflict: arrêtez-vous, ne revenez pas en foreground, ne changez pas de port, ne tuez pas de processus inconnu.- Si la page est fermée mais que le service est toujours en cours : relisez le workflow et poursuivez depuis l'état actuel, ne créez pas de nouveau projet.
- En cas d'échec, ne dites jamais « le registre est écrit » comme « le montage est fini » — jusqu'à ce point, aucun fichier média n'a été produit.
Annexe : cette compétence accepte une vidéo réelle locale et une transcription cloud mot à mot directement dans le produit, c'est l'exigence du contrat preflight ; leur existence réelle est la condition préalable à tout jugement.