플러그인 설치: 설정 또는 초기화 명령 전에 이 스킬이 HyperFrames 플러그인 내부에 있을 경우 플러그인 실행 규칙을 따르세요. 독립 실행형 설치의 경우 아래 업데이트 지침을 유지합니다.
HyperFrames Audio
믹스는 프로세서의 더미가 아니라 관계의 집합입니다. 각각 혼자서는 완벽하게 들리는 두 트랙이 함께 있을 때는 들을 수 없게 될 수 있으며, 해결책은 거의 항상 "하나를 줄이는 것"이 아닙니다. 무엇을 위해 싸우고 있는지 찾아서 필요한 쪽에 주는 것입니다. 여기에 있는 모든 도구는 그러한 관계 중 하나를 표현하기 위해 존재합니다.
이펙트는 data-fx-chain으로 요소에 존재하며, 프리뷰와 렌더는 동일한 Web Audio 그래프를 실행합니다. 라이브 컨텍스트의 스튜디오, 이미 구동 중인 브라우저 내 오프라인 엔진입니다. 각 이펙트의 구현은 하나뿐이므로 스크러빙 중에 듣는 소리가 기록되는 소리와 동일합니다. 두 번 튜닝할 필요가 없습니다.
클립 타이밍은 /hyperframes-core가 담당합니다. 오디오/비디오 트림 및 소스 범위는 data-start, data-duration, data-media-start를 사용하며, 크로스페이드는 다른 트랙의 클립을 겹칩니다. 이 스킬은 배치된 트랙의 페이드인/페이드아웃, 크로스페이드 엔벨로프, 트랙 게인/트랙 볼륨, 볼륨 및 이펙트 자동화, 덕킹/보이스오버 카빙, 그리고 이펙트 체인을 소유합니다. /media-use는 소싱, 생성 및 전처리를 소유합니다.
상수 data-playback-rate (0.1..10)는 오디오/비디오 요소가 동일한 타이밍, 소스 오프셋 및 속도를 사용할 때 픽처 및 피치 보존 사운드에 대해 렌더 세이프입니다. 스피드 램프는 data-automation의 rate 레인입니다(docs/reference/speed-ramps 참조). 상수보다 우선하며 프리뷰와 렌더 모두에서 피치를 유지합니다. HyperFrames는 자동 파형 동기화 또는 드리프트 보정을 제공하지 않습니다. 복사 가능한 컷/크로스페이드/리타임 레시피는 /hyperframes-core → references/creator-editing-recipes.md를 사용하세요.
세 가지 속성이 오디오/비디오 요소 자체에 모든 것을 전달합니다. 또는 처음 두 개의 경우 <hf-audio-group> 버스에서 전달합니다("여러 트랙을 위한 하나의 버스" 참조).
| 속성 | 보유 항목 |
|---|---|
data-fx-chain | 신호 순서대로 이펙트 |
data-automation | 이 트랙의 볼륨 또는 이펙트 매개변수에 대한 엔벨로프 |
data-fx-carve | 카브 자체 설정(재파생 가능하도록) |
제공되는 이펙트 제품군은 게인, EQ(하이패스, 로우패스, 피킹, 셸프), 컴프레서, 리미터, 게이트, 새추레이트, 딜레이, 리버브, 코러스, 페이저, 비트크러시입니다.
각각의 정확한 JSON과 레인이 충족해야 하는 규칙: references/attributes.md.
매개변수, 범위 및 단위가 포함된 모든 이펙트: references/fx-registry.md.
들을 수 없는 파일의 문제를 해결하는 방법: references/diagnosis.md.
프리셋, 명명된 작업 및 원노브 프로필, 증상-수정 테이블: references/presets.md — 체인을 수동으로 구축하기 전에 반드시 읽으세요. 프리셋이나 명명된 작업 중 하나가 일반적으로 문제를 이미 지목하기 때문입니다.
어떻게 함께 작동하는지
두 개의 저작 표면이 해당 속성을 작성하고, 두 개의 런타임이 동일한 빌더를 통해 읽습니다. 공유된 중간이 프리뷰가 렌더를 예측하는 이유입니다.
flowchart TB
voice["보이스 트랙<br/>미디어 파일"]
bed["음악 배경<br/>미디어 파일"]
subgraph AUTHOR["저작 — 속성을 작성하는 유일한 것들"]
panel["스튜디오<br/>보이스오버 카브 제어"]
script["scripts/carve.mjs<br/>쌍을 감지"]
analysis["core/audioCarve.ts<br/>carveProfile · analyseCarveBands<br/>analyseCarveDuck · analyseCarveDynamics"]
panel --> analysis
script --> analysis
end
voice --> analysis
bed --> analysis
subgraph ATTRS["배경 요소에 기록됨"]
carveAttr["data-fx-carve<br/>소스 · 강도"]
chainAttr["data-fx-chain<br/>피킹 xN + 게인, fromCarve로 태그됨"]
autoAttr["data-automation<br/>카브된 매개변수당 하나의 레인"]
end
analysis --> carveAttr
analysis --> chainAttr
analysis --> autoAttr
subgraph SHARED["하나의 구현, 둘 다 읽음"]
build["audioFxGraph.ts · buildFxChain"]
sched["audioFxAutomation.ts · scheduleChainAutomation"]
end
chainAttr --> build
autoAttr --> sched
build --> preview["프리뷰<br/>라이브 AudioContext<br/>attachElementFxChain"]
sched --> preview
build --> render["렌더<br/>헤드리스 브라우저의 OfflineAudioContext<br/>applyAudioFxChain"]
sched --> render
preview --> heard["스크러빙 중 듣는 소리"]
render --> wav["처리된 WAV<br/>+ chainTailSeconds로 믹스가 테일을 통과시킴"]
wav --> mix["엔진 · audioMixer<br/>볼륨 레인은 여기서 PCM에 구워지고 그래프에는 없음"]
mix --> out["렌더링된 믹스"]
edit["재생 중 속성 편집"] -.->|MutationObserver| preview
카브 자체의 설정은 재생 중에 절대 읽히지 않습니다. 그것이 생성한 체인과 레인이 재생됩니다. data-fx-carve는 기존 카브에서 강도를 다시 추측하는 대신 변경할 수 있도록 존재합니다.
카브된 배경 내부에서 신호는 먼저 딥을 통과한 다음 레벨 매치, 그리고 사용자가 직접 구축한 모든 것을 통과합니다. 이것이 사용자가 추가한 리미터가 여전히 마지막 천장 역할을 하는 이유입니다.
flowchart LR
src["디코딩된 배경"] --> p1["피킹<br/>400 Hz"]
p1 --> p2["피킹<br/>1 kHz"]
p2 --> p3["피킹<br/>1.6 kHz"]
p3 --> g["게인<br/>레벨 매치"]
g --> hand["사용자 자신의 이펙트<br/>예: 리미터"]
hand --> dest["트랙 게인, 출력"]
l1["레인 fx.n1.gain"] -.->|"해당 대역에서<br/>음성 레벨의 엔벨로프"| p1
l4["레인 fx.n4.gain"] -.->|"배경이 전체적으로<br/>덕킹되는 정도"| g
먼저, 무엇이 잘못되었는지 파악하세요
아래 표는 "웅웅거리는 소리가 난다"에서 시작합니다. 이는 누군가가 이미 듣고 그렇게 말했다고 가정합니다. "이것을 수정하라"는 파일과 문장 없이 전달받았다면 들을 수 없으므로 측정해야 합니다. 하나의 규칙이 모든 것을 지배합니다.
단일 알 수 없는 음성의 절대 스펙트럼은 진단할 수 없습니다. 포먼트는 ±10 dB이고, 기본 주파수는 85–255 Hz이며, 문장은 끝날수록 5–6 dB 감소합니다. 이 모든 것은 그 자체로 결함으로 읽히며, 모두 화자의 것입니다.
따라서 비교하세요. 그리고 동일한 파일 내의 무언가와 비교하세요. 존재한다면 깨끗한 원본, 그렇지 않다면 일시 정지 구간입니다. 갭에서 들리는 것은 무엇이든 추가적이며, 갭의 스펙트럼은 음성이 아닌 채널입니다. 게시된 평균 스펙트럼이나 합성된 제어 음성과 비교하는 것은 작동하지 않습니다. 두 화자는 대부분의 결함보다 더 많이 다르며, 이 지침 뒤에 있는 평가에서 두 가지 잘못된 답변 모두 정확히 그 이유에서 비롯되었습니다.
원본도 유용한 무음도 없을 때, 정적 음조 결함은 진정으로 불충분하게 결정됩니다. 그렇게 말하고 하나를 선택하여 체인을 구축하기보다는 맞는 판독값을 제공하세요.
명령, 함정 및 작업 레시피: references/diagnosis.md. 아무도 설명하지 않은 파일을 진단하기 전에 읽으세요.
증상부터 시작하세요
일단 대역과 종류를 알았다면 오디오의 문제가 무엇인지 이름을 지정하세요. 대부분의 나쁜 오디오는 이 중 한두 가지이며, 각각 제공된 답변이 있습니다.
| 소리가 나는 경우 | 사용할 것 |
|---|---|
| 밑에서 나는 험 또는 쿵쾅거림 | rumble-cut 또는 80 Hz의 highpass |
| 웅웅거림, 가슴이 답답함 | Tame Boominess 작업 (200 Hz) |
| 먹먹함, 판지 뒤에 있는 듯함 | Reduce Mud 작업 (250 Hz) |
| 말을 알아듣기 어려움 | Add Clarity 작업 (3 kHz) 또는 배경 카브 |
| 날카롭고 피곤함 | Soften Harshness 작업 (3.2 kHz) |
| 어떤 단어는 다른 단어보다 훨씬 큼 | 컴프레서의 Evenness 또는 Even Out Levels |
| 문장 사이에 방 톤이 있음 | room-gate |
| 음성과 음악이 싸움 | Voiceover carve — 둘 중 하나에 EQ가 아님 |
| 건조함, 아무데서나 녹음된 듯함 | room-tight 또는 room-natural |
| 그냥 "아마추어" 느낌 | voice-clean (위의 네 가지를 순서대로 포함) |
전체 카탈로그, 각 프리셋의 내용, 대역 어휘 및 의도적으로 다루지 않는 것(디에싱, 노이즈 제거, 톤 매치): references/presets.md.
추가하기 전에 빼고, 필터링 후에 레벨을 조정하고, 레벨 후에 관계를 설정하고, 관계 후에 캐릭터와 천장을 설정하세요. 각 단계는 다음 단계가 듣는 것을 변경합니다. 하이패스 전에 설정된 컴프레서는 럼블을 쫓는 데 시간을 보냅니다.
이름이 아닌 문제로 제품군을 선택하세요
필터(highpass, lowpass, peaking, lowshelf, highshelf)는 트랙이 점유할 수 있는 주파수를 결정합니다. 이는 두 소스가 충돌할 때 첫 번째 도구입니다. 충돌은 대역에서 발생하기 때문입니다. 배경과 음성 모두 1–3 kHz를 원하며, 배경에서 그것을 빼는 것은 전체를 줄이는 것보다 믹스에 훨씬 적은 비용이 듭니다. 음성의 하이패스는 럼블에 대한 표준 수정입니다. 로우패스는 의도적으로 어둡게 만들거나 먹먹하게 만듭니다.
다이내믹스(gain, compressor, limiter, gate)는 트랙의 레벨이 시간에 따라 어떻게 행동하는지 결정합니다. 컴프레션은 큰 소리와 작은 소리 사이의 거리를 좁혀 작은 부분이 올라올 수 있게 합니다. 리미터는 천장입니다. 어떤 것도 형성하지 않으며 아무것도 통과하지 못하게 보장합니다. 게이트는 임계값 아래의 것을 제거하며, 이것이 구문 사이의 방 톤을 무음화하는 방법입니다. gain은 일반 레벨 단계이며, 트랙이 비켜서야 할 때 자동화 레인이 타는 곳입니다.
비선형(saturate, bitcrush)은 파형의 모양을 변경하여 없었던 고조파를 추가합니다. 수정보다는 캐릭터나 거친 느낌이 필요할 때 사용하세요. 그리고 생성적이라는 것을 기억하세요. 얇은 소스를 더 조밀하게 만들고 더 깨끗하게 만들지 않습니다.
시간(delay, reverb, chorus, phaser)은 트랙을 공간에 배치하거나 너비를 제공합니다. 이것들은 믹스를 가장 쉽게 망칠 수 있는 것들입니다. 테일이나 디튠된 복사본은 음성이 필요한 동일한 공간을 차지하기 때문입니다. 다른 것 뒤에 있어야 하는 것에 사용하고, 단독으로 들을 때 적절하게 들리는 것보다 습도를 낮게 유지하세요.
체인은 직렬입니다. 각 이펙트는 이전 이펙트가 생성한 것을 처리합니다. 따라서 수정 필터링은 초기에, 캐릭터는 중간에, 리미터는 마지막에 실제로 천장 역할을 할 수 있는 곳에 배치하세요.
보이스오버 카브
해결하는 문제. 음성 아래의 음악 배경은 음성을 따라가기 어렵게 만듭니다. 반사 신경은 전체 배경을 덕킹하는 것이며, 이는 작동하지만 배경의 모든 존재감을 희생합니다. 음악은 전체 보이스오버 동안 축 늘어집니다. 그러나 음성은 전체 스펙트럼이 필요하지 않습니다. 실제로 점유하는 몇 개의 대역만 필요합니다. 카브는 그것들만 가져가고 배경은 저역과 고역을 유지하므로 음성이 여전히 명료한 동안 음악은 여전히 음악입니다.
이펙트가 아닌 관계입니다. 설정은 배경 에 있습니다. 처리되는 트랙이며, 듣기 위한 음성을 지정합니다. 정확히 사이드체인 컴프레서가 하는 것처럼요: 더 조용해지는 트랙을 선택하고 무엇이 더 조용하게 만드는지 선택합니다. 절대 음성 트랙에 카브를 넣지 마세요. 자신에 대해 카브된 음성은 미묘한 믹스 선택이 아니라 버그입니다.
음성 중 하나가 아닌 모든 음성입니다. sources는 목록입니다. 배경은 일반적으로 전체 시퀀스(내레이터, 인터뷰 답변, 두 번째 발표자) 아래에서 실행되기 때문입니다. 그것들은 배경 자체의 클록에 합산된 후에야 측정됩니다(mixCarveSources). 따라서 하나의 분석이 모두를 다룹니다. 대역은 존재하는 모든 음성에서 오고 엔벨로프는 그중 어떤 것이든 발생하는 곳에서 상승합니다. 배경이 재생되는 동안 재생되지 않는 음성은 제외됩니다. 배경을 마스킹할 수 없습니다.
둘 이상의 클립 ID에 대한 카브는 잘못되었습니다. 클립을 그룹화하고 그룹에 대해 카브하세요. 이것은 팁이 아니라 불변 조건입니다. 클립을 하나씩 지정하는 것은 완전히 정확해야 하며 다음 편집까지만 정확합니다. 나중에 추가된 네 번째 내레이션 클립은 카브의 인식 범위 밖에서 재생되며 배경은 조용히 그 아래에서 덕킹하는 데 실패합니다. 대신 그룹의 이름을 지정하면 분석 시간에 멤버십이 해결되므로 나중에 그룹에 추가된 클립은 sources를 전혀 건드리지 않고도 처리됩니다.
<!-- 내레이션을 그룹화한 다음 해당 그룹에 대해 배경을 카브 -->
<audio id="vo-intro" data-audio-group="voiceover" …></audio>
<audio id="vo-middle" data-audio-group="voiceover" …></audio>
<audio id="vo-outro" data-audio-group="voiceover" …></audio>
<audio id="music" data-fx-carve='{"enabled":true,"sources":["voiceover"],"strength":0.8}' …></audio>
그룹 대신 두 개 이상의 일반 클립 ID를 나열하는 sources 목록은 audio_carve_ungrouped_sources 린트 규칙에 의해 포착됩니다. 여전히 작동하지만 클립이 추가될 때 조용히 손상되는 버전입니다.
카브 그룹을 음성 그룹으로 유지하세요: 배경, SFX, 음악이 없어야 합니다. sources의 그룹 ID는 모든 현재 멤버를 모든 분석에서 확인합니다. 따라서 이름을 지정한 그룹은 나중에 얻는 그룹이며, 작성되었을 때 측정된 트랙이 아닙니다. 두 가지 방식으로 문제가 발생합니다.
- 자체 소스 그룹의 배경. 자체 콘텐츠에 대해 음성으로 전달되고 카브됩니다. "트랙을 자체에 대해 카브하지 마라" 규칙이 재분석 시 도착합니다.
- 음성 그룹의 SFX 또는 음악 클립. 다음 분석 시 사이드체인에 들어가며 배경은 워시 아래에서 덕킹을 시작합니다. 속성을 작성한 실행이 그것을 측정하지 않았음에도 불구하고요.
둘 다 카브가 작성되는 순간에는 보이지 않습니다. 분석은 감지된 음성을 합산하고 그룹 해결을 통해 왕복하지 않으므로 첫 번째 패스는 진정으로 정확하고 다음 패스만 틀립니다. 따라서 각 역할에 자체 그룹을 지정하세요. 배경에는 music, 내레이션에는 voiceover, 히트에는 sfx — 그리고 sources에 이름이 지정된 그룹에는 음성 외에는 아무것도 없도록 유지하세요.
carve.mjs는 두 경우 중 하나를 볼 때 그룹 양식을 쓰기를 거부하고 클립 ID를 기록하며 stderr에 어떤 멤버가 차단했는지 말합니다. 그러면 audio_carve_ungrouped_sources 규칙이 배열을 가리킵니다.