
Audiolla
io.github.psyb0t由 GitHub 账号 psyb0t 发布v1.1.7更新于 Oct 27, 2026
Self-hosted MCP server: audio stems, mastering, MIR analysis, DSP, MIDI, speech tools.
概览
自托管的 Docker MCP 服务器,为助手提供音频工具:分轨、母带处理、音乐信息分析、MIDI 转录、修复与语音处理。
- 可以做什么
- 分离音轨、做母带处理,并修复音频(去混响、去回声、降噪、语音增强)
- 分析音频:BPM、调性、和弦、节拍、起音、旋律、段落、响度、静音、人声检测、说话人分离、声纹指纹
- 把音频转成 MIDI,并将 MIDI 渲染或检查回音频
- 变换音频(音高、速度、混响、均衡、增益)并做响度归一化
- 生成频谱图与波形图片,或频谱/波形视频
- 在 CUDA 主机上根据文字提示生成音乐与音效
- 适用场景
- 适合希望助手在本地完成音乐与语音音频处理、而不必自己写 Python 或调用托管 API 的场景:拆分音轨、查看调性与速度、把旋律转成 MIDI、清理人声录音,或生成频谱图。
- 运行要求
- 以本地 Docker 容器运行(声明为 stdio 传输,镜像 psyb0t/audiolla),在 8000 端口提供 HTTP 接口;需挂载卷保存模型缓存。文字生成音频的引擎需要 CUDA GPU。说话人分离需要 HuggingFace 账号、接受模型条款并设置 HF_TOKEN 环境变量。其余功能无需 API 密钥或账号。
安装
在 SourceWeft 中
- 打开 控制台中的 Audiolla,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
audiolla
[CI] [version] [license] [Docker Pulls]
Thirty audio engines. One port. Zero cloud. Fire-and-forget async jobs. Webhooks.
You needed Demucs for stems. Then librosa for BPM and key. Then basic-pitch for MIDI transcription. Then pyannote for speaker diarization. Then DeepFilterNet for speech enhancement. Then you spent three days debugging Python version conflicts and now you hate everything.
audiolla is what happens when you stop doing that.
Every audio processing tool worth using — wrapped in one HTTP API, running in one Docker container. POST a file. Get audio, JSON, or MIDI back. Drive it from curl, shell scripts, Python notebooks, Makefiles, or point an LLM agent at the MCP endpoint and let it rip.
No account. No subscription. No per-minute billing. No vendor lock-in. docker run and you're done.
What's in the box
Table of Contents
- Run it
- Quick start
- What it can do
- Split stems
- Master
- Analyze
- Beats, onsets, melody, segments
- Silence detection and trimming
- Visualize (spectrogram, waveform, video)
- Acoustic fingerprint
- De-reverb, de-echo, de-noise
- Audio-to-MIDI transcription
- Neural speech and vocal enhancement
- Chord and key detection
- Voice activity detection
- Speaker diarization
- Transform
- Loudness measurement
- Loudness curve
- Loudness normalization
- HPSS (harmonic/percussive split)
- Spectral noise reduction
- Time-stretch and pitch-shift
- Pitch correct
- Repair
- Audio tagging
- Audio embeddings
- Zero-shot classification
- Audio info
- Trim
- Mix
- Concat
- Speed
- Convert
- Similar
- MIDI quantize
- Fade
- Reverse
- Loop
- BPM match
- Stereo width
- Split
- Pan
- EQ
- Key match
- Sidechain duck
- Effects chain
- Loop point
- Compose MIDI
- Inspect MIDI
- Transform MIDI
- Render MIDI to audio
- Generate music from a spec
- Drum pattern
- Chords to MIDI
- Audio metadata tags
- Clip detection
- Mid/Side encode and decode
- Beat slice
- Convolution reverb
- Transient shaper
- Multiband compression
- DJ prep
- De-ess
- Stereo field analysis
- Audio thumbnail
- MIDI humanize
- Batch operations
- Async jobs and webhooks
- Stage files
- Remote URLs
- Engines
- Workflows — presets + pipeline
- API catalog
- Endpoints
- MCP
- Agent integrations
- Configuration
- What's not in here
- Build & dev
- Supply chain
- License
Run it
Demucs weights prefetch at container startup (for whichever variants are enabled) and cache in /data/torch_cache/. First boot downloads them; same -v mount next time and they're already there. Other engines (matchering, pedalboard, librosa, sox, fx, midi) have no weights — they're ready as soon as /healthz is green.
Migration from v0.23.x → v1.0.0
v1.0.0 is a breaking API release. Every existing client breaks. The new shape:
- Every audio endpoint takes a JSON body (no more
multipart/form-dataexcept at/v1/files) - Input is
file_path(FILES_DIR-relative) xorfile_url(server-side fetch). Pre-stage the file viaPUT /v1/files/{path}first. - Output requires
output_pathxoroutput_url. No more raw audio bytes in responses. - Async path:
async_job=trueauto-stages tojobs/{id}.{ext}if neither output is given. - MCP audio-producing tools dropped
audio_base64(andmidi_base64/image_base64/video_base64). Sameoutput_pathxoroutput_urlrequirement. openapi.yamlis now the contract — Pydantic models regenerate from it viamake generate. Never hand-editsrc/audiolla/schema/_generated.py.
Why? See the v1.0.0 CHANGELOG entry for the full rationale.
Quick start
Once the container is up, this is a complete audio pipeline in six commands (every audio endpoint is JSON-body now; stage your input file at /v1/files/... first):
Audio in. MIDI out. Chords detected. Speakers identified. De-noised. Re-synthesized. No Python environment to set up. No API keys. No account. Just HTTP.
What it can do
Output defaults to wav. Add "output_format":"mp3" to the JSON body to get mp3 instead (flac, opus, aac, pcm also work).
Every audio endpoint takes an application/json body. The only place multipart still lives is PUT /v1/files/{path} (raw bytes for staging an input file).
Input — every audio endpoint requires exactly one of:
file_path— path inside the/v1/filesstaging area (stage withPUT /v1/files/{path}first)file_url— remote URL the server fetches (disabled by default — see Remote URLs)
Output — audio-producing endpoints require exactly one of:
output_path— server writes to/v1/files/<path>, returns JSON{"path":..., "size":..., ...}output_url— server PUTs to a presigned URL, returns JSON{"url":..., "size":..., ...}
Analysis-only endpoints (those that return JSON data, e.g. /v1/audio/analyze, /v1/audio/loudness, /v1/audio/info) don't need output_path / output_url — the response is the result.
Split stems
Master
Analyze
Beats, onsets, melody, segments
Beat detection also generates a click-track file when click_track=true (set output_path to receive it) — handy for aligning a mix to a grid. Pass start_bpm=140 to seed the tracker when you already know the rough tempo (faster, more accurate). Melody can be exported as a single-track MIDI file via as_midi=true + output_path.
Silence detection and trimming
trim_mode=edges — chop leading + trailing silence only. trim_mode=all — remove every detected gap (compress a talk recording, tighten a loop). Without trim_mode, the response is JSON only: silent_ranges, non_silent_ranges, duration — and output_path / output_url is not required.
Visualize (spectrogram, waveform, video)
Visual output splits into two sub-namespaces by output type:
/image/spectrogram: produces a PNG (staged via output_path or PUT to output_url). Params: width, height, color (default intensity), scale (log/lin).
/image/waveform: produces a PNG. Params: width, height, color (default lime).
/video/{mode}: spectrum (scrolling FFT), waves (oscilloscope), cqt (constant-Q transform), freqs (bar-graph analyzer), volume (VU meter), vectorscope (stereo X/Y scope), phasemeter, histogram. Params: width, height, fps, container (mp4 default, webm).
Acoustic fingerprint
The base64 fingerprint string is compatible with the AcoustID lookup service.
De-reverb, de-echo, de-noise
AI audio restoration via UVR ecosystem models — BS-Roformer and MelBand Roformer. All three are unified under POST /v1/audio/restore/{engine}.
All support output_format, output_path, output_url. For DSP-based noise reduction (no GPU) use noise-reduce/noise-reduce.
UVR engines also work through /v1/audio/separate — uvr-vocal-bsr (BS-Roformer, SDR 13) and uvr-karaoke return vocal + instrumental stems like Demucs but often with higher quality.
Audio-to-MIDI transcription
Polyphonic audio-to-MIDI via Spotify's basic-pitch (ONNX backend, no TensorFlow). Play guitar, hum a melody, record a piano riff — get a MIDI file back with all the notes.
Optional params: onset_threshold (0–1, default 0.5), frame_threshold (0–1, default 0.3), minimum_note_length_ms (default 58), minimum_frequency / maximum_frequency (Hz, default unconstrained), multiple_pitch_bends (bool, default false), melodia_trick (bool, default true — helps with melodic content). Default engine: basic-pitch.
The MIDI file is piped straight into /v1/midi/inspect or /v1/midi/render — audio → MIDI → audio is a complete round-trip.
Neural speech and vocal enhancement
DeepFilterNet DF3 — deep learning noise suppression trained on speech. Better than broadband de-noise for voice recordings; more surgical than UVR's de-noise on vocals specifically.
Supports output_format, output_path, output_url.
Generate music + SFX
Text-to-audio generation under POST /v1/audio/generate/{engine}. v1.0.0 ships five engines spanning music + sound effects, with different licence / VRAM / sound profiles — all CUDA-only.
Engine details:
All engines support async_job=true, webhook_url, output_path, output_url, and seed for reproducibility. stable-audio-open and audioldm2 additionally accept num_inference_steps (trade quality for speed). Model weights download on first call to HF_HOME (default /data/hf inside the container — ~7 GB across all five). Subsequent calls are inference-only. All five are flagged cuda_only — non-CUDA hosts get HTTP 400.
Licence opt-in for MusicGen. MusicGen weights are CC-BY-NC 4.0. The engine code ships with the image but refuses to load the model unless the operator explicitly sets AUDIOLLA_ENABLE_NONCOMMERCIAL=1 in the server's environment. Same pattern matchering (GPL v3) follows — licence-encumbered code in the image, conscious opt-in to actually use it. Read the MusicGen weights licence before opting in. AudioLDM 2 is CC-BY 4.0 (commercial use allowed, no opt-in gate) — it's the only generator in this set that's commercial-safe without flipping any flags.
Deferred to a future release (researched but not shipped in v1.0.0):
- ACE-Step v1 (3.5B, Apache 2.0, full songs with vocals up to 4 min) — requires
AceStepPipelinefromdiffusers>=0.38, which itself requires a pre-releasesafetensors. Doesn't pass the project's hash-locked supply-chain gate. Revisit whensafetensors 0.8.xships stable, or vendor ACE-Step's pipeline directly. - DiffRhythm full v1.2 (Apache 2.0) — unpackaged research repo (no
setup.py/ PyPI release). Revisit when upstream ships a package or we vendor underthirdparty/. - Stable Audio Open Small (Stability Community Licence, 11 s SFX-specialist) — requires
stable-audio-toolswhich pinspython >=3.10, <3.11; audiolla is on Python 3.12, hard incompatibility. Revisit whenstable-audio-toolswidens the Python constraint or diffusers grows a pipeline for it. - TangoFlux (ICLR 2026, 44.1 kHz, 30 s, fast) — git-only install (no PyPI package). Could be SHA-pinned in the hash-locked supply chain; deferred for now to keep the heavy-deps stack PyPI-only.
- AudioGen (Meta, CC-BY-NC) —
audiocraft==1.3.0pinstransformers<=4.31.0, hard conflict with audiolla's 4.51.3. Would require an isolated subprocess / sidecar container. - YuE 7B (Apache 2.0, full songs with vocals) — needs 16-24 GB VRAM at fp16, doesn't fit 12 GB GPUs without int4 quant tooling.
Chord and key detection
Krumhansl-Schmuckler key estimation + chroma-template chord segmentation via librosa. No extra deps beyond the librosa stack.
Optional params: hop_length (default 512), segment_min_duration_sec (default 0.5 — merge very short chord segments).
Voice activity detection
silero-vad — ONNX-based VAD, fast and accurate on both speech and music. Returns timestamped speech and non-speech segments.
Optional params: threshold (0–1, default 0.5), min_speech_duration_ms (default 250), min_silence_duration_ms (default 100).
Speaker diarization
pyannote/speaker-diarization-3.1 — state-of-the-art speaker diarization from HuggingFace Hub. Returns per-speaker timestamped segments and speaker count.
Note: This engine requires a HuggingFace account. You must accept the model terms at https://huggingface.co/pyannote/speaker-diarization-3.1 and then set
HF_TOKEN(or the older aliasHUGGINGFACE_TOKEN— the entrypoint mirrors them both ways) when starting the container. A read-only token with model access is enough. The same token also unlocks the gated text-to-audio engines (stable-audio-open,musicgen-small,musicgen-medium) provided you've accepted their licences on huggingface.co.
Optional params: num_speakers (exact count hint), min_speakers, max_speakers.
Transform
Loudness measurement
Loudness curve
RMS envelope over time — returns a list of {time_sec, rms_db} points. Useful for generating gain automation curves, finding loud and quiet sections, or visualising dynamic range before mastering.
Response fields: curve (array of {time_sec, rms_db}), duration (seconds), sample_rate, points (total curve length). Optional param: hop_length (default 512).
Loudness normalization
target_lufs is required. The response JSON carries loudness_lufs with the measured pre-normalization level alongside path / url / size.
HPSS (harmonic/percussive split)
Median-filter harmonic/percussive source separation via librosa. Harmonic = tonal content (pitched instruments, pads); percussive = transients (drums, percussion). No ML — pure DSP, fast, no GPU needed.
Params: margin (default 1.0 — ≥1.0, higher = more aggressive), kernel_size (default 31 — odd int, median filter width), output_format (default wav).
Spectral noise reduction
Noise reduction with two engine options under the same endpoint — pick DSP for no-GPU fast cleanup or ML for higher-quality removal.
DSP params (only apply to noise-reduce engine): stationary (bool, default false), prop_decrease (0–1, default 1.0). Both engines accept output_format, output_path, output_url.
Time-stretch and pitch-shift
Independent tempo factor and semitone offset via librosa phase vocoder. Slow a track down to learn it; shift a vocal up 3 semitones for a different key; transpose a MIDI melody to a different register first, then render.
Params: tempo_factor (default 1.0 — 0.5 = half speed), pitch_semitones (default 0.0 — ±semitones), output_format, output_path.
Pitch correct
Auto-tune audio toward the nearest chromatic semitone using librosa's phase vocoder. Full strength=1.0 snaps hard to pitch; lower values blend the corrected and original signal.
Params: strength (0.0–1.0, default 1.0), output_format, output_path, async_job, webhook_url. Requires librosa-analyze engine.
Repair
Declip clipped peaks and/or remove power-line hum. Declipping uses cubic interpolation to reconstruct flattened waveform tops and bottoms. Dehumming applies a notch filter at hum_freq (and harmonics).
Params: declip (bool, default true), dehum (bool, default false), hum_freq (Hz, default 50.0), output_format, output_path, async_job, webhook_url.
Audio tagging
Top-K AudioSet class label classification via Audio Spectrogram Transformer (MIT/ast-finetuned-audioset-10-10-0.4593). Identifies what's in a recording — music, speech, specific instruments, environmental sounds, etc.
Requires the HF model cache. First run downloads the weights to /data/hf/. Optional: top_k (default 10).
The image defaults to
HF_HUB_OFFLINE=0so first call lazy-downloads the weights into/data/hf/. For locked-down deployments (no egress), prefetch the model withhuggingface-cli download <model>into a mounted/data/hfvolume, then start the container with-e HF_HUB_OFFLINE=1.
Audio embeddings
512-dimensional L2-normalized audio embeddings via LAION CLAP (laion/larger_clap_music_and_speech). Useful for semantic audio search, similarity scoring, and clustering.
similarity is cosine similarity in [-1, 1]. Requires HF model cache — same first-run download caveat as audio tagging.
Zero-shot classification
Given audio and a list of free-form text labels, return cosine similarity scores for each using the existing CLAP model. No extra model download — uses the same clap-embed engine. Works for genres, moods, instruments, sonic descriptors — anything CLAP understands.
Results are sorted by descending score. Scores are cosine similarities in [-1, 1] — higher = more similar. Requires clap-embed model cache.
Audio info
Probe any audio file for metadata without loading it into memory for processing. Uses ffprobe — handles any format.
Trim
Cut a precise time range out of any audio file. Common use: extract a chorus, clip a sample, chop a stem at bar boundaries.
start_sec defaults to 0. end_sec is required and must be greater than start_sec. Supports all standard output_format values.
Mix
Combine multiple staged or URL-accessible tracks into one. Per-track gain_db lets you balance levels before mixing. Useful for bouncing separated stems back together at custom levels, layering synth parts, or combining click-track + music.
tracks is a required JSON array. Each entry needs file_path or file_url and an optional gain_db (default 0.0). Requires at least 2 tracks. Shorter tracks are padded with silence to match the longest.
Concat
Stitch N audio files together in order. Handles different sample rates and channel counts automatically (ffmpeg resamples on the fly).
files is a required JSON array of {file_path?, file_url?} objects. Requires at least 2 entries.
Speed
Change playback speed without pitch shifting — useful for auditioning at half/double speed, or creating slow-motion effects. Uses ffmpeg atempo filter chained for extreme multipliers.
speed is required. Range: 0.1–10.0. Note: this changes duration but not pitch. For pitch-preserving tempo changes use /v1/audio/stretch.
Convert
Re-encode audio to a different format, sample rate, or channel count in a single call.
output_format defaults to wav. sample_rate and channels are optional; if omitted, the source values are preserved.
Similar
Compute cosine similarity between two audio files using CLAP embeddings. Returns a score in [-1, 1] — 1 = identical sound, 0 = unrelated, negative = acoustically opposite. Useful for duplicate detection, cover matching, or finding the closest sample in a library.
Primary file: file_path / file_url. Reference file: reference_file_path / reference_file_url. Requires clap-embed engine.
MIDI quantize
Snap all note timings in a MIDI file to the nearest rhythmic grid. Cleaner dedicated endpoint than /v1/midi/transform's quantize_grid_beats param.
grid_beats: grid size in beats — 0.25 = 16th note, 0.5 = 8th, 1.0 = quarter note. Default: 0.25.
Fade
Apply fade-in, fade-out, or both. 13 curve shapes: tri, qsin, esin, hsin, log, ipar, qua, cub, squ, cbr, par, exp, lin.
At least one of fade_in / fade_out must be > 0.
Reverse
Flip audio backwards via ffmpeg areverse.
Loop
Repeat audio N times. Uses ffmpeg aloop filter — no re-encoding overhead per iteration.
count must be ≥ 2 (total plays, not extra loops).
BPM match
Detect the source BPM via librosa, then time-stretch to the target — no manual math.
Response JSON includes source_bpm, target_bpm, and tempo_factor alongside the staged path / url. Requires both librosa-analyze and stretch engines.
Stereo width
Widen or collapse the stereo image via M/S processing. width=0.0 → mono, 1.0 → original, >1.0 → wider. Works on mono input too (upmixes first).
Range: [0.0, 3.0].
Split
Split a file into segments. Two modes: equal (N equal time parts) or silence (split on quiet gaps). Returns a ZIP of numbered files.
mode=equal requires count >= 2. mode=silence uses threshold_db (default -30) and min_duration_sec (default 0.5); requires the silence-detect engine.
Pan
Position audio in the stereo field. Works on mono and stereo input.
position: -1.0 = hard left, 0.0 = center, 1.0 = hard right.
EQ
Parametric EQ via ffmpeg equalizer filter. Pass any number of bands — each with a center frequency, gain, and optional bandwidth.
Each band: freq (Hz, required), gain_db (dB, required, range ±30), width_hz (optional, default 100).
Key match
Detect the source key via CLAP chord analysis, then pitch-shift to a target key — one call instead of two.
target_key: root note, e.g. C, F#, Bb, D#. Mode suffix (major/minor/m) is ignored — only the root matters for pitch. Requires chord-detect and stretch engines.
Sidechain duck
Duck a primary track (music) whenever a trigger track (voice) is loud — the classic voiceover-over-music effect. Pure ffmpeg sidechaincompress, no model required.
Primary track is compressed whenever the trigger exceeds threshold_db. ratio sets compression intensity. Files must be the same duration for best results; shorter trigger is padded with silence.
Effects chain
Apply an ordered chain of pedalboard effects — full catalog, you pick the order and params. Different from /v1/audio/master (which runs preset mastering chains).
Allowed effects: Compressor, Limiter, NoiseGate, Gain, Clipping, Distortion, Bitcrush, Reverb, Chorus, Delay, Phaser, PitchShift, HighShelfFilter, LowShelfFilter, PeakFilter, HighpassFilter, LowpassFilter, LadderFilter, IIRFilter, GSMFullRateCompressor, MP3Compressor, Resample, Invert, Convolution.
VST3 / AudioUnit / external plugins are NOT in the allowlist — they load arbitrary native code.
Loop point
Find the best seamless loop boundary in an audio file — audiolla analyses the beat grid and returns the start and end positions where a loop will repeat without a click or gap.
Response fields: loop_start_sec, loop_end_sec, bars, score (0–1, higher = tighter loop), tempo_bpm, candidates (array of ranked alternatives). Optional params: min_loop_bars (default 4), num_candidates (default 5). Requires librosa-analyze engine.
Compose MIDI
POST a JSON song spec, get Standard MIDI File bytes back. Write the spec by hand, generate it from a tracker / DAW / sequencer, script it out of a Python notebook, or have an LLM produce it — audiolla doesn't care. No AI runs server-side; the spec is the music.
Spec fields: tempo_bpm (default 120), time_signature (default [4,4]), key_signature (optional, e.g. "C", "Am"), ticks_per_beat (default 480), tracks[].{name, program, channel, volume, pan, notes[].{pitch, start_beats, duration_beats, velocity}}. Time is in beats. program is GM program 0-127. Channel 9 is the GM drum channel — pitches there map to the drum kit (36 = kick, 38 = snare, 42 = closed hi-hat, etc.).
Inspect MIDI
Transform MIDI
transpose_semitones ±48. quantize_grid_beats is in beats (0.25 = 1/16th at 4/4). keep_channels and drop_channels take a JSON array of channel numbers; only one can be set per request.
Render MIDI to audio
Generate music from a spec
Compose + render in one call — spec in, audio file staged.
Drum pattern
Step-sequencer spec → GM drum MIDI. Define a rhythmic pattern as arrays of 0/1 step values for each drum voice; the server maps them to GM channel 9 pitches and bakes a MIDI file. Optional swing shifts even-numbered 16th steps for a shuffled feel.
Body fields: tempo_bpm (default 120), steps (steps per bar, default 16), bars (default 1), swing (0.0–0.5, default 0.0), pattern (object — keys are drum voice names, values are arrays of 0/1). Supported voices: kick, snare, hihat, open_hihat, ride, crash, clap, tom_hi, tom_mid, tom_low, rim, cowbell. Requires midi-compose engine.
Chords to MIDI
Detect the chord progression from an audio file and convert each segment to a MIDI chord (root + 3rd + 5th). Useful for exporting a detected chord chart as playable MIDI, re-harmonising an arrangement, or seeding a DAW session.
Optional params: tempo_bpm (default: detected from audio), velocity (1–127, default 80), octave (0–8, default 4), output_path. Requires chord-detect engine. Each chord segment becomes a MIDI chord event (root + major 3rd/minor 3rd + perfect 5th, duration = segment length).
Audio metadata tags
Read and write ID3 (MP3), Vorbis (OGG/FLAC), and WAV/M4A tags via mutagen. Requires the metadata engine.
Clip detection
Detect digital clipping. No engine required — pure numpy arithmetic.
Mid/Side encode and decode
Encode L/R stereo to Mid+Side or decode back. Useful for stereo width surgery without touching the pedalboard chain.
Beat slice
Detect beat positions with librosa and return a ZIP of numbered WAV/MP3 slices — one file per beat interval.
Convolution reverb
Apply an impulse response (IR) to audio via pedalboard's Convolution. Any WAV file can be used as the IR.
Transient shaper
Attack/sustain dual-compressor blending. Positive attack_gain_db makes drums punchier; negative sustain_gain_db cuts room tail.
Multiband compression
Split the signal into N+1 frequency bands and compress each one independently. Bands are split with zero-phase LR4-equivalent crossovers, so a bypassed chain reconstructs the original. Mastering-engineer staple — tame bass thump without squashing vocal sibilance, level out a busy mid-range, etc.
crossovers_hz length is N, bands length is N+1. Each band: required threshold_db + ratio, optional attack_ms (default 10), release_ms (default 100), makeup_db (default 0).
DJ prep
One call returns everything a DJ needs about a track. Requires librosa-analyze + chord-detect. LUFS is reported when a loudness engine is available.
Camelot wheel positions let you quickly find harmonically compatible tracks for mixing.
De-ess
Split-band high-frequency de-esser — attenuates sibilance above frequency_hz without affecting the rest of the signal. Implemented with a Butterworth HPF, envelope follower, and per-channel gain reduction. No engine required.
Optional params: threshold_db (≤ 0, default -20), frequency_hz (2000–15000, default 6000), ratio (1.0–20.0, default 4.0), output_format (wav/mp3/flac…), output_path.
Stereo field analysis
Measure stereo width, phase correlation, mid/side balance, and mono compatibility. No engine required — pure numpy.
Mono files return correlation=1.0, width=0.0, mono_compatible=true. Use correlation < 0 as a red flag for phase-cancelled material that will collapse on mono playback.
Audio thumbnail
Extract the most energetic segment of an audio file — the passage with the highest onset density in a given window. Useful for generating preview clips, podcast teasers, or DJ cue points. Requires librosa-analyze.
Optional params: duration_sec (1–300, default 30), output_format, output_path. When output_path is set the response JSON includes start_sec and end_sec so you know exactly where in the source the thumbnail was extracted.
MIDI humanize
Add subtle timing and velocity variations to a MIDI file to make it sound less mechanical. Jitter is uniformly distributed and, when a seed is provided, fully deterministic. Requires midi-compose.
Optional params: timing_ms (0–500, default 10), velocity_pct (0–50, default 10), seed (any int, optional), output_path. Non-MIDI input returns 400. Requires midi-compose.
Batch operations
Run multiple operations on staged files in one HTTP call. Operations run sequentially; each gets an independent result entry even if earlier ops fail.
Supported ops: convert, normalize, trim, fade, reverse, speed, eq.
Async jobs and webhooks
Every audio endpoint accepts async_job=true — the request returns immediately with a job ID and the work happens in the background. Poll for status or register a webhook.
Webhook payload (POST to your URL when the job completes):
Delivery has 4 attempts with exponential backoff (0 s, 1 s, 2 s, 4 s). Completed jobs stay in memory for AUDIOLLA_JOB_TTL seconds (default 1 hour) then are swept.
Stage files
A simple server-side file store under /v1/files. Upload, list, download, delete.
Staged inputs and outputs expire after 24 hours by default. Change AUDIOLLA_FILES_TTL to a duration such as 48h or 86400 seconds; 0 disables cleanup. When upgrading from v1, set AUDIOLLA_FILES_TTL=0 before starting the new image if existing files must stay indefinitely. Age runs from the last write, not the last read. The sweep runs every AUDIOLLA_SWEEPER_INTERVAL seconds and waits for active requests, downloads, and background jobs to finish, including when CPU and CUDA containers share /data. Continuous activity can defer cleanup. Model caches, symlinks, and .part files are excluded. Download anything you want to keep before it expires. Job metadata retention (AUDIOLLA_JOB_TTL) is separate from file retention.
Once staged, reference the file by path on any audio endpoint via file_path:
Remote URLs
Disabled by default. To allow the server to fetch file_url or PUT to
output_url, set the policy at container start:
Then:
Policy modes:
disabled(default) —file_url/output_urlrejected with 400allowlist— only hosts matchingAUDIOLLA_FETCH_HOSTSalloweddenylist— anything except listed hosts allowed (pair withAUDIOLLA_FETCH_ALLOW_PRIVATE=falseto block private IPs / metadata services)
Always-on protections:
- DNS-resolved private / loopback / link-local IPs rejected (toggleable)
- Only
httpsby default;httpopt-in viaAUDIOLLA_FETCH_SCHEMES - Redirects re-validated through the same policy
- Hard timeout + size cap =
AUDIOLLA_MAX_UPLOAD_BYTES - Every fetch / upload URL logged
See Configuration for all AUDIOLLA_FETCH_* env vars.
Engines
Each Demucs variant is its own checkpoint (hosted on dl.fbaipublicfiles.com). The entrypoint prefetches every enabled variant into /data/torch_cache/ at startup so the first separation request doesn't sit there downloading.
AUDIOLLA_ENABLED_ENGINES — restrict which engines are available. AUDIOLLA_PRELOAD — load specific engines into memory at startup instead of waiting for the first request.
Workflows — presets + pipeline
Two ways to chain operations server-side without re-uploading the audio between calls:
Curated presets — server-side YAML workflows shipped in presets/. Run one with a single POST:
Shipped presets: master-for-spotify (3-band master + -14 LUFS), podcast-cleanup (DeepFilterNet + de-ess + -16 LUFS), vocal-cleanup (UVR dereverb + denoise + de-ess + light comp). Add your own as a YAML file in presets/.
Ad-hoc pipeline — chain any registered ops in a single call:
The response of pipeline + preset endpoints includes a steps log so you can audit what ran. Both endpoints support async_job=true, output_path, output_url like every other audio-producing endpoint.
API catalog
GET /v1/catalog returns the machine-readable list of every endpoint grouped by category (separation, restoration, dynamics, eq-spatial, mastering, time-pitch, editing, analysis, effects-creative, visualize, midi, metadata, workflow, speech, files, jobs, management). Use it for discovery; LLM agents and codegen scripts both consume it.
Endpoints
Full wire contract: openapi.yaml.
Audio processing
Every endpoint takes a JSON body. Inputs pick exactly one of file_path
(pre-staged file under FILES_DIR) xor file_url (HTTPS URL the server
fetches). Audio-producing endpoints additionally require exactly one of
output_path (server writes the result under FILES_DIR) xor
output_url (presigned PUT — server uploads the encoded bytes). Both
missing → 400; both set → 400. Responses are always JSON — no raw audio
bytes, no Content-Disposition: attachment, no *_base64 fields.
Workflow — presets, pipeline, catalog
Server-side multi-step chains + discovery. See Workflows for narrative + curl examples.
Batch
Async jobs
Every audio endpoint accepts "async_job": true in the JSON body. Optional "webhook_url" for push-style delivery. When async_job=true, the endpoint returns HTTP 202 with {job_id, status: "pending", status_url} instead of executing inline.
MIDI
File staging
Management
MCP
audiolla exposes a Model Context Protocol server at /v1/mcp. Point any MCP-capable LLM agent at it and it gets the full audio processing surface as callable tools — separate stems, detect chords, transcribe to MIDI, diarize speakers, compose music from a JSON spec, read/write tags, submit async jobs — all over JSON-RPC without writing a line of integration code.
Audio-producing MCP tools follow the same contract as REST: callers MUST pass exactly one of output_path (server writes the result under FILES_DIR; client retrieves it via the get_file tool or HTTP GET /v1/files/<path>; response is {path, size, ...}) xor output_url (presigned PUT — server uploads the encoded bytes to the URL; response is {url, size, ...}). Both missing → ValueError; both set → ValueError. Inline base64 audio responses are gone in v1.0.0 — no audio_base64 / midi_base64 / image_base64 / video_base64 / zip_base64 fields exist anymore. Use list_jobs / get_job / cancel_job to manage long-running async work.
Endpoint: http://localhost:8000/v1/mcp
Tools:
Auth (AUDIOLLA_AUTH_TOKEN) covers /v1/mcp the same as the REST endpoints — pass the bearer token in the Authorization header.
Agent integrations
The skill works in any agent that reads .agents/skills/ (such as peen), and
installs natively in the clients below.
Claude Code
Claude Code prompts for the audiolla URL and, if auth is enabled, the token — the token is stored in your OS keychain.
Codex
Installed via the marketplace, the skill invokes as $audiolla:audiolla. Codex also picks
the skill up automatically, no install needed, in any repo containing .agents/skills/,
where it invokes as plain $audiolla.
OpenClaw
The skill is published to ClawHub on every release:
For MCP clients that speak local stdio, the @psyb0t/audiolla
plugin bridges to the running server's /v1/mcp endpoint:
Then set AUDIOLLA_URL (and AUDIOLLA_AUTH_TOKEN if the server has auth enabled).
Configuration
What's not in here
Build & dev
Both images inherit the Python 3.12, Torch 2.5.1 CPU/cu124 variants from Torchbase, pinned to v0.1.1 and their published digests. Audiolla installs its audio stack on top. Source is copied after dependency installation, so editing Python code does not reinstall Torch or audio dependencies. TORCHBASE_CPU_IMAGE and TORCHBASE_CUDA_IMAGE override the base when building with Make. Builds tag the image with the version from pyproject.toml, plus latest or latest-cuda, and the local test tag.
Torch 2.5.1 is retained for audio-stack compatibility. It is affected by CVE-2025-32434. Use trusted, verified model checkpoints only, including files mounted into the model cache. This base migration does not fix that vulnerability.
pkg-add, pkg-remove, pkg-update, and pkg-upgrade refresh [tool.uv] exclude-newer to UTC midnight seven days before the operation. pkg-lock honors the current cutoff. Heavy-lock compilation uses the separately pinned HEAVY_EXCLUDE_NEWER cutoff in scripts/compile_heavy_deps.sh and constrains resolution to existing output pins; changing wheel flavor does not upgrade unrelated packages. An intentional dependency upgrade requires reviewing those pins and the cutoff. Everything runs inside the dev container. Host needs docker, make, git.
Supply chain
Both prod images do a two-layer install.
Light deps (fastapi, uvicorn, pydantic, etc.): locked in uv.lock, installed with uv sync --frozen --no-dev. Build fails if the lockfile doesn't match pyproject.toml. Wheel hashes verified by uv.
Heavy ML/DSP deps (torch, demucs, matchering, pedalboard, librosa, sox, numpy, soundfile, huggingface-hub): one hash-locked requirements file per image variant (requirements-heavy-cpu.txt, requirements-heavy-cuda.txt), because the torch wheel differs between CPU and CUDA and lives on a different index. Human specs in scripts/heavy-deps-{cpu,cuda}.in, compiled via make pkg-compile-heavy, installed with uv pip install --require-hashes. Both files are committed.
Base images and the uv binary pinned by @sha256: digest.
License
matchering and pedalboard are GPL v3. Fine for self-hosted use. Distributing the image as a product needs a GPL compliance review.
来源:README.md,提交 c58d9d0
工具
0版本历史
1- v1.1.7最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分