> ## Documentation Index
> Fetch the complete documentation index at: https://docs.videodb.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Audio Asset Layering

> Layer music and voiceover audio over video and build practical mixes with AudioAsset.

<a href="https://colab.research.google.com/github/video-db/videodb-cookbook/blob/main/editor/feature/audio_asset_layering.ipynb" target="_blank">
  <img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab" noZoom />
</a>

`AudioAsset` adds an audio file from your VideoDB collection to an Editor composition. Use it with `VideoAsset.volume` when the visual source and its original audio need separate treatment.

The focused snippets below assume `conn`, `video`, and the named audio assets already exist. See [Timeline Architecture](/pages/act/programmable-editing/timeline-architecture) for complete setup and [Trimming Vs Timing](/pages/act/programmable-editing/trimming-vs-timing) for the `AudioAsset` fields.

## Add background music

Place a video clip and a music clip at the same timeline position to combine their audio.

<CodeGroup>
  ```python Python theme={null}
  from videodb.editor import AudioAsset, Clip, Timeline, Track, VideoAsset

  timeline = Timeline(conn)
  timeline.background = "#2B2B2B"

  video_clip = Clip(
      asset=VideoAsset(id=video.id, volume=1.0),
      duration=10,
  )
  music_clip = Clip(
      asset=AudioAsset(id=music.id, volume=0.1),
      duration=10,
  )

  track = Track()
  track.add_clip(0, video_clip)
  track.add_clip(0, music_clip)
  timeline.add_track(track)
  stream_url = timeline.generate_stream()
  ```

  ```javascript Node.js theme={null}
  import { Clip, EditorAudioAsset, EditorTimeline, EditorVideoAsset, Track } from 'videodb';

  const timeline = new EditorTimeline(conn);
  timeline.background = "#2B2B2B";

  const videoClip = new Clip({
    asset: new EditorVideoAsset({ id: video.id, volume: 1.0 }),
    duration: 10,
  });
  const musicClip = new Clip({
    asset: new EditorAudioAsset({ id: music.id, volume: 0.1 }),
    duration: 10,
  });

  const track = new Track();
  track.addClip(0, videoClip);
  track.addClip(0, musicClip);
  timeline.addTrack(track);
  const streamUrl = await timeline.generateStream();
  ```
</CodeGroup>

<video controls width="100%">
  <source src="https://play.videodb.io/v1/bdbddd4a-76d9-48cb-b366-8f5ffccec515.m3u8" type="application/x-mpegURL" />
</video>

## Layer voiceover and music

Mute the source video when the mix should consist only of narration and music. The levels below are examples from the notebook, not universal requirements.

<CodeGroup>
  ```python Python theme={null}
  from videodb.editor import AudioAsset, Clip, Timeline, Track, VideoAsset

  timeline = Timeline(conn)
  timeline.background = "#2B2B2B"

  video_clip = Clip(
      asset=VideoAsset(id=video.id, volume=0),
      duration=10,
  )
  voiceover_clip = Clip(
      asset=AudioAsset(id=voiceover.id, volume=1.0),
      duration=10,
  )
  music_clip = Clip(
      asset=AudioAsset(id=music.id, volume=0.1),
      duration=10,
  )

  track = Track()
  track.add_clip(0, video_clip)
  track.add_clip(0, voiceover_clip)
  track.add_clip(0, music_clip)
  timeline.add_track(track)
  stream_url = timeline.generate_stream()
  ```

  ```javascript Node.js theme={null}
  import { Clip, EditorAudioAsset, EditorTimeline, EditorVideoAsset, Track } from 'videodb';

  const timeline = new EditorTimeline(conn);
  timeline.background = "#2B2B2B";

  const videoClip = new Clip({
    asset: new EditorVideoAsset({ id: video.id, volume: 0 }),
    duration: 10,
  });
  const voiceoverClip = new Clip({
    asset: new EditorAudioAsset({ id: voiceover.id, volume: 1.0 }),
    duration: 10,
  });
  const musicClip = new Clip({
    asset: new EditorAudioAsset({ id: music.id, volume: 0.1 }),
    duration: 10,
  });

  const track = new Track();
  track.addClip(0, videoClip);
  track.addClip(0, voiceoverClip);
  track.addClip(0, musicClip);
  timeline.addTrack(track);
  const streamUrl = await timeline.generateStream();
  ```
</CodeGroup>

<video controls width="100%">
  <source src="https://play.videodb.io/v1/b6129e14-5aaf-4d30-88cd-14f4c45f01e5.m3u8" type="application/x-mpegURL" />
</video>

The full [Audio Asset Layering notebook](https://colab.research.google.com/github/video-db/videodb-cookbook/blob/main/editor/feature/audio_asset_layering.ipynb) explores additional mixes and source combinations.
