사운드 디자인: 완성된 영상에 실제 사운드 적용하기
목표: 영화가 좋은 라이브러리를 가진 편집자가 컷한 것처럼 들리게 합니다. 모든 사운드는 EditAtlas의 실제 파일이며, 살펴본 프레임에 배치되고, 숫자로 정당화할 수 있는 레벨로 설정됩니다.
전체 과정 내내 두 가지 사실이 적용되므로, 이에 맞춰 계획하십시오:
- 들을 수 없습니다. 사운드는 설명과 측정된 수치(
sounds.py info)로 선택하고, 배치와 레벨은check.py로 확인하며, 사람에게는 들어볼 짧은 순간 목록을 전달합니다. 사운드가 "좋게 들린다"고 말하지 말고, 무엇을 측정했고 아직 귀가 필요한지 말하십시오. - 지어내면 안 됩니다. 주어진 비디오만을 작업하십시오. 비디오가 없으면 요청하십시오. 라이브러리에 없는 사운드가 필요한 순간은 무음으로 남기고 보고서에 명시하십시오.
모든 스크립트는 scripts/에 있습니다 (Python 3.9+, numpy, 프레임 시트용 Pillow, PATH에 ffprobe가 있는 FFmpeg 필요). 스킬 폴더의 경로를 사용하여 자신의 작업 폴더(work/, result/)에서 실행하십시오. 사람의 프로젝트나 이 스킬 폴더에는 절대 쓰지 마십시오.
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 # 한 시간 주변 0.1초 간격 프레임
python SKILL/scripts/sounds.py search "유리잔 부딪힘" --max-dur 2 # 공개 인덱스에서 ID 검색
python SKILL/scripts/sounds.py info sfx-ID sfx-ID # 한 번 다운로드, SHA-256, 측정 수치
python SKILL/scripts/sounds.py sheet sfx-ID sfx-ID --out work/c.png # 후보 사운드의 파형 + 스펙트로그램
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
사운드는 https://raw.githubusercontent.com/EditAtlas/sfx/main/에서 가져오며 ~/.cache/editatlas-sfx에 캐시됩니다 (EDITATLAS_SFX_CACHE로 위치 변경 가능). EditAtlas/sfx의 로컬 클론이 있으면 sounds.py의 하위 명령어 앞에 --mirror PATH를 전달하면 다운로드하지 않습니다.
1. 영화와 그 사운드 살펴보기
moments.py를 실행합니다. 이 스크립트는 기존 오디오를 보고 (has_audio, LUFS, 무음 비율) 픽셀 차이로부터 세 가지 종류의 순간을 찾습니다: cut (장면 전환), move (움직임 시작 또는 절정), land (움직임 멈춤: 무언가 안착). 그런 다음 Read 도구로 overview.png와 sheet.png를 엽니다: 숫자는 부드러운 애니메이션(고정된 얼굴 위로 배지가 확대되는 것은 컷으로 감지되지 않음)을 놓치고 카메라 흔들림을 과도하게 보고합니다. 중요한 곳에서는 --at T로 특정 시간 주변 프레임을 그리고 물체가 나타나거나, 안착하거나, 방향을 바꾸는 정확한 프레임을 찾습니다.
영화 자체 오디오가 무엇인지 결정하십시오:
| 숫자와 화면에서 보이는 것 | 큐 시트 설정 |
|---|---|
오디오 없음, 또는 silent_share가 1에 가까움 | "keep_audio": false: 사운드가 영화를 전달하며, 약 -16 LUFS로 조정됨 |
| 음악만 있음 | "keep_audio": true: 사운드는 음악보다 약 3 LU 낮게 배치; 가능하면 비트에 악센트를 넣음 |
| 누군가 말하고 있음 (자막, 얼굴, 라발리에 마이크) | "keep_audio": true, "under_voice": true: 음성보다 약 8 LU 낮게; 더 적고 가벼운 사운드 |
| 합성된 비프음이 이미 믹스에 포함됨 | 질문: 교체하려면 스템이 필요함; 실제 사운드를 겹치면 두 배가 됨 |
영화 오디오 유지 여부가 명확하지 않으면 사람에게 물어보십시오.
2. 본 내용을 바탕으로 이벤트 목록 작성하기
사운드가 필요한 각 순간에 대해 한 줄씩: 시간, 발생 상황, 사운드 종류. 편집자처럼 생각하십시오:
- 나타나는 물체 (배지, 칩, 버튼, 자막 카드): 짧은 팝, 틱 또는 부드러운 딩,
anchor: start. - 가로질러 움직이거나 전환: 도착 지점에서 가장 큰 지점이 오는 윙 소리,
anchor: peak. - 무게감 있게 안착하는 물체 (로고, 제품, 스탬프): 멈추는 프레임에 맞춰 타격음 또는 쿵 소리,
anchor: peak. - 화면의 실제 물체 (유리잔, 얼음, 종이, 열쇠, 음료): UI 사운드가 아닌 해당하는 폴리 사운드.
- 성공 / 오류 상태: 예에는 딩, 아니오에는 짧은 부저 또는 알람. 영화당 하나의 인터페이스 사운드 계열 사용.
- 무언가가 축적되는 경우: 끝이 정점에 도달하는 라이저,
anchor: end.
모든 움직임에 사운드가 필요한 것은 아닙니다. 페이스와 취향에 대한 숫자 규칙은 references/taste.md에 있습니다; 세션의 첫 번째 큐 시트 전에 읽으십시오.
3. 사운드 선택: 읽고, 측정하고, 비교하기
- 검색. EditAtlas MCP가 연결되어 있으면
search_sfx가 더 잘 순위를 매깁니다 (베트남어도 이해함); 그렇지 않으면sounds.py search를 사용하십시오. 제목은 의도적으로 원본 파일의 단어를 피합니다 ("카메라 셔터"는 "Lens Aperture Tick"), 그러므로 사운드가 무엇인지 검색하고 동의어와 카테고리 필터를 시도하십시오. - 2~4개의 후보에 대해
sounds.py info를 실행하십시오. 읽을 항목:audible_s(실제로 들리는 길이; 파일은 더 길 수 있음),attack_s(0.0x = 즉시 들림, 0.3+ = 점차 커짐),peak_t_s,centroid_hz(약 1500 미만은 어둡게, 6000 초과는 밝게),mono_loss_db(-6 미만은 전화기에서 채널이 상쇄됨;mix.py는 더 큰 채널을 재생함). - 두 후보의 수치가 같으면
sounds.py sheet를 사용하십시오: 날카로운 수직선은 클릭, 번짐은 윙 소리, 바닥의 에너지는 무게를 나타냅니다. - 무엇이 움직이고 무엇에 닿는지에 따라 선택한 후, 길이로 선택하십시오: 0.3초 칩 팝은 1.8초 만화 팝이면 안 됩니다.
max_len을 사용하여 긴 파일을 페이드 아웃과 함께 자릅니다. - 한 종류의 반복되는 순간(세 개의 칩)은 동일한 파일을 세 번 사용하지 말고, 하나의 계열에서 다른 테이크(Tiny Plop 05, 06, Empty Plop 06)를 사용하십시오.
라이브러리는 일부 영역에서 부족합니다 (2026-11-07 측정 기준): 액체 따르기나 거품, 룸 톤, 스탬프, 물방울과 쿵 소리가 거의 없습니다. 가장 가까운 정직한 사운드를 선택하고, 잘못된 사운드를 강제로 사용하기보다는 보고서에서 그 차이를 명시하십시오.
4. 큐 시트 작성 및 렌더링하기
{
"video": "work/film.mp4",
"keep_audio": false,
"under_voice": false,
"cues": [
{"t": 0.30, "id": "sfx-988dafbd36", "role": "whoosh", "label": "제목 안착"},
{"t": 0.62, "id": "sfx-mi630472", "role": "foley", "anchor": "start", "max_len": 0.9, "gain_db": -2, "label": "얼음이 유리잔에 들어감"},
{"t": 8.30, "id": "sfx-fs339114", "role": "hit", "label": "병 안착"},
{"t": 0.00, "id": "sfx-c7d271e90f", "role": "ambience", "bed": true}
]
}
t는 순간의 프레임 시간(초)입니다.role은 레벨과 기본 앵커를 설정합니다 (references/taste.md참조).anchor:start는 들리기 시작하는 지점을t에 맞추고,peak는 가장 큰 지점,end는 들리는 끝 지점을 맞춥니다.- 큐별 설정:
gain_db(역할 레벨 기준),max_len,fade_in,fade_out,offset_in,pan(-1..1). "bed": true: 영화 전체에 걸쳐 -54 dBFS(거의 들리지 않음)의 길고 일정한 앰비언스 사운드. 사운드가 SFX만 있는 영화에만 사용하고, 음성이나 음악 아래에는 절대 사용하지 마십시오. 영화가 더 길면 자체적으로 크로스페이드됩니다.
mix.py를 실행합니다. 모든 사운드의 배치 시간과 피크 레벨을 출력하며, 사운드가 파일 내에서 시작해야 했을 정도로 순간이 너무 이른 경우를 알려줍니다.
5. 확인, 수정, 재확인
렌더링할 때마다 check.py를 실행하십시오; 종료 코드 1은 무언가 플래그가 지정되었음을 의미합니다. 이 스크립트는 mix.py가 _resolved.json 옆에 쓴 WAV 트랙을 읽으므로, 결과를 복사할 때 해당 파일들을 함께 보관하십시오. 렌더링된 트랙에서 각 사운드를 자체 파형으로 찾으므로, sync는 실제적입니다: 한 프레임 이상 차이가 나면 시트의 버그입니다. 또한 10초당 제스처 수, 가장 긴 구멍, 강한 타격음, 반복, 디지털 무음, 마스터 음량과 트루 피크, 모노 폴드다운, 그리고 얼마나 많은 강한 화면 순간에 사운드가 할당되었는지 측정합니다.
각 플래그에 대해 수정(구멍에 사운드 추가, 반복 교체, 큐 이동)하거나, 옳다고 판단하고 보고서에 그 이유를 설명하십시오("7.8초 구멍은 대화 구간이며, 음성이 전달합니다"). 느린 어택에 대한 참고 사항은 힌트입니다: 순간이 사운드의 피크라면 해당 큐를 anchor: peak로 전환하십시오. 두세 번의 라운드는 정상입니다.
6. 전달하기
사람에게 다음을 제공하십시오:
FILM_sfx.mp4와FILM_sfx_track.wav(사운드만, 전체 길이, 자신의 편집 아래에 깔 수 있도록).- 간단한 표: 시간, 순간, 사운드 제목과 ID, 해당 사운드를 선택한 이유.
check.py의 수치 (페이스, 가장 긴 구멍, LUFS, 트루 피크)와 각 남은 플래그의 의미.- 듣기 목록 (
listen.wav는 해당 순간들을 하나의 파일로 자름): "헤드폰으로 한 번, 전화기로 한 번 들어보십시오". - 차이점: 무음으로 남겨진 순간과 라이브러리에 없었던 사운드들.
보고서는 상대방의 언어로 작성하십시오. 당신이 들었다고 주장하지 마십시오.
선택 사항: real-sfx 엔진
Clipwing의 real-sfx 스킬 (MIT 스크립트, Alexander Korbanov 제작)은 더 무거운 엔진(타이핑된 큐 목록, 신스 레이어 제거, 비트 그리드, 9축 비평)으로 동일한 작업을 수행합니다. 전체 EditAtlas 라이브러리를 메인 팩으로 사용할 수 있습니다. 어댑터와 검증된 내용은 references/real-sfx.md를 참조하십시오.