AudioFX를 사용한 사운드 디자인
AudioFX는 사운드 디자인 효과를 ffmpeg 필터그래프로 변환합니다. 각 효과는 ffmpeg -af에 직접 전달되거나 CLI를 통해 파일에 적용되는 문자열입니다. 웹 스튜디오에서 듣는 소리가 렌더링 결과물과 정확히 일치합니다.
명령어
이 문서 전체에서 sfx는 다음을 의미합니다:
node {{AUDIOFX_DIR}}/bin/sfx.mjs
만약 이 머신에서 sfx가 명령어로 인식되지 않으면 전체 경로를 사용하세요. 어떤 폴더에서든 작동합니다. ffmpeg 관련 오류가 발생하면 sfx doctor를 실행하세요.
| 필요한 기능 | 명령어 |
|---|---|
| 카탈로그 보기 | sfx list (또는 --json) |
| 파라미터, 범위 및 효과 사용 시기 | sfx describe <effect> |
| 오디오 또는 비디오 파일 처리 | sfx apply <input> <output> <step...> |
| 자체 ffmpeg를 위한 필터그래프 생성 | sfx graph <step...> |
| 음량과 피크 측정 | sfx analyze <file> |
| 비디오 길이 및 하드 컷 찾기 | sfx cuts <video> |
| 노래가 상승(드롭 후보) 및 하강하는 지점 | sfx sections <file> |
| 타임라인에서 음성, 음악, 효과 믹싱 (음악이 음성 아래로 덕킹) | sfx mix <output> --voice v.wav --music m.wav [--sfx hit.wav@6] [--video cut.mp4], 또는 sfx mix project.json <output> |
| 녹음된 샘플 보관 및 레이어링 | `sfx sample add <file |
| 이미 처리된 새로운 음성, 사운드 또는 노래 생성 | `sfx generate <sfx |
| 사용자가 듣고 조정할 수 있도록 함 | sfx studio (http://127.0.0.1:5177 열림) |
스텝(Step)은 effect[:param=value,param=value][@from-to] 형식으로 작성합니다:
sfx apply voice.wav voice-phone.wav telephone
sfx apply clip.mp4 clip-fx.mp4 "underwater:[email protected]" --fade 0.4
sfx graph "reverb:space=cathedral,mix=0.4" "fade:in=0,out=2"
- 스텝은 순서대로 실행됩니다.
@3.2-7은 효과를 해당 구간으로 제한하며, Dry 신호와 처리된 신호 사이에--fade초(기본값 0.25)의 크로스페이드를 적용합니다.@3.2-는 3.2초부터 끝까지를 의미합니다.- 출력 파일이
.mp4,.mov,.mkv또는.webm인 경우, 영상은 재인코딩 없이 복사되고 오디오만 대체됩니다. - 파라미터를 잘못 입력하면 CLI가 유효한 파라미터 목록을 보여줍니다. 추측하지 말고
sfx describe를 실행하세요.
워크플로우
- 스크립트 또는 편집본을 읽고 처리가 필요한 순간을 표시합니다: 전화 통화 음성, 카메라가 수중으로 들어가는 장면, 회상, 드롭, 코믹 컷 등.
sfx cuts video.mp4는 비디오의 길이와 하드 컷(기본--threshold10, 낮출수록 약한 컷도 감지)을 출력합니다. 시간을 초 단위로 기록하세요. - 아래 표에서 효과를 선택합니다. 확실하지 않으면
sfx list와sfx describe를 실행하세요. 기본값부터 시작하세요. 과하지 않으면서도 또렷하게 들리도록 조정되어 있습니다. - 믹싱 전에 각 트랙을 별도로 처리합니다. 시대감, 캐릭터 및 공간 효과는 전체 믹스가 아닌 음성 또는 특정 효과에 적용됩니다. 예외는 듣는 모든 것에 영향을 미치는 서사적 장치(수중, 셸 쇼크, 꿈)입니다.
- 클립 내 변경 사항에는 구간(
@from-to)을 사용하여 파일을 자르고 이어붙이지 않습니다. - 마지막에
sfx mix로 믹싱 및 노멀라이제이션을 수행합니다("믹싱" 참조): 음악을 음성 아래로 덕킹하고 마스터를 소셜 미디어 및 YouTube용 -14 LUFS(팟캐스트는--loudness -16, 방송은-23)로 노멀라이즈합니다. 단일 파일의 경우 체인 끝에loudness를 추가하면 동일한 작업을 수행합니다. 그런 다음sfx analyze로 음량이 목표에 가깝고 트루 피크가 -1 dBTP 이하인지 확인하세요. - 당신은 들을 수 없습니다. 어떤 효과를 어떤 시간에 적용했는지 말하고, 사용자가 직접 귀로 조정할 수 있도록
sfx studio를 제공하세요. 사용자가 새 값을 보내면 스튜디오에서 복사할 정확한 명령어를 제공합니다.
시네마 모멘트: 컷을 돋보이게 하는 요소
론치 비디오가 "영화처럼" 들리는 이유는 음성에 필터를 적용해서가 아니라, 정확한 순간에 배치된 요소들 덕분입니다: 컷 직전까지 올라가는 라이저(Riser), 침묵의 갭, 그리고 제품이 나타날 때의 서브가 포함된 히트(Hit). 이러한 효과들은 동일한 필터그래프 내에서 이러한 모멘트를 합성하며(라이선스 샘플 없음), at=<second>로 고정됩니다:
| 모멘트 | 체인 (T 시점의 컷) |
|---|---|
| 컷 시점의 히트, 제품 등장 | "riser:at=T,length=2.5" "drop-gap:at=T-0.45,gap=0.45" "hit:at=T" |
| 타이틀 또는 로고 | "braam:at=T" "sub-drop:at=T,level=-4" |
| 텍스트 또는 UI 비행 | "whoosh:at=T,length=0.8" (T에서 피크) |
| 페이드 투 블랙 | "stop-tail:at=T,decay=3.5" "sub-drop:at=T,level=-4" |
| 단어 강조 | "throw:at=T,kind=echo" (음성에 적용) |
| 테크 결함 | "stutter:at=T,slice=0.12,repeats=4" (오디오 길이 증가) |
at은 처리 중인 파일에서 컷의 초입니다.riser의 경우 끝나는 지점;whoosh의 경우 피크 지점;drop-gap의 경우 갭이 시작하는 지점입니다.gain을 건드리기 전에level(dB)로 레벨을 조정하세요.hit과sub-drop은 이미 크게 설정되어 있습니다.- 적고 정확하게: 15초당 한두 개의 모멘트. 모든 컷에 히트가 있으면 피곤합니다.
trailer-voice(깊고 웅장한 방 안의 목소리)와archival(아카이브 인터뷰)는at이 없는 음성 처리입니다.- 합성된 것이 아닌 실제 녹음된 사운드(무게감 있는 임팩트, 문, 유리, 비)가 필요하신가요?
T시점에 샘플을 레이어링하세요: 다음 섹션을 참조하세요.
실제 샘플을 레이어로 사용하기
합성 히트는 빠르고 무료이지만, 녹음된 임팩트, 우슈 또는 폴리 사운드는 일반적으로 더 현실적으로 느껴집니다. layer 효과는 동일한 필터그래프 내에서 정확한 초에 어떤 오디오 파일이든 신호에 믹스합니다:
sfx apply mix.wav mix-door.wav "layer:file=door.wav,at=6,align=onset,level=-3"
sfx apply mix.wav mix-hit.wav "riser:at=6,length=2.5" "drop-gap:at=5.55,gap=0.45" "layer:file=library:ab12cd34ef56,at=6,align=onset" "sub-drop:at=6,level=-4"
align=onset은 샘플의 어택(attack) 위치를 측정하여at에 그것을 배치합니다. 샘플은 종종 20-300ms의 침묵 또는 프리롤로 시작합니다. 기본값align=start를 사용하면 이 침묵으로 인해 히트가 늦게 느껴집니다. 우슈나 스웰의 경우align=peak를 사용하세요. 가장 큰 지점이 컷에 맞춰집니다.level(dB), 첫 몇 초만 사용하려면length, 쉐이핑하려면fadeIn/fadeOut.sync=<s>는 동기화 지점을 수동으로 설정합니다(align=start와 함께 사용).- 샘플은 합성된
hit,braam또는whoosh를 대체합니다. 주변에riser,drop-gap및sub-drop은 유지하세요. - 샘플 자체를 처리(리버브, 거리감, 스피커)하려면 먼저
sfx apply sample.wav sample-fx.wav ...로 처리한 후 결과를 레이어링하세요. - 지나가는 소리(자동차, 오토바이, 드론): 분리된 샘플을 가장 가까운 지점의
at과 함께doppler을 통해 렌더링한 후, 해당 초에sync를 맞춰 레이어링하여 지나감이 컷에 맞춰지도록 합니다:sfx apply car.wav car-pass.wav "doppler:at=2,speed=90", 그 다음"layer:file=car-pass.wav,at=6,sync=2". - 샘플 레벨은 매우 다양합니다. 레이어링 후 결과에 대해
sfx analyze를 실행하고 피크가 0 dBFS에 도달하면level을 낮추세요.
샘플 위치
샘플은 사용자 구독에 속하는 라이선스 오디오입니다. ~/.audiofx/samples에 위치하며 각각 옆에 .json 파일(id, 제목, 출처, 종류, 스템)이 있고, 절대 프로젝트 폴더나 저장소에 저장되지 않습니다:
sfx sample add <file-or-url> --title "무거운 나무 문 닫힘" --id <library id> --source epidemic-sound
sfx sample list # 각 샘플의 library:<id>, 지속 시간 및 어택 위치 출력
sample add는 로컬 파일을 복사하거나 URL을 다운로드하고, 어택을 측정한 후 layer:file=...에서 사용할 library:<id> 참조를 출력합니다. 스튜디오는 Samples 탭에 샘플을 표시하며, 그 모멘트는 합성 임팩트나 우슈 대신 샘플을 사용할 수 있습니다.
사운드 라이브러리에서 가져오기 (Epidemic Sound MCP)
사용자가 Epidemic Sound MCP를 연결한 경우(도구 SearchSoundEffects 및 DownloadSoundEffect):
- 먼저 재사용.
sfx sample list: 적합한 샘플이 이미 있으면 사용하세요. - 검색
SearchSoundEffects사용: 짧고 구체적인 용어("cinematic impact low", "whoosh fast short", "glass shatter"),first: 5, 사용 목적에 맞는 기간(밀리초) 필터(임팩트 및 우슈는 4000 미만; 앰비언스는 더 김). 제목, 태그 및 기간으로 선택하세요. - 다운로드
DownloadSoundEffect사용 (fileType: WAV). 만료되는 서명된 URL을 반환합니다. - 보관:
sfx sample add "<assetUrl>" --title "<title>" --id <id> --source epidemic-sound. 서명된 URL을 파일에 절대 기록하지 말고, 오디오를 프로젝트 내부에 절대 저장하지 마세요. - 사용
sample add가 출력한library:<id>와 함께:"layer:file=library:<id>,at=T,align=onset".
당신은 들을 수 없으므로, 샘플이 "듣기 좋다"고 주장하지 마세요. 측정 가능한 것(지속 시간, 어택 위치, 결과의 피크)을 보고하고, 선택이 중요할 때는 두세 개의 후보를 추가하여 사용자가 스튜디오의 Samples 탭에서 직접 귀로 선택하도록 하세요. 다운로드가 RETRY_LATER로 실패하면 명시된 시간만큼 기다렸다가 다시 시도하세요.
믹싱: sfx mix
sfx mix는 음성, 음악 및 효과 클립을 하나의 타임라인에 배치하고, 음악을 음성 아래로 덕킹하며, 마스터를 노멀라이즈합니다. 모두 하나의 ffmpeg 패스로 처리됩니다. 빠른 형식은 클립당 하나의 플래그, file@second를 사용합니다:
sfx mix final.mp4 --video cut.mp4 --voice [email protected] --music library:<id> --sfx [email protected]
sfx mix final.wav --voice vo.wav --music song.wav --duck 14 --loudness -16
sfx mix --video cut.mp4 --voice [email protected] --music song.wav --print > mix.json
- 음악은 음성이 재생되는 동안 10dB 감소합니다(
--duck <dB>,--no-duck).--sfx클립의 어택은 해당 초에 맞춰집니다(align=onset처럼). - 마스터는 -14 LUFS(
--loudness <LUFS|off>)를 목표로 노멀라이즈된 후, -1 dB 천장이 적용됩니다. 믹스가 측정되고 고정 게인으로 목표에 도달하므로 다이내믹이 유지됩니다. 피크가 먼저 천장에 도달하면 리미터가 최대 6dB까지 올라가 차이를 메웁니다. 따라서 매우 큰 히트가 있는 믹스도 목표 아래에 도달할 수 있습니다.sfx analyze로 확인하세요. 비디오의 AAC 오디오는 천장보다 약 0.3dB 더 높은 피크를 가질 수 있습니다("master": { "ceiling": -1.5 }로 -1 dBTP 유지). - 믹스는
--duration만큼 지속되며, 그렇지 않으면 비디오 길이, 또는 마지막 클립의 끝까지 지속됩니다.--video와 비디오 출력을 함께 사용하면 영상이 복사되고 오디오가 대체됩니다. --print는 렌더링 대신 프로젝트 JSON을 작성합니다. 편집한 후sfx mix mix.json final.mp4로 렌더링합니다.
프로젝트 파일은 각 클립과 트랙에 자체 설정을 제공합니다. 경로는 프로젝트 파일을 기준으로 하며, library:<id>는 파일이 허용되는 모든 곳에서 작동합니다:
{
"version": 1,
"video": "cut.mp4",
"tracks": [
{ "id": "voice", "role": "voice", "clips": [{ "file": "vo.wav", "at": 1.5, "steps": [{ "effect": "voice-clean" }] }] },
{ "id": "music", "role": "music", "clips": [{ "file": "library:<id>", "fadeOut": 2 }], "duck": { "depth": 12, "release": 600 } },
{ "id": "hits", "role": "sfx", "clips": [{ "file": "door.wav", "at": 7.52, "align": "onset", "gain": -3 }] }
],
"master": { "loudness": -14 }
}
- 클립:
file,at(타임라인 초),start및length(파일에서 사용할 구간),gain(dB),fadeIn,fadeOut,align(start,onset,peak),steps. - 트랙:
id,role(voice,music,sfx),gain,mute,solo,steps,duck(true,false또는{ depth, attack, release, threshold }; 음악 트랙은 기본적으로 켜짐). - 스텝:
{ "effect": "underwater", "params": { "depth": 0.8 }, "from": 4, "to": 9.5, "fade": 0.35 }. 클립 스텝은 클립 시간(0 = 클립 시작)으로 실행됩니다. 트랙 스텝은 타임라인 시간으로 실행되므로 해당 구간이 비디오와 일치합니다. - 마스터:
steps,loudness(null은 레벨을 그대로 유지),ceiling(dB, 기본값 -1).
비디오에 맞춰진 음악
목표는 비디오의 정확한 길이에 맞게 잘리고, 드롭이 비디오의 주요 컷에 맞춰진 트랙입니다. 어떤 라이즈가 "그" 드롭인지 들을 수 없습니다: 숫자로 측정하고 제안한 후 사용자가 귀로 확인하도록 하세요. Epidemic Sound MCP 사용 시 (SearchRecordings, DownloadRecording, EditRecording, PollEditRecordingJob, DownloadRecordingEdit):
- 비디오 측정.
sfx cuts cut.mp4는 길이(예: 30.000초)와 하드 컷을 출력합니다. 사용자와 드롭이 떨어져야 할 주요 컷C(예: 12.4초)에 동의하세요. - 트랙 찾기 및 보관.
SearchRecordingswithquery: { term: "..." },filter(bpm: {min,max},duration: {min,max}
- ...
(참고: 원본 SKILL.md가 일부 잘려서 제공되었습니다. 제공된 내용을 최대한 정확하게 번역했습니다.)