mcpField
D
demusic

demusic

本地服务
dawnwood.ai媒体与设计01 周前更新

关于 demusic

demusic 是本地运行的命令行工具和 MCP 服务,可检测并移除 AI 生成视频中的背景音乐,同时保留对白、音效和环境声。它只替换检测到音乐的片段,其他音频和视频流保持不变。

主要功能

  1. 01检测含音乐的片段
  2. 02仅替换检测到的区段
  3. 03保留对白和演唱人声
  4. 04使用本地 Demucs 或 fal.ai 分离
  5. 05批量处理并输出 JSON

适用场景

  1. 01清除生成视频中的背景音乐
  2. 02在 CI 流程中检查片段是否含音乐
  3. 03剪辑前批量处理视频文件夹

MCP 相关

MCP 服务提供只读检测工具 `check_music`,以及将清理后的副本写入新文件且不覆盖输入的 `remove_music`。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"dawnwood-ai-demusic": {
"command": "uvx",
"args": [
"demusic"
],
"env": {
"DEMUSIC_SEPARATOR": "<DEMUSIC_SEPARATOR>",
"FAL_KEY": "<FAL_KEY>",
"DEMUSIC_FFMPEG": "<DEMUSIC_FFMPEG>"
}
}
}
}
启动命令uvx demusic
需要配置的环境变量
DEMUSIC_SEPARATORdemucs (local, needs demusic[demucs]) | fal (needs FAL_KEY) - default demucs
FAL_KEY密钥Optional: your fal.ai key when DEMUSIC_SEPARATOR=fal
DEMUSIC_FFMPEGPath to ffmpeg (default: ffmpeg on PATH)

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypidemusic0.1.0

工具

2

收录的工具列表 · 更新于 1 周前

参数类型必填说明
pathstring是
thresholdnumber否

详细介绍

demusic

tests License: Apache-2.0 MCP server

demusic 会移除 AI 视频模型(Seedance、Kling、Veo、Hailuo、 Wan 等)在生成片段时混入的背景音乐,同时保留对白、音效和环境声。 它会找出音乐所在的位置,只替换那些位置的音频,因此片段的其余部分 不会受到影响。本地运行、免费,支持命令行和 MCP 服务。

阅读中文版 · 检测原理

为什么需要 demusic

原生音频视频模型经常会擅自添加背景音乐:镜头开头几秒的配乐,或对白下方的铺底音乐。把十个这样的片段剪在一起,就会有十段音乐互相干扰,而且你也无法叠加自己的配乐。

常见的解决办法是使用人声移除工具,只保留人声——这样会连同音乐一起丢掉脚步声、关门声、雨声和室内底噪,而且对原本没有音乐的片段也不适用。我们在 Dawnwood 制作 AI 剧集时,会用 demusic 处理每个片段:

  1. 分离:将音频分离为多个音轨(Demucs htdemucs_6s,在本地运行或使用你的 fal key)。
  2. 音量够作为背景音乐吗? 旋律音轨必须达到可听音量(> -50 dBFS)。
  3. 确实是音乐吗? AudioSet 分类器必须在伴奏上检测到持续 2 秒以上的音乐。引擎声、枪声和室内底噪能通过第 2 步,但无法通过这一步。
  4. 仅移除这些片段:这些位置的音频会变为对白 + 打击乐/撞击声,并添加 0.25 秒交叉淡化;其他位置则保留原始音频。画面采用流复制(不重新编码)。

它的设计刻意偏保守。在 164 个没有音乐的片段中,误判了 2 个;在人工凭听觉标记的 87 个片段中,它检测出了 33 个。漏检的都是音量很低的背景音乐——可以调低 --threshold,或者在确定片段有音乐时使用 --mode force。 校准详情。

安装

需要 Python >= 3.10,且 ffmpeg 必须位于 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=...

音乐分类器(约 90 MB 的 ONNX,BSD-3)会下载到 ~/.cache/demusic,只需下载一次。

快速开始

# 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/
选项含义
--separator demucs|fal|DIR本地 Demucs(默认)、使用 FAL_KEY 的 fal.ai,或存放已分离音轨的文件夹(vocals.wav、drums.wav、bass/guitar/piano/other.wav 或 music.wav)
--mode spans|whole|force仅替换检测到音乐的位置(默认)/检测到音乐时替换整条音轨/始终替换,不进行检测
--threshold 0.3分类器的音乐概率;0.2 能检测到音量更低的背景音乐,但误报率更高
--loud-floor -50旋律音轨的音量门限(dBFS)
-o FILE / --out-dir DIR单个文件的输出路径/批处理的输出目录
--json在标准输出上输出一个 JSON 对象(files[],包含 music、spans、melodic_dbfs、strength、action、output)

退出代码:0 正常(对于 check:未检测到音乐),1 check 检测到音乐,2 用法错误,3 失败。 在 CI 或渲染流水线中运行 demusic check,即可在片段存在背景音乐时让构建失败。

速度:在笔记本 CPU 上分离音频约需实时速度(10 秒的片段约需 10–20 秒),使用 GPU 时会快得多。检测本身只需几百毫秒。

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 Agent(MCP)

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

工具:check_music(只读)和 remove_music(写入新文件,不会覆盖输入文件)。在服务环境中设置 DEMUSIC_SEPARATOR=fal 即可使用 fal。此外还有一个 Claude skill 和 AGENTS.md。

限制

  • 如果检测到场景中本应存在的音乐(画面中的乐队、收音机),也会将其移除。请跳过这些片段。
  • 在剥离出的片段内,非打击乐音效(水龙头流水声、风声)会和音乐一起被移除;Demucs 没有单独的音效声部。片段范围外不会有任何变化。
  • 演唱的人声会进入人声声部并予以保留。

致谢

Apache-2.0。demusic 会在每个输出文件的 comment 标签中写入 cleaned with demusic by Dawnwood。如果它为你节省了时间,请保留这条信息,并注明“demusic by Dawnwood”——这是请求,并非使用条件(参见 NOTICE)。

由 Dawnwood 制作,这是一家 AI 剧集工作室。我们在制作中使用的其他工具:dramapack(短剧交付包和质量检查) · 我们所有的开源项目。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。