Put music under Gemini Omni's native audio: detach, spine, duck

Omni clips always carry native audio on Sume. Detach it to a wav, use it as the Timeline spine, add a music soundtrack with duck_db. Calls and limits.

5 min readSume
All posts

Gemini Omni Flash 1.1 on Sume always returns native synced audio, and you cannot turn it off. To lay music under that sound, detach the clip's audio to a wav with audio-detach, pass the wav as the audio.url spine of a Timeline 1.0 render, and add a soundtrack with duck_db so the music dips when the clip's sound is present.

Why does the spine matter?

The Timeline docs describe the audio spine as the output's audio and its length. The soundtrack is an optional bed on top, with gain_db, loop, fade_out_seconds up to 10 and duck_db from 0 to 20. The docs state that duck_db needs a real spine and not silence, and the refusal is duck_requires_audio_spine.

That is the whole reason to detach. If you put the Omni clip in video[] with a silent spine, the music has nothing to duck under, and the clip's own audio is not carried over. The Video Router page says Omni's audio is always on and generate_audio: false is rejected, so a clip with sound is what you start from.

Step 1: detach the clip's audio

Audio detach takes a media.sume.com video and returns a new audio artifact, wav by default. The public rate is $0.01 per job. A clip with no audio track fails with detach_source_has_no_audio; Omni clips should have one, but check probe.has_audio with a probe-only video inspect if you are unsure.

curl -X POST https://api.sume.com/v1/audio-detach \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: detach-omni-001" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/omni-clip.mp4",
    "mode": "sync"
  }'

Step 2: render with a ducked music bed

Read audio_url and duration_seconds from the detach result, then render. Here a 10-second Omni clip is the only video slot, the wav is the spine, and a music file sits under it at lower gain with a 2-second fade-out. Output width and height are set to keep a 16:9 clip landscape, because the default output is 1080 by 1920.

Pick duck_db by ear in the 0 to 20 range; there is no documented perfect value. The soundtrack.url must be a Sume-hosted file.

curl -X POST https://api.sume.com/v1/timeline-1.0/render \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: omni-music-001" \
  -d '{
    "audio": { "url": "https://media.sume.com/artifacts/artf_demo/omni-clip-audio.wav", "duration_seconds": 10 },
    "video": [ { "source_url": "https://media.sume.com/artifacts/artf_demo/omni-clip.mp4", "start": 0, "duration": 10 } ],
    "soundtrack": { "url": "https://media.sume.com/artifacts/artf_demo/bed.mp3", "gain_db": -12, "duck_db": 8, "fade_out_seconds": 2 },
    "output": { "width": 1920, "height": 1080 }
  }'

What are the limits?

Timeline bills $0.10 per ceil output minute, so a 10-second render costs one minute's rate, and audio detach adds a cent. Together that is cheap next to the clip itself. Sume does not clean the clip's audio, remix its dialogue, or generate the music in this call; for a bed you can generate one with the music tools and import it first.

Omni clips run at 24 fps per Google's description in the 24 fps notes; if you leave output.fps off, Timeline renders at the rate the sources already run at. See Jobs and results to wait for both jobs.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume