Montage vidéo entièrement automatisé pour tutoriels (sans剪映)
Problème résolu
Après avoir enregistré une vidéo de tutoriel, l'utilisateur peut automatiser toute la chaîne : « transcription → correction → suppression des silences → élimination des bégaiements/répétitions → correction des erreurs → rendu final ». Pas besoin d'ouvrir剪映, le résultat est une vidéo prête à publier (sous-titres incrustés + bandeau correctif jaune en haut). Modifiez n'importe quel paramètre (taille de police, sections supprimées, texte) et relancez le script ; le coût d'itération est d'une minute.
Limite avec jianying-subtitle-fixer : celui-ci modifie le brouillon剪映 (l'utilisateur doit exporter manuellement) ; ici, ffmpeg produit directement le fichier final. Si l'utilisateur ne mentionne pas剪映, utilisez ce skill.
Dépendances environnementales (déjà prêtes)
- Python :
C:\Users\44162\AppData\Local\Programs\Python\Python312\python.exe(faster-whisper 1.2.1 + torch installés ; cache du modèle dans ~/.cache/huggingface, modèle small) - ffmpeg :
D:\logiciel\ffmpeg\bin\ffmpeg.exe(détection automatique par le script)
Flux de travail standard (à suivre par l'IA)
Step 0 ffprobe pour obtenir la durée/résolution de la vidéo (pour adapter la taille de police ultérieurement)
Step 1 Transcription : transcribe.py -> raw.json (timestamps phrase + mot)
Step 2 Analyse IA (valeur ajoutée principale de ce skill, voir ci-dessous) -> écrit cut_plan.json
Step 3 Éléments de suppression de contenu -> AskUserQuestion pour validation utilisateur (une seule fois, pas en mode pomme)
Step 4 Rendu : render.py --plan cut_plan.json -> vidéo finale
Step 5 Vérification qualité par extraction d'images (une image par instant de correction, Read + contrôle visuel pour s'assurer que le texte est complet et ne dépasse pas)
Step 6 Livraison : rapport de ce qui a été coupé, corrigé, et emplacement du fichier
Étape 1 Commande de transcription
& "C:\Users\44162\AppData\Local\Programs\Python\Python312\python.exe" "<skill>/scripts/transcribe.py" --video "<chemin vidéo>" --outdir "<répertoire de travail>" --prompt "Tutoriel technique chinois sur XXX, YYY et autres sujets"
--prompt utilise le sujet de la vidéo + les termes fréquents (extraits du glossaire ~/.claude/skills/jianying-subtitle-fixer/config/terms.json),
ce qui améliore significativement la précision des termes propres. Répertoire de travail recommandé : D:\Système de production de contenu\Montage\workspace\<date-job>\.
Étape 2 Analyse IA (étape non remplaçable par l'humain, méthodologie dans references/cut-heuristics.md)
Après avoir lu l'intégralité du raw.json, produisez quatre éléments :
- Correction des sous-titres fixed : corrigez une par une les erreurs d'homophonie / de termes mal reconnus. Conservez la forme orale originale, ne corrigez que les erreurs, ne reformulez pas (les sous-titres sont liés à la voix ; une réécriture provoquerait un décalage audio/vidéo). Les schémas d'erreurs de whisper sont décrits dans references.
- Suppression de contenu content_cuts : sections entières à supprimer (timestamp + raison), types et critères dans references. Les répétitions au niveau des mots (ex : "j'ai publié un... j'ai publié un") doivent être localisées précisément avec les timestamps des mots.
- deleted_ids : les IDs des sous-titres couverts par content_cuts (ces sous-titres ne seront pas inclus).
- Corrections corrections : paragraphes contenant des erreurs factuelles, bandeau jaune en haut de l'image. Écrivez dans cut_plan.json.
Étape 3 Validation utilisateur (principe)
- Éléments clairement à supprimer (bégaiement, redite, phrase abandonnée) : intégrez-les directement au plan, mentionnez-les dans le rapport
- Paragraphes avec erreurs de contenu : demandez à l'utilisateur « Supprimer / Conserver + bandeau correctif », pour les opinions privilégiez conserver + correction
- Texte du bandeau correctif, conclusions de vérification factuelle (si nécessite une vérification en ligne, faites d'abord une WebSearch) à soumettre à l'utilisateur
- Utilisez AskUserQuestion pour poser toutes les décisions en une seule fois
Étape 4 Commande de rendu
& "C:\Users\44162\AppData\Local\Programs\Python\Python312\python.exe" "<skill>/scripts/render.py" --plan "<répertoire de travail>/cut_plan.json"
Format cut_plan.json (l'en-tête de render.py contient une documentation complète) :
{
"video": "C:/vidéo originale.mp4",
"out": "C:/vidéo finale.mp4",
"raw": "raw.json",
"content_cuts": [[213.45, 230.98, "Expérience mal formulée"]],
"deleted_ids": [48, 49, 50],
"fixed": {"1": "Texte après correction"},
"corrections": [[12.95, 20.14, "Correction : le nom correct est XX"]],
"silence": {"min_dur": 1.0, "keep": 0.25},
"style": {"sub_size": 64, "cor_size": 48}
}
Tous les timestamps utilisent la temporalité de la vidéo originale (le script remappe automatiquement sur la temporalité après montage). silence/style sont facultatifs. Le style des sous-titres par défaut est adapté aux grands écrans mobiles (base 2560 de largeur 64/48, mise à l'échelle automatique selon la résolution). Si l'utilisateur dit « police trop petite », ajustez les valeurs style et relancez.
Étape 5 Vérification qualité par extraction d'images
Lisez les timestamps réels des corrections dans final.ass (lignes Cor), extrayez des images selon la nouvelle temporalité :
& "D:\logiciel\ffmpeg\bin\ffmpeg.exe" -y -i "<vidéo finale>" -vf "select='eq(n\,<numéro d'image>)',scale=1100:-1" -vsync vfr "<répertoire qc>/qc_%d.jpg"
Numéro d'image = seconde × 20 ips. Lisez chaque image + contrôle visuel : texte complet, pas de débordement, pas de conflit avec les sous-titres du bas.
Pièges documentés (ne pas reproduire)
- Échec silencieux de aselect : sur certains flux AAC, aselect ne coupe aucune image et ne signale pas d'erreur → la suppression audio
doit utiliser
asplit+atrim+concat(render.py l'a déjà intégré, ne pas revenir à aselect) - concat ne peut pas être placé après un select mono-flux comme assembleur (erreur de nombre de pads) ; select+setpts produit déjà une sortie continue
- La vérification de la vidéo finale doit faire ffprobe séparément pour les flux vidéo et audio : la durée du format peut être étirée par le flux le plus long, masquant le fait qu'« aucune coupe n'a été faite » (expérience vécue : rendu « réussi » mais audio entièrement conservé)
- Chemin du filtre subtitles : utilisez un chemin relatif si l'ass est dans le même répertoire de travail que le rendu, pour éviter les problèmes d'échappement des chemins chinois
- La suppression du silence doit utiliser une zone de protection des mots (strip_guard intégré dans render.py) : les timestamps des mots de whisper et ceux de silencedetect peuvent différer ; les mots doux (ex : termes anglais en début de phrase) peuvent tomber dans une « zone de silence », et une coupure directe sur le silence pourrait trancher le mot
- Le script de transcription gère l'encodage GBK de stderr de ffmpeg (problème récurrent sous Windows, ignorez simplement les erreurs de ce thread)
Coût d'itération
Modifier la taille de police / le texte de correction / ajouter ou supprimer des sections de coupe → modifiez les champs correspondants dans cut_plan.json et relancez render.py, une fois prend 1 à 2 minutes. La vidéo finale est écrasée, la vidéo originale n'est jamais modifiée.