Skip to main content

Overview

AudioPod AI’s Stem Separation API uses state-of-the-art AI models to separate mixed audio recordings into individual components (stems). Extract vocals, drums, bass, guitar, piano, and more from any song.

Key Features

  • Granular Separation: Single, two, four, six, eight(producer), twelve(studio), sixteen(mastering)
  • File Upload & URL Support: Process local files or YouTube/SoundCloud URLs
  • Quality Scores: Get AI-assessed quality metrics for each stem
  • Presigned Downloads: Direct S3 URLs for fast stem downloads

Installation

pip install audiopod

Authentication

Get your API key from the API Keys Dashboard.
from audiopod import AudioPod

client = AudioPod(api_key="ap_your_api_key")
# Or set AUDIOPOD_API_KEY environment variable

Separation Modes

ModeStemsOutputUse Case
single1Specified stem onlyVocal isolation, drum extraction
two2vocals + instrumentalKaraoke tracks
four4vocals, drums, bass, otherStandard remixing
six6+ guitar, pianoFull instrument separation
producer8+ kick, snare, hihatBeat production
studio12+ cymbals, sub_bass, synthProfessional mixing
mastering16Maximum detailForensic analysis

Quick Start

Six-Stem Separation

from audiopod import AudioPod

client = AudioPod(api_key="ap_your_api_key")

# Extract and wait for completion
result = client.stems.separate(
    url="https://youtube.com/watch?v=VIDEO_ID",
    mode="six"
)

# Download stems
print("Stems ready:")
for stem, url in result["download_urls"].items():
    print(f"  {stem}: {url[:60]}...")

Examples by Mode

Four-Stem Separation (Standard)

Extract vocals, drums, bass, and other.
from audiopod import AudioPod

client = AudioPod(api_key="ap_your_api_key")

result = client.stems.separate(
    url="https://youtube.com/watch?v=VIDEO_ID",
    mode="four"
)

print(f"Vocals: {result['download_urls']['vocals']}")
print(f"Drums: {result['download_urls']['drums']}")
print(f"Bass: {result['download_urls']['bass']}")
print(f"Other: {result['download_urls']['other']}")

Single Stem Extraction (Vocals Only)

from audiopod import AudioPod

client = AudioPod(api_key="ap_your_api_key")

# Extract only vocals
result = client.stems.separate(
    url="https://youtube.com/watch?v=VIDEO_ID",
    mode="single",
    stem="vocals"  # Options: vocals, drums, bass, guitar, piano, other
)

print(f"Vocals: {result['download_urls']['vocals']}")

Two-Stem Separation (Karaoke)

Separate vocals from instrumental.
from audiopod import AudioPod

client = AudioPod(api_key="ap_your_api_key")

result = client.stems.separate(
    url="https://youtube.com/watch?v=VIDEO_ID",
    mode="two"
)

# Returns: vocals + no_vocals (instrumental)
print(f"Vocals: {result['download_urls']['vocals']}")
print(f"Instrumental: {result['download_urls']['no_vocals']}")

Producer Mode (8 Stems with Drum Kit)

from audiopod import AudioPod

client = AudioPod(api_key="ap_your_api_key")

result = client.stems.separate(
    url="https://youtube.com/watch?v=VIDEO_ID",
    mode="producer"
)

# Returns: vocals, kick, snare, hihat, bass, guitar, piano, other
for stem, url in result["download_urls"].items():
    print(f"{stem}: {url[:60]}...")

Advanced Usage

Async Job Handling

For more control, use extract() and wait_for_completion() separately:
from audiopod import AudioPod

client = AudioPod(api_key="ap_your_api_key")

# Submit job (returns immediately)
job = client.stems.extract(
    url="https://youtube.com/watch?v=VIDEO_ID",
    mode="six"
)
print(f"Job submitted: {job['id']}")

# Do other work...

# Wait for completion when ready
result = client.stems.wait_for_completion(job["id"], timeout=600)

if result["status"] == "COMPLETED":
    print("Download URLs:")
    for stem, url in result["download_urls"].items():
        print(f"  {stem}: {url}")

Get Available Modes

from audiopod import AudioPod

client = AudioPod(api_key="ap_your_api_key")

modes = client.stems.modes()

print("Available modes:")
for m in modes["modes"]:
    print(f"  {m['mode']}: {m['description']} ({m['stem_count']} stems)")

Check Job Status

from audiopod import AudioPod

client = AudioPod(api_key="ap_your_api_key")

status = client.stems.status(5512)

print(f"Status: {status['status']}")

if status["status"] == "COMPLETED":
    print("Quality scores:")
    for stem, score in status["quality_scores"].items():
        print(f"  {stem}: {score:.2f}")

Response Format

Completed Job Response:
{
  "id": 5512,
  "status": "COMPLETED",
  "source_type": "URL",
  "stem_paths": {
    "vocals": "stems/5512/vocals.wav",
    "drums": "stems/5512/drums.wav",
    "bass": "stems/5512/bass.wav",
    "guitar": "stems/5512/guitar.wav",
    "piano": "stems/5512/piano.wav",
    "other": "stems/5512/other.wav"
  },
  "quality_scores": {
    "vocals": 0.64,
    "drums": 0.35,
    "bass": 0.87,
    "guitar": 0.38,
    "piano": 0.0,
    "other": 0.36
  },
  "download_urls": {
    "vocals": "https://audiopod-new.s3-accelerate.amazonaws.com/...",
    "drums": "https://audiopod-new.s3-accelerate.amazonaws.com/...",
    "bass": "https://audiopod-new.s3-accelerate.amazonaws.com/...",
    "guitar": "https://audiopod-new.s3-accelerate.amazonaws.com/...",
    "piano": "https://audiopod-new.s3-accelerate.amazonaws.com/...",
    "other": "https://audiopod-new.s3-accelerate.amazonaws.com/..."
  },
  "completed_at": "2025-12-11T12:39:37.379848"
}

Pricing

Rate: $0.10 per minute of audio processed (all modes)
DurationCost
3 minutes$0.31
5 minutes$0.50
10 minutes$1.00
1 hour$6.00
Check your balance and usage at API Wallet.

Error Handling

from audiopod import AudioPod, InsufficientBalanceError, AuthenticationError

try:
    client = AudioPod(api_key="ap_...")
    result = client.stems.separate(url="...", mode="six")
except AuthenticationError:
    print("Invalid API key")
except InsufficientBalanceError as e:
    print(f"Need ${e.required_cents / 100:.2f}, have ${e.available_cents / 100:.2f}")
except ValueError as e:
    print(f"Invalid input: {e}")

Status Codes

StatusDescription
PENDINGJob queued, waiting for worker
PROCESSINGStem separation in progress
COMPLETEDSuccess - download URLs available
FAILEDError occurred - check error_message

Next Steps