mcpField
D
demusic

demusic

Local
dawnwood.aiMedia & Design0Updated 1w ago

About demusic

demusic is a local CLI and MCP server that detects and removes background music from AI-generated video clips while preserving dialogue, effects and ambience. Its span-based replacement leaves audio outside detected music sections and the video stream unchanged.

Key features

  1. 01Detects music-bearing spans
  2. 02Replaces only detected sections
  3. 03Preserves dialogue and sung vocals
  4. 04Local Demucs or fal.ai separation
  5. 05Batch processing and JSON output

Use cases

  1. 01Clean background music from generated clips
  2. 02Check clips for music in CI pipelines
  3. 03Process a folder of clips before editing

MCP support

The MCP server exposes `check_music` for read-only detection and `remove_music` to write a cleaned copy without overwriting the input.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"dawnwood-ai-demusic": {
"command": "uvx",
"args": [
"demusic"
],
"env": {
"DEMUSIC_SEPARATOR": "<DEMUSIC_SEPARATOR>",
"FAL_KEY": "<FAL_KEY>",
"DEMUSIC_FFMPEG": "<DEMUSIC_FFMPEG>"
}
}
}
}
Run commanduvx demusic
Environment variables to set
DEMUSIC_SEPARATORdemucs (local, needs demusic[demucs]) | fal (needs FAL_KEY) - default demucs
FAL_KEYSecretOptional: your fal.ai key when DEMUSIC_SEPARATOR=fal
DEMUSIC_FFMPEGPath to ffmpeg (default: ffmpeg on PATH)

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
pypidemusic0.1.0

Tools

2

Saved tool list · updated 1w ago

ParameterTypeRequiredDescription
pathstringYes
thresholdnumberNo

Details

From the project README

demusic

tests License: Apache-2.0 MCP server

demusic removes the background music that AI video models (Seedance, Kling, Veo, Hailuo, Wan, ...) bake into generated clips, and keeps the dialogue, sound effects and ambience. It finds where the music is and only replaces the audio there, so the rest of the clip is untouched. Local, free, CLI + MCP server.

Read in Chinese · How detection works

Why

Native-audio video models often add a music bed nobody asked for: a few seconds of score at the start of a shot, a pad under the dialogue. Cut ten such clips together and you get ten pieces of music fighting each other, and you can't lay your own score over it.

The usual fix - run a vocal remover and keep only the vocals - throws away footsteps, doors, rain and room tone along with the music, and it is wrong on every clip that had no music to begin with. demusic is what we run on every clip of our AI dramas at Dawnwood:

  1. Separate the audio into stems (Demucs htdemucs_6s, locally or on your fal key).
  2. Is it loud enough to be a bed? The melodic stems must be audible (> -50 dBFS).
  3. Is it actually music? An AudioSet classifier must hear music on the accompaniment for 2+ seconds. Engine hum, gunfire and room tone pass step 2 but fail this one.
  4. Strip only those spans: there the audio becomes dialogue + percussion/impacts, with a 0.25 s crossfade; everywhere else the original audio stays. The picture is stream-copied (no re-encode).

It is deliberately conservative. On 164 clips with no music it wrongly flagged 2; on 87 clips a person had flagged by ear it found 33. The misses are very quiet beds - lower --threshold or use --mode force when you know a clip has music. Calibration details.

Install

Requires Python >= 3.10 and ffmpeg on PATH.

pip install "demusic[demucs]"     # local separation (pulls in PyTorch; CPU is fine)
# or, no torch, separation on fal.ai with your own key:
pip install "demusic[fal]" && export FAL_KEY=...

The music classifier (~90 MB ONNX, BSD-3) downloads once to ~/.cache/demusic.

Quickstart

# where is the music?
demusic check shot_012.mp4
# shot_012.mp4: MUSIC  spans 0-2.8s  melodic -42.1 dBFS  p=0.34

# write shot_012.demusic.mp4 with the music removed
demusic strip shot_012.mp4

# a whole folder; clean copies of every file (unchanged ones copied) into clean/
demusic strip renders/*.mp4 --out-dir clean/
optionmeaning
--separator demucs|fal|DIRlocal Demucs (default), fal.ai with FAL_KEY, or a folder of stems you already separated (vocals.wav, drums.wav, bass/guitar/piano/other.wav or music.wav)
--mode spans|whole|forcereplace only where music was heard (default) / the whole track if any music was heard / always, without detection
--threshold 0.3classifier music probability; 0.2 finds quieter beds at a higher false-positive rate
--loud-floor -50melodic-stem loudness gate (dBFS)
-o FILE / --out-dir DIRoutput path for one file / for a batch
--jsonone JSON object on stdout (files[] with music, spans, melodic_dbfs, strength, action, output)

Exit codes: 0 ok (for check: no music), 1 check found music, 2 usage, 3 failure. demusic check in CI or a render pipeline = fail the build when a clip has a music bed.

Speed: separation is roughly real time on a laptop CPU (a 10 s clip ~10-20 s), much faster on a GPU. Detection itself is a few hundred ms.

Python

from demusic.core import process
r = process("shot.mp4", "shot.clean.mp4")          # strip
r = process("shot.mp4", strip=False)                # check only
print(r["music"], r["spans"])

AI agents (MCP)

claude mcp add demusic -- demusic mcp            # Claude Code
# or any MCP client: command "uvx", args ["--from", "demusic[demucs]", "demusic", "mcp"]

Tools: check_music (read-only) and remove_music (writes a new file, never overwrites the input). Set DEMUSIC_SEPARATOR=fal in the server env to use fal. There is also a Claude skill and AGENTS.md.

Limits

  • Music that is meant to be in the scene (a band on screen, a radio) is removed too when it is detected. Skip those clips.
  • Inside a stripped span, non-percussive effects (a running tap, wind) go with the music; Demucs has no separate SFX stem. Outside the spans nothing changes.
  • Sung vocals land in the vocals stem and are kept.

Credit

Apache-2.0. demusic writes cleaned with demusic by Dawnwood into each output file's comment tag. If it saves you time, please keep that and mention "demusic by Dawnwood" - a request, not a condition (see NOTICE).

Made by Dawnwood, an AI drama studio. More tools we use in production: dramapack (short-drama delivery packs and QC) · all our open source.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.