demusic

io.github.dawnwood-ai由 GitHub 账号 dawnwood-ai 发布v0.1.0更新于 Nov 7, 2026

Remove background music AI video models bake into clips; keep dialogue and SFX.

已验证STDIO仅桌面媒体与设计AI 与机器学习

概览

AI 生成的概览

本地 MCP 服务器,检测 AI 生成视频片段中的背景音乐,并输出一份去除该音乐、保留对白与音效的副本。

可以做什么
  • 检测视频或音频片段是否含背景音乐铺底,并给出出现位置、响度与强度数值
  • 生成去除音乐的新副本:仅在检测到的音乐区间替换音频,画面直接流复制
  • 返回清理后文件的输出路径,默认在输入文件旁以新文件名保存
适用场景
适用于 AI 视频模型给生成片段加上了不想要的背景音乐、需要叠加自己配乐的场景,也适合在交付前批量检查渲染片段是否带音乐。
运行要求
以 stdio 在本地运行,通常通过 uvx 从 demusic 的 PyPI 包启动。需要 Python 3.10 及以上,以及 PATH 中的 ffmpeg(或用 DEMUSIC_FFMPEG 指定路径)。本地分离使用 Demucs 并会安装 PyTorch;改用 fal 分离则需要 FAL_KEY。约 90 MB 的分类模型会下载一次到用户缓存目录。
安装前请注意
remove_music 会向磁盘写入新文件,但不会覆盖输入文件。当 DEMUSIC_SEPARATOR=fal 时,音频会使用 FAL_KEY 发送到 fal.ai。场景中本就存在的音乐(如画面中的乐队或收音机)也会被移除,被处理区间内的非打击类音效会一并丢失。输出文件会写入署名注释标签。

安装

在 SourceWeft 中

  1. 打开 控制台中的 demusic,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

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.

bash
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

bash
# 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 removeddemusic 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

python
from demusic.core import processr = process("shot.mp4", "shot.clean.mp4")          # stripr = process("shot.mp4", strip=False)                # check onlyprint(r["music"], r["spans"])

AI agents (MCP)

bash
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.

来源:README.md,提交 bb5bbb8

工具

2

check_music

Does this video/audio clip contain a background music bed, and where? Returns music (bool), spans [[start_s, end_s], ...], melodic_dbfs and strength (sustained music probability). Read-only. Conservative: it prefers missing a very quiet bed to flagging engine hum or room tone as music.

输入参数path必填threshold

remove_music

Write a copy of a clip with the background music removed: inside the detected music spans the audio becomes dialogue + percussion/impacts, elsewhere the original audio is kept; the picture is stream-copied. `output` defaults to <name>.demusic.<ext> next to the input; the input is never overwritten. mode: spans (default) | whole | force (strip without detection).

输入参数modepath必填outputthreshold

版本历史

1
  1. v0.1.0最新Nov 6, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分