Communitygithub.com

amrodwaire/phone-reel-edit

Playbook de montage pour transformer des vidéos de téléphone en Reels, Shorts ou TikToks verticaux avec texte arabe à l'écran.

Qu'est-ce que phone-reel-edit ?

Cette compétence est un playbook de montage vidéo complet conçu pour transformer des séquences brutes de téléphone en vidéos verticales optimisées pour les plateformes sociales (Reels, Shorts, TikToks) avec un texte arabe à l'écran. Elle couvre l'ensemble du pipeline : inspection des sources, coupe et stabilisation avec ffmpeg, correction colorimétrique par mesures numériques (LUT ffmpeg ou DaVinci Resolve gratuit), ajout de texte arabe avec Remotion incluant une vérification automatique des chevauchements, de la zone de sécurité et du contraste, synchronisation musicale, mastering du volume adapté aux haut-parleurs de téléphone, et contrôles qualité avant publication. Basée sur un véritable échec de montage, elle intègre des règles éprouvées et des scripts Python automatisés (grade.py, measure_grade.py, check_text.py, beat_offset.py, master.sh) pour garantir un résultat cohérent et professionnel. Utile pour tout projet de montage vertical, que ce soit une nouvelle coupe ou une révision, cette compétence fournit une approche systématique et reproductible. La compétence supporte plusieurs plateformes et workflows : correction globale avec grade.py pour des ajustements rapides et reproductibles, ou correction localisée avec DaVinci Resolve pour des retouches plus fines (Power Windows). Le texte arabe est géré avec une police lourde, une taille adaptée aux écrans de téléphone (62-124 px), un espacement des lignes de 1,5, et une vérification automatique du contraste et des zones de sécurité. Le mastering audio vise -14 LUFS avec une attention particulière aux fréquences basses (300 Hz et moins) qui sont perdues sur les haut-parleurs de téléphone, avec un script qui détecte les pics excessifs. Enfin, des contrôles rigoureux (vérification des métadonnées ffprobe, inspection visuelle des images, validation du texte) et des instructions pour la publication (approbation client, re-téléchargement si un fichier est remplacé) assurent une sortie professionnelle.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/amrodwaire/phone-reel-edit/tree/HEAD

Demander à votre IA préférée

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

Documentation

Montage de reel pour téléphone

La plupart des règles ici proviennent d'un vrai reel qui a échoué à cette étape en premier. references/research.md contient les raisons et les sources. references/resolve-ui.md mappe les contrôles de DaVinci Resolve pour le piloter avec l'utilisation de l'ordinateur.

Certains cas n'ont pas encore été testés sur un reel publié : sources HDR, ralenti à 30 ips, discours face caméra, zones de sécurité TikTok et Shorts, et couvertures. Leurs commandes n'ont été exécutées que sur des clips de test. references/other-cases.md les contient et explique comment chacun a été vérifié. Prévenez l'utilisateur lorsqu'une édition repose sur l'un d'eux.

Pipeline : source téléphone, coupe et stabilisation ffmpeg, couleur (DaVinci Resolve, ou scripts/grade.py pour les mouvements globaux), texte Remotion, son et mastering ffmpeg.

Avant la coupe

  1. Lisez les règles de la marque pour le client, s'il y en a : mots interdits, ligne de contact, étiquetage IA, et ce qui nécessite une approbation avant publication.
  2. Vérifiez chaque clip source : python -I scripts/probe_source.py clip.mp4. Il indique la rotation, la fréquence d'images et sa variabilité, SDR ou HDR, les étiquettes de couleur et l'audio, puis liste ce dont le clip a besoin avant le montage. Les clips typiques de téléphone sont SDR bt709 à environ 30 ou 60 ips. Les sources HDR, à fréquence d'images variable et à 30 ips nécessitent chacune une étape supplémentaire, dans references/other-cases.md. Si une personne parle en arrière-plan, le son original reste muet. Si la personne à l'écran parle au spectateur, consultez la section dédiée du même fichier.
  3. Si vous utilisez un deuxième modèle d'IA comme relecteur, discutez de l'idée avec lui avant de décider, puis vérifiez ce qu'il dit. references/research.md liste les types d'erreurs qu'un modèle relecteur a commises.

Rythme

  • Une idée par reel. Le texte détermine la durée, pas un nombre cible. Un reel de test a nécessité 18,6 s parce que le client n'a pas pu finir de lire à 10,5 s ou 13,5 s.
  • Prévoyez 10 caractères arabes par seconde, comptés à partir de l'apparition d'une ligne. C'est lent intentionnellement : le spectateur regarde aussi l'image sur un téléphone.
  • Deux apparitions par plan si possible, et au moins 1,5 s entre elles. Les lignes qui apparaissent ensemble comptent comme une seule apparition.
  • L'avis d'un locuteur natif sur le rythme prime sur celui de tout modèle.
  • L'image la plus forte et le texte d'accroche sont à l'écran à l'image 0, sans fondu depuis le noir.
  • Évitez une accélération soudaine de 3x. Accélérez doucement pour passer un mauvais moment plutôt.

Le 60 ips joué à 0,5x donne des images réelles à 30 ips, donc aucune interpolation n'est nécessaire. Une source à 30 ips n'a pas d'images de réserve, donc lisez la section sur le ralenti de references/other-cases.md avant de ralentir une. Stabilisez vers un intermédiaire 60 ips, puis retemporalisez :

ffmpeg -ss S -t D -i raw.mp4 -vf "vidstabdetect=shakiness=6:accuracy=15:result=x.trf" -f null -
ffmpeg -ss S -t D -i raw.mp4 -vf "vidstabtransform=input=x.trf:smoothing=14:zoom=2:optzoom=0:interpol=bicubic,crop=W:H:X:Y,scale=1080:1920:flags=lanczos,fps=60" -an -c:v libx264 -preset veryfast -crf 10 -pix_fmt yuv420p im.mp4
python -I scripts/retime.py im.mp4 c1.mp4 --start 0.4 --frames 99 --keys 0:.5

Exécutez les chemins scripts/ depuis le dossier de cette compétence. ffmpeg a besoin des filtres vidstab. Chaque clip doit commencer au temps zéro, car un début non nul apparaît comme des images noires en tête dans Resolve. Ajoutez setpts=PTS-STARTPTS lorsque vous utilisez -ss avec un filtre temporel, et vérifiez start_time avec ffprobe.

Une main qui dérive dans les dernières images d'un plan fixe peut être cachée en maintenant une image antérieure : trim=end_frame=N,setpts=PTS-STARTPTS,tpad=stop_mode=clone:stop_duration=0.6.

Couleur

La couleur ici signifie correction : blancs neutres, peau naturelle, couleurs produit fidèles, raccord entre les plans. Un look créatif vient en dernier et reste subtil, et les couleurs produit doivent toujours être mesurées comme vraies après.

Choisissez la voie en fonction de ce dont le plan a besoin :

  • Mouvements globaux uniquement (teinte, exposition, contraste, saturation) : scripts/grade.py. C'est plus rapide et reproductible, et les chiffres restent dans une commande que vous pouvez réexécuter.
  • Une partie du cadre a besoin de sa propre correction (peau sous une lumière différente, un objet) : DaVinci Resolve, pour ses Power Windows.

Les deux voies utilisent la même boucle de mesure, ajustement, mesure et les mêmes cibles ci-dessous.

Avec grade.py

python -I scripts/grade.py still c1.mp4 1.5 before.png
python -I scripts/measure_grade.py before.png --patch counter:40,60,200,220 --skin 100,1450,1000,1920
python -I scripts/grade.py make c1.cube --frame before.png --neutral 40,60,200,220 --white 205 --contrast 1.06 --pivot 0.4 --lift -0.02
python -I scripts/grade.py still c1.mp4 1.5 check.png --lut c1.cube --compare
python -I scripts/grade.py apply c1.mp4 c1g.mp4 --lut c1.cube

--neutral est une zone qui devrait être grise ou blanche : un comptoir, un mur, du papier, un couvercle blanc. make égalise ses R, V et B, et --white définit le niveau auquel elle aboutit. Choisissez une zone uniformément éclairée et non soufflée. Regardez l'image --compare en taille réelle, et mesurez la moitié corrigée, avant d'appliquer. Une LUT par plan, car chaque plan a sa propre dominante.

Ajoutez --knee 0.85 lorsqu'un gain pousse les hautes lumières au-delà de 250. Utilisez --denoise light uniquement sur les clips visibles et bruyants en faible lumière, et --sharpen rarement : les téléphones affinent déjà, et plus de netteté donne des auréoles sur les bords et le texte.

Une correction faite dans Resolve peut en sortir une LUT : clic droit sur la vignette du clip dans la page Couleur, Générer LUT, Cube 33 points. grade.py apply --lut l'applique ensuite à n'importe quel clip. Une LUT ne contient que des mouvements globaux, donc les fenêtres n'y sont pas.

Dans DaVinci Resolve gratuit

Copiez les clips dans un dossier simple que Resolve peut voir (il ne peut pas ouvrir certains dossiers de données d'applications et dit "Le chemin n'existe pas"). Placez-les sur une nouvelle timeline et ouvrez le scope Parade.

Travaillez dans cet ordre, car chaque étape dépend de la précédente :

  1. Nœud Balance. Gain pour le niveau de blanc, Temp pour la dominante. Temp positif réchauffe. La même surface dans deux plans doit correspondre.
  2. Nœud Contraste. Contraste et Pivot, Lift pour les noirs profonds, un petit mouvement Sat de 5 ou moins.
  3. Nœud Sujet, seulement lorsqu'un mouvement global nuirait à autre chose. Utilisez une Power Window douce. Sur le reel de test, une fenêtre a corrigé la peau d'une main sans toucher aux couleurs du produit.
  4. Rendu, mesure, ajustement, et répétez. Deux passages ont suffi.
python -I scripts/measure_grade.py frame.png --patch counter:40,60,200,220 --skin 100,1450,1000,1920

Cibles

  • Surfaces neutres : R, V et B à environ 3 à 5 près. Blanc entre 195 et 215 pour un aspect lumineux.
  • Teinte de la peau près de 123 degrés. Restez naturel, car la ligne du vectorscope est une référence, pas une cible.
  • Luminosité de la peau : les guides la situent entre 40 % et 70 % selon la peau et la scène. Utilisez cette plage pour détecter une erreur, pas comme un chiffre à atteindre.
  • Hautes lumières : moins d'environ 2 % des pixels à 250+.
  • Saturation : comparez la ligne chroma avant et après. Une correction devrait laisser p95 proche de là où elle était. Un grand saut signifie que la correction ajoute de la couleur que la scène n'avait pas.
  • Les couleurs produit restent fidèles lorsque la vidéo vend un produit.
  • Deux plans de la même surface donnent les mêmes mesures.

Ce qui déplace quoi :

  • Teinte a à peine bougé une paume rouge. Gamma par canal l'a corrigée : V augmenté, R et B diminués un peu.
  • Temp +300 a dépassé une dominante bleue alors que +130 était juste. Commencez petit.

Texte arabe dans Remotion

assets/reelTemplate.tsx est un modèle fonctionnel. Il conserve chaque bloc de texte comme donnée et dispose d'une composition sonde pour la vérification du texte. references/remotion-setup.md couvre le démarrage d'un projet à partir de rien et l'enregistrement des compositions.

Règles :

  • Une police arabe grasse (le modèle utilise Alexandria 800), blanc plus une couleur d'accent, pas de boîtes, une ombre douce.
  • Tailles de 62 à 124 px sur une trame 1080x1920. Un téléphone a besoin de cette taille.
  • Hauteur de ligne 1,5 pour l'arabe. À 1,22, les queues de lettres touchent la ligne suivante.
  • Chaque lettre à l'intérieur de x 110-950 et y 220-1475, afin que le rail droit et la barre inférieure d'Instagram ne couvrent rien.
  • whiteSpace: nowrap pour qu'une ligne ne soit jamais coupée par surprise.
  • Accroche à l'image 0. Les lignes suivantes à environ 1 s d'intervalle, avec une montée et une disparition de 6 images.
  • Une bande sombre et douce derrière le texte maintient le sujet visible en dessous.
  • Les citations des clients restent mot pour mot, sans nom ni photo sauf si le client a accepté.
  • Dites ce que le spectateur voit. Ne laissez pas une étiquette sous-entendre que c'est la seule option.

Après tout changement de texte, rendez les images de la sonde et vérifiez-les :

npx remotion still ReelProbe out/p0.png --frame=0
python -I scripts/check_text.py out/p0.png out/p1.png out/p2.png out/p3.png

Il échoue lorsque l'encre de deux lignes est à moins de 14 px ou qu'une lettre quitte la zone de sécurité. Un bloc contient au maximum sept lignes.

Ensuite, vérifiez le texte par rapport à l'image réelle. Rendez la dernière image de chaque plan, lorsque toutes les lignes sont à l'écran, et passez ces images dans le même ordre :

npx remotion still Reel out/r0.png --frame=119
python -I scripts/check_text.py out/p0.png out/p1.png --real out/r0.png out/r1.png

Chaque ligne obtient une valeur de contraste par rapport à la partie la plus lumineuse de l'image autour de ses lettres, et en dessous de 3,0 échoue. Sur le reel de test, les lignes de couleur d'accent ont obtenu 3,2 à 4,6 et les lignes blanches 5 et plus. Un score bas signifie une bande plus forte derrière le texte, ou un déplacement du bloc.

La boîte par défaut est celle d'Instagram. Pour un reel qui va aussi sur TikTok ou Shorts, ajoutez --platform all. Ces deux boîtes proviennent de guides tiers, donc prévisualisez le téléchargement dans chaque application.

Ensuite, regardez les images en taille réelle à la fin de chaque plan. Une feuille de vignettes cache les collisions, et les choses qui bougent derrière le texte n'apparaissent qu'en taille réelle. Sur le reel de test, une cuillère a traversé une ligne. Un petit zoom avec une origine de coin l'a déplacée et a également recadré un doigt errant.

Rendu et son

npx remotion render Reel out/reel.mp4 --codec=h264 --crf=15 --muted --color-space=bt709
python -I scripts/beat_offset.py music.ogg --cuts 3.3,6.5,10.3 --length 13.5 --from 0 --to 40

--color-space=bt709 est important. Sans lui, Remotion écrit du bt470bg pleine plage avec des primaires inconnues.

Coupez la musique au meilleur décalage, fondez la dernière 1,2 s, assemblez avec -c:v copy, puis masterisez :

sh scripts/master.sh in.mov out.mp4 -14 0.4 0.75

Le dernier nombre est le plafond du limiteur. AAC ajoute un dépassement au-dessus, et la quantité dépend de la piste, donc le script mesure le fichier qu'il a écrit et imprime sa sonie et son pic réel. S'il imprime TOO HOT (pic réel au-dessus de -1 dBTP), exécutez-le à nouveau avec 0,7.

Les haut-parleurs de téléphone perdent la plupart du son en dessous de 300 Hz, donc vérifiez cette bande :

ffmpeg -hide_banner -nostats -i out.mp4 -vn -af "highpass=f=300:poles=2,highpass=f=300:poles=2,lowpass=f=12000,ebur128" -f null - 2>&1 | tail -12

Visez -20 LUFS ou plus dans cette bande sur un master à -14 LUFS. Une piste riche en basses mesurait -23,9 et sonnait terne sur les téléphones. Dessinez aussi la forme d'onde et le spectre, car les horodatages d'un modèle relecteur ne correspondent pas toujours.

La musique ou la voix générée par IA a besoin de l'étiquette IA de la plateforme. Générez une musique légèrement plus longue que le reel, car une piste coupée trop court ne peut pas être étendue proprement.

Vérifications avant de déclarer terminé

  • ffprobe montre yuv420p, tv, bt709, bt709, bt709, et la bonne durée et le bon nombre d'images.
  • check_text.py imite PASS, avec les images --real incluses.
  • master.sh a imprimé un pic réel à -1 dBTP ou moins.
  • Une image de couverture existe si le reel apparaît sur une grille de profil (references/other-cases.md).
  • Regardez les images en taille réelle vous-même, y compris la première et la dernière image et l'image avant chaque coupe.
  • Si un modèle relecteur regarde le mp4 final, donnez-lui les décisions déjà prises pour qu'il ne les rouvre pas.
  • Indiquez ce qui n'a pas été vérifié. Un agent ne peut pas entendre l'audio ni voir le fichier sur un téléphone.
  • Après avoir remplacé un fichier déjà téléchargé quelque part, re-téléchargez-le, vérifiez-le à partir du lien public, et mettez à jour tout ce qui était programmé et pointant vers l'ancien fichier.

La publication nécessite l'approbation du client.

Skills associés