Intermediate6 min readAudio

Why AI clips never cut together — and the stem-rescue score bed

Every AI video generator bakes the audio mix into the clip. When you cut generated clips together, the music jumps — the loudest “AI slop” tell. The fix is source separation: rescue the dialogue and effects, kill the music, lay one continuous score bed.

The problem

Watch any multi-clip AI video edit. The moment you cut from one clip to the next, the music changes. Not just in volume — the key shifts, the tempo resets, the instrumentation swaps. One clip has a cinematic string bed in D minor, the next has a synth pad in B♭ major. The edit screams “these clips were generated separately.”

The ear catches musical discontinuity before the eye catches visual seams. You can match-cut the frame perfectly, color-grade the clips to identical tone curves, stabilize the motion — and it still won’t read as one continuous piece if the music restarts at every cut.

Why it happens

AI video generators render audio per clip with no memory across generations. Each clip gets its own dialogue track, its own sound-effects layer, and its own music bed — mixed together into a single baked stereo file before you ever see it. The generator has no concept of the edit you’re building; it only knows how to render one clip at a time.

Music is the most continuous element in film grammar. In a traditionally scored film, the music bed runs unbroken under dozens of cuts. When every clip brings its own music that resets at every cut boundary, the grammar breaks. That discontinuity is the tell.

The fix — separate, rescue, replace

The fix is a three-move framework. For every clip in your edit:

  1. Separate — run the clip’s baked audio through source separation to get stems (dialogue, sound effects, music)
  2. Rescue — keep the dialogue and effects stems. They’re per-shot and should change at cuts. Those are the layers that ground the clip in its own world.
  3. Replace — kill the per-clip music stem and lay one continuous, controlled score bed (e.g., Suno or composed) under the whole edit. Music continuity across cuts is what hides the seams.

The recipe, in CLI form:

# 1. Extract the audio from the clip
ffmpeg -i clip.mp4 -vn -acodec pcm_s16le source.wav

# 2. Separate into stems
# Option A: Two-stem (dialogue vs everything else)
.venv-stems/bin/demucs --two-stems=vocals source.wav

# Option B: Four-stem (vocals/drums/bass/other)
.venv-stems/bin/demucs htdemucs source.wav

# Option C: Cinematic dialogue/music/effects (via audio-separator)
.venv-stems/bin/audio-separator source.wav --model_name <model>

# 3. Rebuild the mix: dialogue + effects, no music
ffmpeg -i dialogue.wav -i effects.wav \
  -filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" \
  rebuilt.wav

# 4. Lay your continuous score bed under the whole edit
# (in your NLE or via ffmpeg filter_complex)

# 5. Mux the new mix back under the video
ffmpeg -i clip.mp4 -i final_mix.wav \
  -c:v copy -c:a aac -strict experimental output.mp4

Every stem is a decision

Source separation gives you a control surface. Every stem is an independent decision point in a keep/replace matrix:

  • Dialogue — keep the clip’s own dialogue if it’s clean. Or replace it with a clean TTS/VO track while keeping the clip’s own sound effects. The separation lets you swap a flubbed line without losing the world-building ambience the generator gave you.
  • Effects — keep the clip’s generated effects if they sell the scene. Or swap them for library SFX if you need a specific footstep texture or door-slam that the generator didn’t nail.
  • Music — almost always kill and replace with one continuous bed. The baked-in music is what breaks continuity; replacing it is what hides the cuts.

The principle, said plainly

More control over each layer means less AI slop. The seams live in whichever layer you don’t control. If you leave the music baked in, the music is where the edit falls apart.

Mixing the bed

Once you’ve rebuilt the dialogue + effects mix and laid a continuous score bed underneath, the mixing discipline is standard film grammar:

  • Duck the score under dialogue — 6–10 dB attenuation while someone is speaking. The music is a bed, not a lead. If the viewer has to strain to hear the words, the mix is wrong.
  • Short crossfades on stem edits — 10–20ms crossfades at cut boundaries to avoid clicks when switching between dialogue stems from different clips. The ear forgives a tiny overlap; it doesn’t forgive a click.
  • One loudness-normalization pass — run the final mix through loudness normalization (e.g., ffmpeg loudnorm filter) so the whole piece sits at broadcast standard. Don’t normalize each clip individually; normalize the master.
  • Never restart the score at a cut — the score should run continuously from the first frame to the last, even if you fade it down under dialogue-heavy sections. Restarting the music is the tell you spent the whole technique trying to eliminate.

Where Hybrig stands

The tooling ships in the repo. The .venv-stems Python environment includes demucs 4.1.0 and audio-separator 0.47.0, both CLI-ready at .venv-stems/bin/demucs and .venv-stems/bin/audio-separator.

The technique was proven on the Willow mermaid shorts: /Users/jameshenrydeterjr/Hybrig/outputs/willow-stems/ contains source.wav split into dialogue.wav, effects.wav, and music.wav. We ran the separation, killed the baked-in music, laid a continuous Suno bed, and the cuts disappeared.

This is pipeline transparency. We don’t hide what’s under the hood. We ship the tools, show you the receipts, and tell you what works. The stem-rescue score bed is what makes AI video edits sound like films instead of tech demos.

Try it

The CLI recipe above is runnable today. Extract your clip’s audio, run it through demucs or audio-separator, rebuild the mix with dialogue + effects, lay a continuous score bed, mux it back.