Skip to content

Commit 4c03e3c

Browse files
vanceingallsclaude
andcommitted
docs(skills): carve every voice from the command line too
`--voice` repeats, and with none given the script takes the bed by name and every non-SFX track playing over it. Audio elements are preferred: video counts only when no audio track is left to be the voice, or every B-roll clip in a composition reads as somebody talking — which is exactly what happened on the first run against a real project. The by-ear tie-break is gone with the single-voice model that needed it: it existed to choose one voice, and there is nothing to choose now. `--static` is gone too. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent df7a8c0 commit 4c03e3c

3 files changed

Lines changed: 157 additions & 169 deletions

File tree

skills/hyperframes-audio/SKILL.md

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,17 @@ takes only those, and the bed keeps its low end and its top, so it is still musi
150150
while the voice is still intelligible.
151151

152152
**It is a relationship, not an effect.** The settings live on the *bed* — the
153-
track that gets processed — and they name the voice to listen to, exactly as a
153+
track that gets processed — and they name the voices to listen to, exactly as a
154154
sidechain compressor does: you select the track that gets quieter and pick what
155-
makes it quieter. **Never put a carve on the voice track.** A voice carved
156-
against itself is a bug, not a subtle mix choice.
155+
makes it quieter. **Never put a carve on a voice track.** A voice carved against
156+
itself is a bug, not a subtle mix choice.
157+
158+
**Every voice, not one of them.** `sources` is a list, because a bed usually runs
159+
under a whole sequence — a narrator, an interview answer, a second presenter. They
160+
are summed onto the bed's own clock before anything is measured (`mixCarveSources`),
161+
so one analysis covers all of them: the bands come from all the speech there is, and
162+
the envelopes rise wherever any of it is happening. Voices that never play while the
163+
bed does are left out; they cannot mask it.
157164

158165
**One knob.** `strength` is 0..1 and derives everything: how deep to cut, how
159166
many bands, how wide, how far to favour intelligibility over raw voice energy,
@@ -172,13 +179,11 @@ polish step to get to if there is time. Place both tracks, run the command below
172179
listen. Skip it only when there is no narration for the music to sit under — a
173180
music video, a title card, a montage cut to the track.
174181

175-
**Static or dynamic — dynamic unless you know otherwise.** A static carve holds
176-
its cuts for the whole clip, including every pause, so the bed is thinned where
177-
there is nothing to make room for. Dynamic turns every value into an envelope of
178-
the voice's own level: silence leaves the bed alone, a loud passage pushes the
179-
carve to full depth. That is what almost every voiceover wants, so it is the
180-
default. Reach for `--static` only for wall-to-wall narration with no real gaps,
181-
where an envelope is hundreds of breakpoints describing a constant.
182+
**It always follows the voice.** There is no static mode: a fixed depth thins the
183+
bed through every pause, and once you have heard both there is no reason to want it.
184+
Every value becomes an envelope of the speech's own level — silence leaves the bed
185+
alone, a loud passage pushes the carve to full depth — written as ordinary automation,
186+
which is why the lanes show up in the timeline and can be edited afterwards.
182187

183188
**Level matching is part of it.** Spectral carving cannot fix a bed that is
184189
simply louder than the voice. So the carve also measures how far over the voice
@@ -187,8 +192,13 @@ driven by an envelope for a dynamic one. That envelope releases slowly on
187192
purpose — music that snaps back to full the instant a word ends sounds like a
188193
machine doing it.
189194

190-
**Running it.** In Studio: pick the voice in the bed's Voiceover carve control;
191-
turning it on adds the modules and strength adjusts what is there. Headless —
195+
**Running it.** In Studio the carve is one module at the top of a track's effect
196+
rack — voice, strength, dynamic, and the analysis it produced, in one card. It is
197+
there whenever another track could be the voice, and a bed with exactly **one**
198+
candidate above it is carved by default, dynamically, at the default strength:
199+
that is what a bed under narration wants, and the module is where you change or
200+
switch it off. Several candidates leaves the picker waiting rather than guessing.
201+
Headless —
192202
which is the path when you are authoring a composition rather than editing one:
193203

194204
```bash
@@ -206,20 +216,17 @@ bands 400Hz -6dB q1.4, 1000Hz -3dB q1.4, 1600Hz -3.17dB q1.4
206216
level 216-point envelope, floor -6 dB
207217
```
208218

209-
Name the pair with `--bed` / `--voice` when the composition has several plausible
210-
tracks, `--strength` to push it, `--static` to hold one depth, `--dry-run` to see
211-
that report and write nothing.
212-
213-
**How it picks the pair.** Names first, because that is what you already told it
214-
and the answer is explainable: a track whose id or filename looks like music
215-
(`music`, `bgm`, `bed`, `score`…) is the bed, one that looks like a voice
216-
(`voice`, `vo`, `narration`, `speech`…) is the voice, and SFX-shaped names are not
217-
candidates for either. If one role is filled and a single track is left, that
218-
track takes the other role. Only when names decide nothing does it listen: it
219-
measures how much of each track is quiet, and the one that stops between phrases
220-
is the voice. **When two tracks are too close to call it refuses and asks you to
221-
name them** rather than carving the wrong one — a bed carved against a bed is
222-
silent and confusing, and typing two ids is cheap.
219+
Name the tracks with `--bed` / `--voice` (repeatable) when the automatic choice is
220+
wrong, `--strength` to push it, `--dry-run` to see that report and write nothing.
221+
222+
**How it picks the tracks.** Names first, because that is what you already told it
223+
and the answer is explainable — `classifyAudioName` in core, the same classifier
224+
Studio's own picker uses, so the two cannot disagree. A track whose id or filename
225+
looks like music (`music`, `bgm`, `bed`, `score`…) is the bed; everything else that
226+
plays over it and is not SFX-shaped is a voice. Audio elements are preferred: video
227+
counts only when no audio track is left to be the voice, or every B-roll clip in the
228+
composition would read as somebody talking. **It refuses when it cannot tell which
229+
track is the bed** rather than carving the wrong one — typing one id is cheap.
223230

224231
Same analysis functions as the panel, so the result is identical. Needs `ffmpeg`
225232
on PATH and `@hyperframes/core` installed in the project (`npm i -D

skills/hyperframes-audio/references/attributes.md

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,18 @@ worklet effects (`compressor`, `limiter`, `gate`, `bitcrush`) have none at all.
7070
## `data-fx-carve` — the carve's settings
7171

7272
```json
73-
{ "source": "narration", "strength": 0.35, "dynamic": true }
73+
{ "enabled": true, "sources": ["narration", "interview-guest"], "strength": 0.35 }
7474
```
7575

76-
- `source` is the **element id of the voice track to listen to**. It lives on the
77-
bed being processed, not on the voice.
76+
- `sources` are the **element ids of every voice this bed makes room for**. They live
77+
on the bed being processed, not on the voices. Summed onto the bed's clock before
78+
the analysis, so one set of filters and envelopes covers all of them.
7879
- `strength` 0..1 derives the whole mechanism (see `carveProfile`).
79-
- `dynamic` follows the voice moment to moment instead of holding one depth.
80+
- There is no `dynamic`: a carve always follows the speech.
81+
- `enabled` is whether the carve applies. It exists because a bed with exactly one
82+
candidate voice is carved by default: with "off" represented by an absent
83+
attribute, switching it off would read as never-configured and the default would
84+
put it back. `enabled: false` keeps the settings and stops the carve.
8085

8186
This attribute is not read at playback — the chain and lanes it produced are what
8287
play. It exists so the settings can be read back and re-derived rather than
@@ -85,4 +90,6 @@ carve possible.
8590

8691
Older projects may carry the six mechanism numbers (`maxCutDb`, `bands`, `q`,
8792
`intelligibilityBias`, `duckDb`, `headroomDb`) instead of `strength`. They still
88-
load: the depth maps back onto a strength and everything else is re-derived.
93+
load: the depth maps back onto a strength and everything else is re-derived. A
94+
stored carve with no `enabled` reads as on, and a single `source` reads as a one-voice
95+
`sources` list. A stored `dynamic` is ignored — every carve follows the speech now.

0 commit comments

Comments
 (0)