Conception sonore : sons réels sur une vidéo finie
L'objectif : le film sonne comme si un monteur disposant d'une bonne bibliothèque l'avait monté. Chaque son est un fichier réel d'EditAtlas, placé sur une image que vous avez regardée, à un niveau que vous pouvez justifier avec des chiffres.
Deux faits restent vrais tout au long du processus, planifiez en fonction :
- Vous ne pouvez pas entendre. Vous choisissez les sons d'après leurs descriptions et leurs mesures chiffrées (
sounds.py info), vérifiez le placement et les niveaux aveccheck.py, et remettez à la personne une courte liste de moments à écouter. Ne dites jamais qu'un son « sonne bien » ; dites ce qui a été mesuré et ce qui nécessite encore une oreille. - Vous ne devez pas inventer. Travaillez uniquement sur la vidéo que la personne vous a donnée. S'il n'y a pas de vidéo, demandez-la. Si un moment nécessite un son que la bibliothèque ne possède pas, laissez-le silencieux et mentionnez-le dans le rapport.
Tous les scripts se trouvent dans scripts/ (Python 3.9+, numpy, Pillow pour les feuilles d'images, FFmpeg avec ffprobe dans le PATH). Exécutez-les avec le chemin du dossier du skill, depuis votre propre dossier de travail (work/, result/) ; n'écrivez jamais dans le projet de la personne ni dans ce dossier de skill.
python SKILL/scripts/moments.py FILM.mp4 --out work/moments # moments.json, sheet.png, overview.png
python SKILL/scripts/moments.py FILM.mp4 --at 10.4 --out work/at # images toutes les 0,1 s autour d'un instant
python SKILL/scripts/sounds.py search "verre tintement" --max-dur 2 # identifiants depuis l'index public
python SKILL/scripts/sounds.py info sfx-ID sfx-ID # téléchargement unique, SHA-256, mesures chiffrées
python SKILL/scripts/sounds.py sheet sfx-ID sfx-ID --out work/c.png # forme d'onde + spectrogramme des candidats
python SKILL/scripts/mix.py work/cues.json --out result/FILM_sfx.mp4 # MP4 + _track.wav + _resolved.json
python SKILL/scripts/check.py result/FILM_sfx_resolved.json --moments work/moments/moments.json --listen-out result/listen.wav
Les sons proviennent de https://raw.githubusercontent.com/EditAtlas/sfx/main/ et sont mis en cache dans ~/.cache/editatlas-sfx (EDITATLAS_SFX_CACHE permet de déplacer le cache). Avec un clone local de EditAtlas/sfx, passez --mirror PATH (avant la sous-commande pour sounds.py) et rien n'est téléchargé.
1. Regarder le film et son son
Exécutez moments.py. Il rapporte le son existant (has_audio, LUFS, la proportion de silence) et trouve trois types de moments à partir des différences de pixels : cut (changement de plan), move (début ou pic de mouvement), land (arrêt du mouvement : quelque chose se pose). Ensuite, ouvrez overview.png et sheet.png avec l'outil Read : les chiffres ne détectent pas les animations douces (un badge qui s'agrandit sur un visage immobile ne crée pas de coupure) et surestiment les vibrations de caméra. Lorsque c'est important, extrayez les images autour d'un instant avec --at T et trouvez l'image exacte où l'élément apparaît, se pose ou tourne.
Décidez ce qu'est le son original du film :
| Ce que vous voyez dans les chiffres et l'image | Feuille de repères |
|---|---|
Pas de son, ou silent_share proche de 1 | "keep_audio": false : les sons portent le film ; il est amené à environ -16 LUFS |
| Musique uniquement | "keep_audio": true : les sons se placent environ 3 LU en dessous ; placez les accents sur le temps quand vous le pouvez |
| Quelqu'un qui parle (sous-titres, visage, micro-cravate) | "keep_audio": true, "under_voice": true : environ 8 LU sous la voix ; moins de sons, plus légers |
| Bips synthétiques déjà intégrés au mixage | demandez : les remplacer nécessite les stems ; superposer des sons réels les double |
Demandez à la personne quand il n'est pas clair de conserver ou non le son du film.
2. Écrire la liste d'événements à partir de ce que vous avez vu
Une ligne par moment qui mérite un son : heure, ce qui se passe, quel type de son. Pensez comme un monteur :
- Un élément qui apparaît (badge, puce, bouton, cartouche de sous-titres) : un petit pop, tic ou ding doux,
anchor: start. - Un élément qui se déplace ou une transition : un whoosh dont le point le plus fort atterrit sur l'arrivée,
anchor: peak. - Un élément qui se pose avec du poids (logo, produit, tampon) : un hit ou un bruit sourd sur l'image où il s'arrête,
anchor: peak. - Un objet réel à l'écran (verre, glace, papier, clés, boisson) : le bruitage correspondant, pas un son d'interface.
- États de succès/erreur : un ding pour oui, un court buzzer ou une alerte pour non. Une famille de sons d'interface par film.
- Quelque chose qui monte en intensité : un riser dont la fin atterrit sur le point d'orgue,
anchor: end.
Tous les mouvements n'ont pas besoin d'un son. Le rythme et le goût avec des chiffres sont décrits dans references/taste.md ; lisez-le avant la première feuille de repères d'une session.
3. Choisir les sons : lire, mesurer, comparer
- Recherchez. Si le MCP EditAtlas est connecté,
search_sfxclasse mieux (il comprend aussi le vietnamien) ; sinon utilisezsounds.py search. Les titres évitent délibérément les mots de leurs fichiers sources ("camera shutter" devient "Lens Aperture Tick"), donc cherchez par ce qu'est le son et essayez les synonymes ainsi que le filtre de catégorie. sounds.py infosur 2 à 4 candidats. Lisez :audible_s(combien de temps il est vraiment entendu ; le fichier peut être plus long),attack_s(0.0x = attaque rapide, 0.3+ = gonflement),peak_t_s,centroid_hz(en dessous de ~1500 sombre, au-dessus de ~6000 brillant),mono_loss_db(en dessous de -6 les canaux s'annulent sur un téléphone ;mix.pyjoue alors le canal le plus fort).sounds.py sheetlorsque deux candidats lisent les mêmes chiffres : une ligne verticale nette est un clic, une traînée est un whoosh, l'énergie en bas est du poids.- Choisissez en fonction de ce qui bouge et de ce qu'il touche, puis par longueur : un pop de puce de 0,3 s ne doit pas être un pop de dessin animé de 1,8 s. Utilisez
max_lenpour couper un fichier long, avec un fondu. - Les moments répétés d'un même type (trois puces) nécessitent différentes prises d'une même famille (Tiny Plop 05, 06, Empty Plop 06), pas le même fichier trois fois.
La bibliothèque est limitée à certains endroits (mesuré le 2026-11-07) : pas de versement ou de pétillement de liquide, pas de bruit de fond de pièce, pas de tampon, peu de gouttes d'eau et de bruits sourds. Choisissez le son honnête le plus proche et mentionnez le manque dans le rapport plutôt que d'en forcer un inapproprié.
4. Écrire la feuille de repères et effectuer le rendu
{
"video": "work/film.mp4",
"keep_audio": false,
"under_voice": false,
"cues": [
{"t": 0.30, "id": "sfx-988dafbd36", "role": "whoosh", "label": "le titre se pose"},
{"t": 0.62, "id": "sfx-mi630472", "role": "foley", "anchor": "start", "max_len": 0.9, "gain_db": -2, "label": "glaçons dans un verre"},
{"t": 8.30, "id": "sfx-fs339114", "role": "hit", "label": "la bouteille se pose"},
{"t": 0.00, "id": "sfx-c7d271e90f", "role": "ambience", "bed": true}
]
}
test l'image du moment en secondes.roledéfinit le niveau et l'ancrage par défaut (references/taste.md).anchor:startplace le début audible surt,peakle point le plus fort,endla fin audible.- Par repère :
gain_db(relatif au niveau du rôle),max_len,fade_in,fade_out,offset_in,pan(-1..1). "bed": true: une ambiance longue et stable sous tout le film à -54 dBFS (à peine entendue). Uniquement pour les films dont le son est uniquement SFX ; jamais sous une voix ou de la musique. Elle s'enchaîne par fondu enchaîné si le film est plus long.
Exécutez mix.py. Il affiche chaque son avec son heure d'atterrissage et son niveau de pic, et note lorsqu'un moment était si précoce que le son a dû commencer à l'intérieur de son fichier.
5. Vérifier, corriger, vérifier à nouveau
Exécutez check.py après chaque rendu ; le code de sortie 1 signifie qu'il a signalé quelque chose. Il lit les pistes WAV que mix.py a écrites à côté de _resolved.json, donc gardez ces fichiers ensemble lorsque vous copiez les résultats. Il trouve chaque son dans la piste rendue par sa propre forme d'onde, donc la sync est réelle : tout décalage de plus d'une image est un bug dans la feuille. Il mesure aussi les gestes par 10 s, le trou le plus long, les hits forts, les répétitions, le silence numérique, la sonie master et le pic vrai, la réduction mono, et le nombre d'images fortes qui ont reçu un son.
Pour chaque signalement, soit corrigez-le (ajoutez un son dans le trou, remplacez une répétition, déplacez un repère), soit décidez qu'il est correct et dites pourquoi dans le rapport (« le trou de 7,8 s est un passage parlé, la voix le porte »). Les notes sur les attaques lentes sont des indices : si le moment est le pic du son, passez ce repère à anchor: peak. Deux ou trois rounds sont normaux.
6. Livrer
Remettez à la personne :
FILM_sfx.mp4etFILM_sfx_track.wav(sons seuls, durée complète, à placer sous son propre montage).- Un court tableau : heure, moment, titre du son et identifiant, pourquoi ce son.
- Les chiffres de
check.py(rythme, trou le plus long, LUFS, pic vrai) et ce que chaque signalement restant signifie. - La liste d'écoute (
listen.wavregroupe ces moments en un seul fichier) : « écouter au casque et une fois sur un téléphone ». - Les lacunes : moments laissés silencieux et sons manquants dans la bibliothèque.
Rédigez le rapport dans la langue de la personne. Ne prétendez pas avoir écouté.
Optionnel : le moteur real-sfx
Le skill real-sfx de Clipwing (scripts MIT, par Alexander Korbanov) fait le même travail avec un moteur plus lourd : listes de repères typées, suppression de couches de synthé, grilles de temps, une critique en 9 axes. Il peut utiliser toute la bibliothèque EditAtlas comme pack principal. Voir references/real-sfx.md pour l'adaptateur et ce qui a été vérifié.