sound_fx
Places social-media-style sound effects as non-destructive audio clips on a dedicated timeline level, using a two-phase pipeline: LLM moment detection + deterministic rules-based matching.
Overview
sound_fx runs two phases:
-
Moment detection (Phase 1): a single LLM completion reads your transcript and cut points, returning a structured list of narrative moments (hook, punchline, twist, etc.) with timestamps and energy scores.
-
Rules-based matching (Phase 2): a deterministic Go lookup table maps
(moment_type, energy, sfx_style)to specific SFX clips and volumes. No agentic loop, no randomness.
Sound effects are prepared the first time they are needed and reused after that. Where a CC0-licensed recording is available it is used; otherwise the effect is synthesized.
In the editor
Add it from the Library (Audio group), or with + add step and a search for sound_fx, after your cut and your transcript.
Under Inputs, add source, either a file input or a step input, whose length sets the bounds it works within. Add transcript as a step input as well: without it the step falls back to placing effects at the busiest edit points, which is much blunter than placing them where something is actually said. timeline as a step input tells it where your cuts are.
sfx_intensity is the setting to think about: surgical puts one or two effects on the real punchlines, balanced gives four to six, hyped covers everything. sfx_style picks the palette. hook_sfx puts a small sound at the very start if nothing else lands there. Point sfx_dir at a folder of your own sounds to override or extend the built-in ones.
Set Output Level to a level of its own, such as sfx. The effects arrive as their own clips there in the run timeline, leaving your original audio untouched, so anything you dislike can simply be deleted.
Example
- id: sfx
processor: sound_fx
input:
- id: source
step: recorder
- id: transcript
step: transcript
- id: timeline
step: main_edit
output:
timeline: sfx
params:
sfx_intensity: balanced
sfx_style: tiktok
Inputs
| ID | Required | Type | Description |
|---|---|---|---|
source |
yes | file or step | Audio or video file whose duration sets the timeline bounds |
transcript |
no | Analysis | Word-timed transcript: enables Phase 1 LLM moment detection |
timeline |
no | EditDecisions | A timeline level to extract cut points from |
Parameters
| Param | Type | Default | Description |
|---|---|---|---|
sfx_intensity |
string | "balanced" |
surgical (1–2 SFX, punchlines/twists only), balanced (4–6, default), hyped (8–12, all moment types) |
sfx_style |
string | "tiktok" |
tiktok, explainer, meme, documentary: controls SFX palette |
hook_sfx |
bool | true |
Auto-insert a subtle SFX at T=0 when no moment is detected in the first 2s |
level |
string | "sfx" |
Timeline level for placed SFX clips |
sfx_dir |
string | none | Path to .wav/.mp3/.aac files that override or extend the built-in library |
prompt |
text | none | Additional context passed to the moment-detection LLM call |
Intensity Tiers
Controls which moment types are eligible:
| Tier | Moment types | surgical |
balanced |
hyped |
|---|---|---|---|---|
| 1 | punchline, twist | ✓ | ✓ | ✓ |
| 2 | hook, proof, cta | ✓ | ✓ | |
| 3 | setup, transition, callout | ✓ |
Special Behaviors
- Riser auto-pairing:
balanced/hypedautomatically places a riser before every punchline/twist - No-repeat rule: each SFX name used at most once per video
- Hook guarantee: if
hook_sfx: trueand no moment before 2s, insertspop_softat T=0 - Duration scaling: short clips (<20s) capped at 3 SFX; long clips (>45s) get a 1.5× ceiling
No-Transcript Fallback
When no transcript input is wired, Phase 1 is skipped. Phase 2 clusters edit cut points and places transition SFX at the 2–3 most prominent clusters.
SFX Library
30 built-in categories, synthesized or sourced from CC0-licensed audio:
whoosh, whoosh_down, whoosh_short, impact, impact_deep, impact_metal, riser, riser_short, riser_dark, ding, ding_double, coin, pop, pop_soft, glitch, glitch_long, swoosh_left, swoosh_right, zoom_in, zoom_out, rewind, typing, error, success, suspense, crowd_cheer, heartbeat, sparkle, bass_drop, record_scratch
User SFX Override
Point sfx_dir at a directory of .wav/.mp3/.aac files. Files named after a built-in SFX (e.g. whoosh.wav) replace the built-in version; unknown filenames are added as extras for the rules table to use.
Output
EditDecisions on the configured level. Each SFX clip:
Type:"audio"Placement.Position: timeline position from rules-based matchingTransforms.Volume: energy-scaled volume (0–1 linear)
Notes
- Phase 1 uses Puffin Ship's built-in AI (no API key required). Phase 2 is pure Go with no API calls.
- Original audio is unchanged: SFX clips sit on a separate lane.
- Each sound effect is prepared once and reused afterwards, so the step is fast after its first run.