Getting started
This page goes from nothing to a separated vocal, a chord chart and a MIDI file. It uses the CPU image and curl; the CUDA image works the same way with --gpus all.
Start the server
mkdir -p $HOME/.audiolla-data
docker run --rm -it \
-v $HOME/.audiolla-data:/data \
-p 127.0.0.1:8000:8000 \
psyb0t/audiolla:latest
On start the entrypoint downloads the Demucs checkpoints for every enabled Demucs engine into /data/torch_cache/ (on the CPU image that is only htdemucs). Other engines fetch their weights the first time you call them. Keep the same -v mount and nothing is downloaded twice. Deployment covers the GPU image, restricting engines and what lives under /data.
Wait for the health check:
curl http://localhost:8000/healthz
# -> {"ok":true,"device":"cpu","engines":["htdemucs","matchering",...]}
Stage a file
Audio endpoints do not take uploads. You put the file in the server’s staging area first, then refer to it by path. The body of PUT /v1/files/{path} is the raw file:
curl -X PUT --data-binary @song.wav \
-H 'Content-Type: application/octet-stream' \
http://localhost:8000/v1/files/uploads/song.wav
# -> {"path":"uploads/song.wav","size":...}
Staged files expire 24 hours after their last write by default. Files and remote URLs explains retention, listing and deleting.
Split the vocals
curl -X POST http://localhost:8000/v1/audio/separate \
-H 'Content-Type: application/json' \
-d '{
"file_path": "uploads/song.wav",
"engine": "htdemucs",
"stems": ["vocals"],
"output_path": "out/vocals.wav"
}'
# -> {"path":"out/vocals.wav","size":...,"engine":"htdemucs","stem":"vocals","output_format":"wav"}
curl -o vocals.wav http://localhost:8000/v1/files/out/vocals.wav
Detect key and chords
Analysis endpoints answer with JSON and need no output path:
curl -X POST http://localhost:8000/v1/audio/chords \
-H 'Content-Type: application/json' \
-d '{"file_path":"uploads/song.wav"}'
# -> {"key":"F# minor","key_confidence":0.91,"chords":[{"chord":"F#m","start_sec":0.0,...},...]}
Transcribe the vocal to MIDI and play it back
The separated vocal is already staged at out/vocals.wav, so the next calls read it directly:
curl -X POST http://localhost:8000/v1/audio/to_midi/basic-pitch \
-H 'Content-Type: application/json' \
-d '{"file_path":"out/vocals.wav","output_path":"out/melody.mid"}'
curl -X POST http://localhost:8000/v1/midi/render \
-H 'Content-Type: application/json' \
-d '{"file_path":"out/melody.mid","output_path":"out/rendered.wav"}'
curl -o rendered.wav http://localhost:8000/v1/files/out/rendered.wav
/v1/midi/render uses the FluidR3_GM SoundFont shipped in both images.
Input and output
Every audio endpoint takes an application/json body and the same input and output rules.
Input, exactly one of:
file_path: a path in the staging area, as used withPUT /v1/files/{path}. A leading/,/files/or/v1/files/prefix is stripped, souploads/a.wavand/v1/files/uploads/a.wavare the same file.file_url: anhttp(s)URL the server downloads. This is off until you set a fetch policy; see remote URLs.
Sending neither or both gets a 400. Endpoints with a second input use the same either-or pair under another name: reference_path or reference_url for a mastering reference, trigger_file_path or trigger_file_url for a sidechain trigger, ir_file_path or ir_file_url for an impulse response. The API reference names them per endpoint.
Output, for endpoints that produce audio, MIDI, images or ZIP archives, exactly one of:
output_path: the server writes the result into the staging area and answers{"path": ..., "size": ..., ...}. Download it withGET /v1/files/{path}. A result larger thanAUDIOLLA_MAX_UPLOAD_BYTESgets a 413 instead.output_url: the server sends the result with an HTTPPUTto that URL, typically a presigned S3 upload URL, and answers{"url": ..., "size": ..., ...}. This needs the same fetch policy asfile_url.
A synchronous call with neither, or any call with both, gets a 400. With "async_job": true both are optional: the result goes to jobs/<job_id>.<ext> in the staging area. Async jobs covers that path.
Endpoints that only measure (/v1/audio/analyze, /v1/audio/loudness, /v1/audio/info, /v1/audio/chords and the rest of the analysis page) return their JSON directly. Two MIDI endpoints, /v1/midi/compose and /v1/midi/generate, take the song spec as the body and the output options as query parameters; the MIDI page explains them.
Audio results default to wav. Set "output_format" to mp3, flac, opus, aac or pcm on endpoints that accept it; an unsupported value gets a 415.
Errors are JSON: {"detail": "..."} with a 4xx or 5xx status. The API reference lists every field of every endpoint.
Next steps
- Turn on auth before anything else can reach the port: Security.
- Browse what the API can do from the home page, or ask the server:
GET /v1/catalogreturns the endpoints grouped by category. - Point an agent at
http://localhost:8000/v1/mcp: MCP server.