Skip to content

Production-ready UVR5 CLI & Docker image. Run SOTA separation models (Roformer, SCNet, MDX, Demucs, VR Architecture) on headless GPU servers without dependency hell.

License

Notifications You must be signed in to change notification settings

chyinan/uvr-headless-runner

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UVR Headless Runner

🎧 Separate vocals, instruments, drums, bass & more from any audio

Command-line audio source separation powered by UVR

License: MIT Python 3.9+ PyTorch Platform PyPI

🇨🇳 中文 | 🇬🇧 English | 🐳 Docker


✨ Features

🎸 MDX-Net Runner

  • MDX-Net / MDX-C models
  • Roformer (MelBandRoformer, BSRoformer)
  • SCNet (Sparse Compression Network)
  • ONNX & PyTorch checkpoints

🥁 Demucs Runner

  • Demucs v1 / v2 / v3 / v4
  • htdemucs / htdemucs_ft
  • 6-stem separation (Guitar, Piano)
  • Auto model download

🎤 VR Runner

  • VR Architecture models
  • VR 5.1 model support
  • Window size / Aggression tuning
  • TTA & Post-processing

🚀 Highlights

Feature Description
🎯 GUI-IdenticalExactly replicates UVR GUI behavior
GPU AcceleratedNVIDIA CUDA & AMD DirectML support
🔧 Zero ConfigAuto-detect model parameters
📦 Batch ReadyPerfect for automation & pipelines
🎚️ Bit Depth Control16/24/32-bit PCM, 32/64-bit float
📥 Auto DownloadOfficial UVR model registry with auto-download
🛡️ Robust Error HandlingGPU fallback, retry, fuzzy matching
🔗 Unified CLIuvr mdx / uvr demucs / uvr vr — one command for all
📦 PyPI Readypip install uvr-headless-runner — instant setup

📖 Design Philosophy

Important

This project is a headless automation layer for Ultimate Vocal Remover.

It does NOT reimplement any separation logic.
It EXACTLY REPLICATES UVR GUI behavior — model loading, parameter fallback, and auto-detection.

✅ If a model works in UVR GUI, it works here — no extra config needed.


🤔 Why uvr-headless-runner?

Built for maximum flexibility. Load any custom model without waiting for upstream updates.

🎨 Full Custom Model Support

Directly load any .pth or .ckpt file.
Perfect for testing new finetunes or experimental models immediately.

🖥️ Headless & Remote Ready

Built for seamless integration into
web services or automation scripts.

👥 By Users, For Users

Designed by audio enthusiasts who
prioritize complete control and native UVR compatibility.


📋 Requirements

Component Requirement
Python 3.9.x (3.10+ not fully tested)
GPU NVIDIA CUDA or AMD DirectML (optional)
OS Windows / Linux / macOS

🔧 Installation

🚀 Option 1: pip install from PyPI (Recommended)
# Install from PyPI
pip install uvr-headless-runner

# GPU support (NVIDIA)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

# ONNX GPU (optional)
pip install onnxruntime-gpu

After installation, you get the uvr unified CLI — no need to clone the repo!

uvr mdx -m "UVR-MDX-NET Inst HQ 3" -i song.wav -o output/
uvr demucs -m htdemucs -i song.wav -o output/
uvr vr -m "UVR-De-Echo-Normal" -i song.wav -o output/
📦 Option 2: Poetry (from source)
# Clone repository
git clone https://github.com/chyinan/uvr-headless-runner.git
cd uvr-headless-runner

# Install dependencies
poetry install

# GPU support (NVIDIA)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

# ONNX GPU (optional)
pip install onnxruntime-gpu
📦 Option 3: pip + venv (from source)
# Clone repository
git clone https://github.com/chyinan/uvr-headless-runner.git
cd uvr-headless-runner

# Create virtual environment
python -m venv venv
source venv/bin/activate  # Linux/macOS
# venv\Scripts\activate   # Windows

# Install dependencies
pip install -r requirements.txt

# GPU support (NVIDIA)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
🔴 AMD GPU (DirectML)
# Install DirectML support
pip install torch-directml

# Use with --directml flag
python mdx_headless_runner.py -m model.ckpt -i song.wav -o output/ --directml

⚠️ DirectML is experimental. NVIDIA CUDA recommended for best performance.

✅ Verify Installation (Native Python Only)

python -c "import torch; print(f'PyTorch: {torch.__version__}'); print(f'CUDA: {torch.cuda.is_available()}')"

💡 Skip this if using Docker - the container includes all dependencies.

🐳 Option 4: Docker Hub (No Build Required!)

Fastest way to get started - just pull and run!

# Pull pre-built image from Docker Hub
docker pull chyinan/uvr-headless-runner:latest

# Run directly (GPU mode)
docker run --rm --gpus all \
  -v ~/.uvr_models:/models \
  -v $(pwd):/data \
  chyinan/uvr-headless-runner:latest \
  uvr-mdx -m "UVR-MDX-NET Inst HQ 3" -i /data/song.wav -o /data/output/

# Run directly (CPU mode)
docker run --rm \
  -v ~/.uvr_models:/models \
  -v $(pwd):/data \
  chyinan/uvr-headless-runner:latest \
  uvr-mdx -m "UVR-MDX-NET Inst HQ 3" -i /data/song.wav -o /data/output/ --cpu

Or install CLI wrappers for native experience:

# One-click install (auto-detects GPU)
./docker/install.sh      # Linux/macOS
.\docker\install.ps1     # Windows

# Then use like native commands
uvr-mdx -m "UVR-MDX-NET Inst HQ 3" -i song.wav -o output/
uvr-demucs -m htdemucs -i song.wav -o output/
uvr-vr -m "UVR-De-Echo-Normal" -i song.wav -o output/

📖 Full Docker Guide →


🎼 Quick Start

Unified CLI (pip install / Docker)

After installing via pip install uvr-headless-runner or Docker, you can use the short commands:

# MDX-Net / Roformer separation
uvr mdx -m "UVR-MDX-NET Inst HQ 3" -i song.wav -o output/ --gpu

# Demucs separation
uvr demucs -m htdemucs -i song.wav -o output/ --gpu

# VR Architecture separation
uvr vr -m "UVR-De-Echo-Normal" -i song.wav -o output/ --gpu

# List all available models
uvr list all

# Download a model
uvr download "UVR-MDX-NET Inst HQ 3" --arch mdx

# Show system info
uvr info

💡 You can also use standalone commands: uvr-mdx, uvr-demucs, uvr-vr

MDX-Net / Roformer / SCNet

# Basic separation
python mdx_headless_runner.py -m "model.ckpt" -i "song.flac" -o "output/" --gpu

# Vocals only (24-bit)
python mdx_headless_runner.py -m "model.ckpt" -i "song.flac" -o "output/" --gpu --vocals-only --wav-type PCM_24

Demucs

# All 4 stems
python demucs_headless_runner.py --model htdemucs --input "song.flac" --output "output/" --gpu

# Vocals only
python demucs_headless_runner.py --model htdemucs --input "song.flac" --output "output/" --gpu --stem Vocals --primary-only

VR Architecture

# Basic separation (model in database)
python vr_headless_runner.py -m "model.pth" -i "song.flac" -o "output/" --gpu

# Custom model (not in database)
python vr_headless_runner.py -m "model.pth" -i "song.flac" -o "output/" --gpu \
    --param 4band_v3 --primary-stem Vocals

📥 Model Download Center

All runners now include automatic model downloading from official UVR sources - just like the GUI!

List Available Models

# List all MDX-Net models
python mdx_headless_runner.py --list

# List only installed models
python mdx_headless_runner.py --list-installed

# List models not yet downloaded
python mdx_headless_runner.py --list-uninstalled

# Same for Demucs and VR
python demucs_headless_runner.py --list
python vr_headless_runner.py --list

Download Models

# Download a specific model (without running inference)
python mdx_headless_runner.py --download "UVR-MDX-NET Inst HQ 3"
python demucs_headless_runner.py --download "htdemucs_ft"
python vr_headless_runner.py --download "UVR-De-Echo-Normal by FoxJoy"

Auto-Download on Inference

# Just use the model name - it will download automatically if not installed!
python mdx_headless_runner.py -m "UVR-MDX-NET Inst HQ 3" -i "song.flac" -o "output/" --gpu

# Demucs models auto-download too
python demucs_headless_runner.py --model htdemucs_ft --input "song.flac" --output "output/" --gpu

Model Info & Fuzzy Matching

# Get detailed info about a model
python mdx_headless_runner.py --model-info "UVR-MDX-NET Inst HQ 3"

# Typo? Get suggestions!
python mdx_headless_runner.py --model-info "UVR-MDX Inst HQ"
# Output: Did you mean: UVR-MDX-NET Inst HQ 1, UVR-MDX-NET Inst HQ 2, ...

Features

Feature Description
🌐 Official Registry Syncs with UVR's official model list
🔄 Resume Downloads Interrupted downloads can be resumed
⏱️ Retry with Backoff Automatic retry on network errors
💾 Disk Space Check Pre-checks available space before download
🔍 Fuzzy Matching Suggests similar model names on typos
Integrity Check Validates downloaded files

🛡️ Error Handling & GPU Fallback

All runners include robust error handling with automatic GPU-to-CPU fallback:

# If GPU runs out of memory, automatically falls back to CPU
python mdx_headless_runner.py -m "model.ckpt" -i "song.flac" -o "output/" --gpu

# Output on GPU error:
# ============================================================
# ERROR: GPU memory exhausted
# ============================================================
# Suggestion: Try: (1) Use --cpu flag, (2) Reduce --batch-size...
#
# Attempting to fall back to CPU mode...

Error Messages

Errors now include clear explanations and suggestions:

Before After
FileNotFoundError Audio file not found: song.wav
CUDA out of memory GPU memory exhausted. Try: --cpu or reduce --batch-size
Model not found Model 'xyz' not found. Did you mean: UVR-MDX-NET...?

📊 CLI Progress Display

All runners feature a professional CLI progress system with real-time feedback:

╭──────────────────────────────────────────────────────────────────────────╮
│                          UVR Audio Separation                            │
├──────────────────────────────────────────────────────────────────────────┤
│  Model         │ UVR-MDX-NET Inst HQ 3                                   │
│  Input         │ song.flac                                               │
│  Output        │ ./output/                                               │
│  Device        │ CUDA:0                                                  │
│  Architecture  │ MDX-Net                                                 │
╰──────────────────────────────────────────────────────────────────────────╯

⠹ Downloading model: UVR-MDX-NET Inst HQ 3
  ████████████████████████████████████████ 100% • 245.3 MB • 12.5 MB/s • 0:00:00

✓ Model downloaded

⠹ Running inference
  ████████████████░░░░░░░░░░░░░░░░░░░░░░░░  42% • 0:01:23 • 0:01:52

✓ Inference complete

╭──────────────────────────────────────────────────────────────────────────╮
│              ✓ Processing completed in 3:15                              │
╰──────────────────────────────────────────────────────────────────────────╯

Output files:
  • output/song_(Vocals).wav
  • output/song_(Instrumental).wav

Features

Feature Description
📥 Download Progress Real-time speed, ETA, and transfer stats for model downloads
🎯 Inference Progress Chunk-based progress tracking during audio processing
⏱️ Time Estimates Elapsed time and remaining time (ETA) display
🎨 Rich Output Beautiful terminal UI with rich library
🐳 Docker Compatible Works seamlessly inside containers
📉 Graceful Fallback Falls back to basic output if rich unavailable

Progress Library Support

The system automatically selects the best available library:

  1. rich (preferred) - Full-featured progress bars with colors
  2. tqdm (fallback) - Standard progress bars
  3. Basic (no deps) - Simple text-based progress

Install rich for the best experience:

pip install rich

Quiet Mode

Disable progress output for scripting:

python mdx_headless_runner.py -m model.ckpt -i song.wav -o output/ --quiet

🎛️ MDX-Net Runner

Command Line Arguments

Argument Short Default Description
--model -m Required Model file path (.ckpt/.onnx)
--input -i Required Input audio file
--output -o Required Output directory
--gpu Auto Use NVIDIA CUDA
--directml Use AMD DirectML
--overlap 0.25 MDX overlap (0.25-0.99)
--overlap-mdxc 2 MDX-C/Roformer overlap (2-50)
--wav-type PCM_24 Output: PCM_16/24/32, FLOAT, DOUBLE
--vocals-only Output vocals only
--instrumental-only Output instrumental only
📋 All Arguments
Argument Description
--name -n Output filename base
--json Model JSON config
--cpu Force CPU
--device -d GPU device ID
--segment-size Segment size (default: 256)
--batch-size Batch size (default: 1)
--primary-only Save primary stem only
--secondary-only Save secondary stem only
--stem MDX-C stem select
--quiet -q Quiet mode

Examples

# Roformer with custom overlap
python mdx_headless_runner.py \
    -m "MDX23C-8KFFT-InstVoc_HQ.ckpt" \
    -i "song.flac" -o "output/" \
    --gpu --overlap-mdxc 8

# 32-bit float output
python mdx_headless_runner.py \
    -m "model.ckpt" -i "song.flac" -o "output/" \
    --gpu --wav-type FLOAT

🥁 Demucs Runner

Supported Models

Model Version Stems Quality
htdemucs v4 4 ⭐⭐⭐
htdemucs_ft v4 4 ⭐⭐⭐⭐ Fine-tuned
htdemucs_6s v4 6 ⭐⭐⭐⭐ +Guitar/Piano
hdemucs_mmi v4 4 ⭐⭐⭐
mdx_extra_q v3 4 ⭐⭐⭐

Command Line Arguments

Argument Short Default Description
--model -m Required Model name or path
--input -i Required Input audio file
--output -o Required Output directory
--gpu Auto Use NVIDIA CUDA
--segment Default Segment size (1-100+)
--shifts 2 Time shifts
--stem Vocals/Drums/Bass/Other/Guitar/Piano
--wav-type PCM_24 Output bit depth
--primary-only Output primary stem only

Stem Selection

GUI Action CLI Command
All Stems (no --stem)
Vocals only --stem Vocals --primary-only
Instrumental only --stem Vocals --secondary-only

Examples

# 6-stem separation
python demucs_headless_runner.py \
    --model htdemucs_6s \
    --input "song.flac" --output "output/" \
    --gpu

# High quality with custom segment
python demucs_headless_runner.py \
    --model htdemucs_ft \
    --input "song.flac" --output "output/" \
    --gpu --segment 85

🎤 VR Architecture Runner

Command Line Arguments

Argument Short Default Description
--model -m Required Model file path (.pth)
--input -i Required Input audio file
--output -o Required Output directory
--gpu Auto Use NVIDIA CUDA
--directml Use AMD DirectML
--window-size 512 Window size (320/512/1024)
--aggression 5 Aggression setting (0-50+)
--wav-type PCM_16 Output: PCM_16/24/32, FLOAT, DOUBLE
--primary-only Output primary stem only
--secondary-only Output secondary stem only
📋 All Arguments
Argument Description
--name -n Output filename base
--param Model param name (e.g., 4band_v3)
--primary-stem Primary stem name (Vocals/Instrumental)
--nout VR 5.1 nout parameter
--nout-lstm VR 5.1 nout_lstm parameter
--cpu Force CPU
--device -d GPU device ID
--batch-size Batch size (default: 1)
--tta Enable Test-Time Augmentation
--post-process Enable post-processing
--post-process-threshold Post-process threshold (default: 0.2)
--high-end-process Enable high-end mirroring
--list-params List available model params

Model Parameters

When the model hash is not found in the database, you need to provide parameters manually:

# List available params
python vr_headless_runner.py --list-params

# Use custom params
python vr_headless_runner.py -m "model.pth" -i "song.flac" -o "output/" \
    --param 4band_v3 --primary-stem Vocals

# VR 5.1 model with nout/nout_lstm
python vr_headless_runner.py -m "model.pth" -i "song.flac" -o "output/" \
    --param 4band_v3 --primary-stem Vocals --nout 48 --nout-lstm 128

Examples

# High quality with TTA
python vr_headless_runner.py \
    -m "UVR-MDX-NET-Voc_FT.pth" \
    -i "song.flac" -o "output/" \
    --gpu --tta --window-size 1024

# Aggressive separation
python vr_headless_runner.py \
    -m "model.pth" -i "song.flac" -o "output/" \
    --gpu --aggression 15 --post-process

# 24-bit output
python vr_headless_runner.py \
    -m "model.pth" -i "song.flac" -o "output/" \
    --gpu --wav-type PCM_24

📁 Output Structure

output/
├── song_(Vocals).wav        # Vocals
├── song_(Instrumental).wav  # Instrumental (MDX)
├── song_(Drums).wav         # Drums (Demucs)
├── song_(Bass).wav          # Bass (Demucs)
├── song_(Other).wav         # Other (Demucs)
├── song_(Guitar).wav        # Guitar (6-stem)
└── song_(Piano).wav         # Piano (6-stem)

🐍 Python API

from mdx_headless_runner import run_mdx_headless
from demucs_headless_runner import run_demucs_headless
from vr_headless_runner import run_vr_headless

# MDX separation
run_mdx_headless(
    model_path='model.ckpt',
    audio_file='song.wav',
    export_path='output',
    use_gpu=True,
    verbose=True  # Print progress
)
# Output: output/song_(Vocals).wav, output/song_(Instrumental).wav

# Demucs separation (vocals only)
run_demucs_headless(
    model_path='htdemucs',
    audio_file='song.wav',
    export_path='output',
    use_gpu=True,
    demucs_stems='Vocals',  # or 'All Stems' for all
    primary_only=True,
    verbose=True
)
# Output: output/song_(Vocals).wav

# VR Architecture separation
run_vr_headless(
    model_path='model.pth',
    audio_file='song.wav',
    export_path='output',
    use_gpu=True,
    window_size=512,
    aggression_setting=5,
    is_tta=False,
    # For unknown models, provide params manually:
    # user_vr_model_param='4band_v3',
    # user_primary_stem='Vocals'
)
# Output: output/song_(Vocals).wav, output/song_(Instrumental).wav

💡 Note: Functions process audio and save to export_path. Check output directory for results.


🔍 Troubleshooting

❌ GPU not detected
# Check CUDA
python -c "import torch; print(torch.cuda.is_available())"

# Reinstall PyTorch with CUDA
pip uninstall torch torchvision torchaudio
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
❌ Model not found

Option 1: Use automatic download (recommended)

# List available models
python mdx_headless_runner.py --list

# Download the model
python mdx_headless_runner.py --download "UVR-MDX-NET Inst HQ 3"

# Or just use it - auto-downloads!
python mdx_headless_runner.py -m "UVR-MDX-NET Inst HQ 3" -i song.wav -o output/

Option 2: Manual download

Default locations:

  • MDX: ./models/MDX_Net_Models/
  • Demucs: ./models/Demucs_Models/v3_v4_repo/
  • VR: ./models/VR_Models/
❌ Network/Download errors
# Force refresh model registry
python model_downloader.py --sync

# Check network connectivity
python -c "import urllib.request; urllib.request.urlopen('https://github.com')"

The downloader includes:

  • Automatic retry (3 attempts with exponential backoff)
  • Resume interrupted downloads
  • Fallback to cached registry
❌ VR model hash not found

If your VR model isn't in the database, provide parameters manually:

# List available params
python vr_headless_runner.py --list-params

# Specify param and primary stem
python vr_headless_runner.py -m "model.pth" -i "song.wav" -o "output/" \
    --param 4band_v3 --primary-stem Vocals

Common params: 4band_v3, 4band_v2, 1band_sr44100_hl512, 3band_44100

❌ Poor output quality
  • Try increasing --overlap or --overlap-mdxc
  • For Demucs, increase --segment (e.g., 85)
  • Ensure correct model config with --json

🙏 Acknowledgments

UVR
Anjok07 & aufr33
Demucs
Facebook Research
MDX-Net
Woosung Choi
VR Architecture
tsurumeso

Special thanks to ZFTurbo for MDX23C & SCNet.


📄 License

MIT License

Copyright (c) 2022 Anjok07 (Ultimate Vocal Remover)
Copyright (c) 2026 UVR Headless Runner Contributors

View Full License


Contributing & Support

Pull Requests and Issues are welcome! Whether it's bug reports, feature suggestions, or code contributions, we greatly appreciate them all.

If you find this project helpful, please give us a Star ⭐ - it's the best support for us!


Made with ❤️ for the audio separation community

About

Production-ready UVR5 CLI & Docker image. Run SOTA separation models (Roformer, SCNet, MDX, Demucs, VR Architecture) on headless GPU servers without dependency hell.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published