DEMON
StreamDiffusion,用于音频。
用于音乐编排噪声的扩散引擎
DEMON 实时 Web 演示——实时控制抽屉、自动化曲线以及音频响应式视觉效果。
DEMON 是 StreamDiffusion,用于音频——一个 GPU 加速的流式扩散引擎,可实时生成和转换音乐,基于 ACE-Step v1.5。它流式传输连续的低延迟音频,您可以实时操控:每个调制参数都是一个逐帧旋钮,您可以在模型播放时进行扫描,且流式输出与批量运行在比特级别上完全一致。
没有 GPU,或者只想先玩玩?试试 music.daydream.live 上的托管实例。
目录
- DEMON 是什么
- 快速入门
- 功能特性
- 性能
- 调优
- 加速后端
- 编程使用:Session API
- 构建 TensorRT 引擎
- 演示应用
- 引擎内部机制
- DEMON 的对比分析
- 研究与引用
- 贡献指南
- 致谢
- 作者
- 许可证
DEMON 是什么
DEMON 是用于 ACE-Step v1.5 的流式扩散引擎。可以将其视为音频领域的 StreamDiffusion:环形缓冲区持有多个处于不同去噪阶段的进行中生成任务,并在每个 tick 中同步推进。预热完成后,已完成的潜变量以每 tick depth/steps 个生成的稳定速率流出。端到端 TensorRT 保持 tick 紧凑;每帧调制旋钮接受标量或 [T] 曲线,并支持流中热修改;环形缓冲区深度本身支持热调整。流式输出与批量处理在比特级别完全一致。
适用人群:
- 现场表演者和 VJ,通过 MIDI 和自动化曲线实时驱动音频。
- 研究人员,扩展类型化节点图或研究 ACE-Step v1.5 内部机制。
- 应用和插件开发者,基于小型、稳定的编程式 Session API 进行构建。
- ML 工程师,希望获得 TensorRT 加速的流式音频,且与批量处理在比特级别完全一致。
该引擎位于 acestep/。一个进程加载一次模型并暴露两样东西:
- 一个编程式的 Session API(
acestep/engine/session.py),通过一组精简的方法封装了流式处理管道、类型化节点图以及 TRT 运行时(prepare_source、encode_text、generate、decode、stream、apply_lora)。 - 一个由 32 个可组合操作(latent / audio / conditioning / curve / mask / solver / config / DCW / channel guidance)组成的类型化节点图(
acestep/nodes/),通过NodeDefinition/NodePort/NodeParam进行连接,并在注册时进行关键字参数验证。
在其之上的任何内容——CLI、notebook、VST、内置的 web 演示、MCP 工具,或您自己的协议——都驱动着相同的原语。该库不关心也不在意您使用的是哪一个。
快速开始
您需要: 一块 NVIDIA GPU(已在 RTX 3090 / 4090 / 5090 上测试;演示可在 24 GB 显存的显卡上运行),uv、Node.js 20+(仅 web 演示需要),以及约 40 GB 的可用磁盘空间。Python 3.11 由 uv sync 为您安装。
git clone https://github.com/daydreamlive/DEMON.git
cd DEMON
uv sync
uv run demon-setup
demon-setup 检查你的环境,下载 ACE-Step v1.5 检查点(约 18 GB,来自 Hugging Face 上的 ACE-Step/Ace-Step1.5,并带有 ModelScope 回退方案),获取 DEMON 固定的 Stable Audio 3 源代码检出,下载一组入门级流派 LoRA,并构建最小化的 TensorRT 引擎集(60 秒配置文件:解码器 + VAE 编码/解码,外加固定的 1 秒窗口化 VAE 解码——由于 ONNX 已预构建,在较新的 GPU 上只需几分钟;较旧的显卡可能需要更长时间)。它是幂等的:随时重新运行,已完成的工作将被跳过。(首次运行主要受约 18 GB 检查点下载和引擎构建的影响;后续运行将直接跳过至启动。)
然后启动 Web 演示:
uv run python -u -m demos.realtime_motion_graph_web.run
# open http://localhost:6660
Stable Audio 3 演示
SA3 UI 是一个挂载在 /sa3/ 的独立静态演示。它使用 backend: "sa3" 启动会话,但 SA3 模型变体是在后端启动时从 --checkpoint 解析的。在打开页面之前,请使用 SA3 检查点别名启动后端:
uv run python -u -m demos.realtime_motion_graph_web.run -- --checkpoint sa3-small
# or:
uv run python -u -m demos.realtime_motion_graph_web.run -- --checkpoint sa3-medium
然后打开 http://localhost:6660/sa3/(如果你直接运行后端,则打开 http://localhost:1318/sa3/)。针对默认的 ACE-Step 检查点打开 /sa3/ 不会切换模型;请使用 --checkpoint sa3-small 或 --checkpoint sa3-medium 重启后端。
你将看到和听到的内容。 页面加载时已默认选中一个测试用例。点击 Play —— 浏览器将音频置于点击事件之后,因此这也会解锁声音。首次启动需要约 15 秒,用于加载模型和 TensorRT 引擎(在 --accel compile 下会更长);随后 HUD 变为活动状态,音频持续流式传输。一旦会话开始播放,频谱控制滑块位于控制抽屉的 Experimental 选项卡中 —— 它们直接控制生成过程,因此更改会在片刻后作用于即将播放的音频;请缓慢拖动并仔细聆听。
裸启动命令默认运行全 TensorRT 模式,这需要刚刚构建的引擎
demon-setup。如果缺失,服务器将在启动时退出并打印确切的修复方法。如果你运行了demon-setup --skip-engines,你必须使用-- --accel compile启动(无需引擎;预期在第一次滴答时有较长的torch.compile预热时间)。
文件存放位置。 所有内容均下载到 ~/.daydream-scope/models/demon/(可通过 ACESTEP_MODELS_DIR 环境变量覆盖),而不是 到仓库中:检查点位于 <models dir>/checkpoints/ 下,Stable Audio 3 源码位于 <models dir>/sa3/vendor/ 下,TensorRT 引擎位于 <models dir>/trt_engines/ 下。模型必须是 demon-setup 获取的 ACE-Step v1.5 权重(等效于 uv run acestep-download)—— 请勿替换为其他检查点或路径。完整的目录树、手动下载、引擎构建选项、无头/容器说明以及故障排除表位于 docs/INSTALL.md。
音频素材 在首次使用时从 daydreamlive/demon-fixtures-v2 Hugging Face 数据集(保留较旧的 daydreamlive/demon-fixtures 作为回退)拉取,并物化到 <models dir>/fixtures/ 下。请参阅 acestep/fixtures.py 获取标准集合。
入门 LoRA。 demon-setup 会下载一个包含 16 个流派 LoRA 的入门包(爵士、phonk、lo-fi、朋克、原声、氛围和 deep house 的 2B 和 XL 变体,以及 funk 和 deathstep;可通过 --skip-loras 跳过)。若要添加自己的 LoRA,请将一个 .safetensors 文件(可选附带一个 <stem>.metadata.json 边车文件)放置在 $ACESTEP_MODELS_DIR/loras/ 下的任意位置(默认为 ~/.daydream-scope/models/demon/loras/),它将在下次刷新时出现在任何扫描该库的消费者中。请参阅 acestep/paths.py 和 acestep/lora_metadata.py。
功能
- ACE-Step v1.5 的流式扩散 — 一个在途生成的环形缓冲区,每个 tick 推进一个去噪步骤;吞吐量为每 tick
depth/steps个完成的生成,且深度可在流中热调整。 - 端到端 TensorRT — DiT 解码器和 VAE 编码/解码均通过 TRT 运行,且解码器支持重新拟合,因此 LoRA 切换永远不会重建引擎。
- 逐帧引导 — 速度、引导、噪声注入、x0 目标等均可接受标量或
[T]曲线,且均可在流中热修改。 - 异构插槽 — 在单个批处理前向传递中混合完整的重新生成、风格迁移和 RCFG 请求。
- 类型化 32 节点图 + Session API — 组合潜在变量 / 音频 / 条件 / 曲线 / 掩码 / 求解器操作,并从 Python、笔记本、VST、Web 演示或 MCP 客户端驱动它们。
- 内置 MCP 服务器 — Web 演示中的每个面向用户的操作都作为 MCP 工具暴露,因此智能体可以驱动实时会话。
- 流式与批处理位级一致 — 流式和单次路径组合相同的纯步骤原语并产生相同的输出。
参见 引擎内部机制 了解这些功能背后的完整机制。
性能
RTX 5090,ACE-Step v1.5 turbo (2B),全 TRT,depth=4,steps=8,vae_window=3s,60 秒源。
| 指标 | 数值 |
|---|---|
| Tick(解码器前向,深度=4) | ~43 ms |
| Decode(窗口化 VAE,3 秒) | 4.5 ms |
| 吞吐量 | 11.3 次生成/秒 |
| 参数收敛 | ~248 ms |
| 逐帧控制分辨率 | 25 Hz(40 ms 潜在步骤) |
| 流式与批处理质量 | 位级一致输出 |
在 NVIDIA RTX 3090、4090 和 5090 上进行了测试。该演示可轻松运行在 24 GB 显存的显卡上,例如 RTX 4090(参见 Tuning 下的 VRAM 分解)。
Tuning
三个参数相互权衡。在曲线上选择合适的点,是使 DEMON 在特定显卡上良好运行的关键。
- 环形缓冲区深度 (
pipeline_depth, 1 到 8)。 流水线在不同去噪阶段保持depth个在途生成批次,并在每个 tick 中一起推进。较高的深度使参数扫描更加平滑(在不同去噪阶段拥有更多槽位,因此曲线变化会通过更精细的中间状态进行混合),代价是每个 tick 的批量计算量增加和显存占用更高;较低的深度感觉更敏捷且更离散,每个 tick 的显存和计算量更低。 - 歌曲时长。 TRT 引擎是特定于配置文件的,并且每个引擎都会为其配置文件保留相应大小的工作区——因此,即使工作负载仅为 60 秒,240 秒的引擎比 60 秒的引擎消耗更多的显存和更高的每 tick 延迟。仅构建所需的时长(参见下方的显存分解)。
- VAE 窗口化。 可选,且为演示的默认设置。当
vae_window > 0时,每个流式解码都通过固定的 1 秒窗口化引擎运行:输入 25 个潜在帧,输出中间的vae_window秒(保留范围 0.04 到 0.36 秒),周围的帧是作为感受野边缘被裁剪掉的。每次调用仅解码请求的窗口,而不是完整的潜在数据——这是实现低延迟流式更新的关键。设置为 0 以回退到通过vae_decode引擎进行全长度解码。
每引擎显存:60 秒与 240 秒配置文件 (5090)
每个引擎都会根据其配置预留相应大小的工作区,因此即使工作负载仅为 60 秒,240 秒引擎消耗的 VRAM 也比 60 秒引擎更多。各引擎的峰值工作区,均在 5090 上单独测量:
| 组件 | 60s 引擎 | 240s 引擎 | Δ |
|---|---|---|---|
| 解码器 (refit) | 13,511 MB | 15,911 MB | +2,400 MB |
| VAE 解码 | 10,547 MB | 10,814 MB | +267 MB |
| VAE 编码 | 4,178 MB | 10,614 MB | +6,436 MB |
这些是在独立子进程中捕获的各引擎峰值,而非实时运行时的总和。在推理时,解码器峰值占主导地位,且 VAE 工作区不会与其同时达到峰值,这就是为什么实时演示能在 24 GB 显卡上运行的原因。关键在于对比:将三个引擎从 240 秒切换到 60 秒可释放约 9 GB。来源:scripts/benchmarks/vram_60s_vs_240s_results.md。更长的引擎还会支付更高的每 tick 延迟,因为扩散序列长度随持续时间扩展。
加速后端
DiT 解码器和 VAE 独立选择后端。每个组件各有三个取值:tensorrt、compile、eager。
| 组件 | 后端 | 备注 |
|---|---|---|
| 解码器 | tensorrt | 速度最快。需要针对目标时长和检查点构建解码器引擎。支持重拟合的引擎支持 LoRA 切换。 |
| 解码器 | compile | torch.compile。预热时间长,无需构建引擎,是良好的回退方案。 |
| 解码器 | eager | 纯 PyTorch。适用于调试。 |
| VAE 编码/解码 | tensorrt | 速度最快。窗口化解码引擎(vae_decode_fp16_1s_fixed)只需构建一次,即可在所有时长中复用。 |
| VAE 编码/解码 | compile | torch.compile。 |
| VAE 编码/解码 | eager | 纯 PyTorch。 |
在捆绑的 Web 演示中,传入 --accel {tensorrt|compile|eager} 可同时设置两者,或传入 --decoder-accel / --vae-accel 以逐个覆盖单个组件:
# All-TRT (recommended).
uv run python -u -m demos.realtime_motion_graph_web.run -- --accel tensorrt
# TRT decoder, eager VAE (e.g. for debugging the decode path).
uv run python -u -m demos.realtime_motion_graph_web.run -- \
--accel tensorrt --vae-accel eager
推荐基线:至少使用 TRT 窗口化 VAE 解码器。 它是构建成本最低的 TRT 引擎,与检查点和时长无关,并且能够启用低延迟流式处理路径。如果尚不想构建解码器引擎,请将其与 --decoder-accel compile 配合使用。
编程使用:Session API
Session API 是引擎的主要接口。加载一次模型,然后进行迭代。
from acestep.engine.session import Session
from acestep.constants import TASK_INSTRUCTIONS
session = Session(
decoder_backend="compile", # or "tensorrt", "eager"
vae_backend="compile",
vae_window=0.36, # 0 = full decode; >0 enables windowed decode
)
# Load audio, encode it, extract semantic context (cache across iterations).
source = session.prepare_source(audio)
# Encode text once. Reused across generations.
cond = session.encode_text(
tags="deathstep death",
instruction=TASK_INSTRUCTIONS["cover"],
refer_latent=source.latent,
bpm=136, duration=60.0, key="G# minor",
)
# Generate, decode, save. Cheap after warmup (~310 ms per iteration).
for seed in [1528, 9999, 42]:
latent = session.generate(
conditioning=cond,
context_latent=source.context_latent,
source_latent=source.latent,
seed=seed,
)
save_audio(session.decode(latent), f"out_{seed}.wav")
流式处理是将相同的基础原语封装在 StreamHandle 中:
handle = session.stream(source=source, conditioning=cond, pipeline_depth=4)
for _ in range(N_TICKS):
# Mutate handle.conditioning / handle.context_latent between ticks
# to swap prompts or blend semantic hints live.
latent = handle.tick()
if latent is not None:
audio = handle.decode(latent, t_start=window_start_s)
# Per-frame curve overrides bypass the ring buffer (1-tick latency):
handle.pipeline.set_shared_curve("velocity_scale", 1.2)
handle.pipeline.set_shared_curve("sde_denoise_curve", torch.tensor([...]))
快速入门脚本:
examples/session_demo.py:持久会话,使用不同种子迭代封面。examples/realtime_cover.py:完整的实时封面工作流,包含双提示词、双 LoRA、音色/提示参考、时间掩码以及引擎专属的逐帧曲线。examples/covers/:每个功能对应一个独立脚本。
所有按功能划分的示例脚本
| 脚本 | 功能 |
|---|---|
cover_basic.py | 标准封面流水线(编码、条件化、生成、解码) |
prompt_blend.py | 使用时间曲线混合两个提示词 |
sde_denoise_curve.py | 逐帧 SDE 重噪声调制 |
velocity_scaling.py | 逐帧变换速率控制 |
lora_generation.py | LoRA 条件化生成 |
x0_target_blend.py | 向目标潜空间进行两遍变形 |
conditioning_average.py | 融合两个条件化 |
guidance_curve.py | 逐帧 CFG 比例 |
latent_noise_mask.py | 潜空间修复 |
initial_noise_curve.py | 逐帧噪声/源初始化混合 |
ode_noise_injection.py | 随机 ODE 步 |
cover_semantic_blend.py | 混合来自两个源的语义提示 |
x0_target_from_reference.py | 预生成目标潜空间,并向其变形 |
构建 TensorRT 引擎
DEMON 针对 TensorRT 10.16.x。默认情况下,计划文件(Plans)与版本和 GPU 架构相关,因此在更改 TensorRT、CUDA、驱动程序或用于推理的 GPU 后,需要重新构建。实时 Web 演示的最小配置集(即 demon-setup 所构建的内容)包括 60 秒配置文件(解码器 + VAE 编码/解码)以及固定 1 秒窗口化的 VAE 解码:
uv run python -m acestep.engine.trt.build --preset minimal
ONNX 中间产物与持续时间无关,并会在多次构建之间自动复用;模型仅在实际需要导出时才会加载。有关完整的构建矩阵、精度配方、XL/FP8 路径以及引擎命名,请参阅 docs/TRT.md。
所有构建命令 & 磁盘上的引擎布局
# Minimal set for the realtime web demo (what `demon-setup` builds):
# the 60s profile (decoder + VAE encode/decode) + fixed 1s windowed VAE decode.
uv run python -m acestep.engine.trt.build --preset minimal
# Full matrix (decoder refit + VAE encode/decode for 60s / 120s / 240s).
uv run python -m acestep.engine.trt.build --all
# 60s only (recommended starting point).
uv run python -m acestep.engine.trt.build --all --duration 60
# Just the windowed VAE decoder (smallest, fastest to build, biggest payoff).
uv run python -m acestep.engine.trt.build --vae-only --duration 60
# Preview what would be built.
uv run python -m acestep.engine.trt.build --all --dry-run
# Force rebuild even if engines already exist.
uv run python -m acestep.engine.trt.build --all --force-rebuild
# Force ONNX re-export as well.
uv run python -m acestep.engine.trt.build --all --duration 60 --force-rebuild --force-onnx
~/.daydream-scope/models/demon/trt_engines/
_onnx_vae/ # shared across checkpoints, auto-reused
vae_encode/vae_encode.onnx
vae_decode/vae_decode.onnx
_onnx_acestep-v15-turbo/ # checkpoint-specific
decoder_refit/decoder_refit.onnx # + external data shards
spectral_decoder_mixed_refit_b8_60s/
spectral_decoder_mixed_refit_b8_60s.engine
vae_encode_fp16_60s/
vae_encode_fp16_60s.engine
vae_decode_fp16_1s_fixed/ # windowed decode, duration-independent
vae_decode_fp16_1s_fixed.engine
...
在使用 API 直接调用时,将 Pass engine 路径传递给 Session(acestep.paths.select_trt_engines / available_trt_engines 会为您解析这些路径):
from acestep.paths import available_trt_engines
engines, picked_dur = available_trt_engines(duration_s=60.0)
session = Session(
decoder_backend="tensorrt",
vae_backend="tensorrt",
vae_window=0.36,
trt_engines=engines,
)
演示应用
该引擎旨在被驱动。仓库附带一个旗舰参考应用以及若干聚焦的入口点。
realtime_motion_graph_web(主打演示)
一个 Python 后端加上一个 Next.js 前端,集成在单个启动器中。输入音频和提示词,然后调节旋钮、绘制自动化曲线、混合提示词、热切换音色/结构参考,并在模型持续生成和播放时切换 LoRA。上述引擎的大部分功能均作为实时控件暴露。
uv run python -u -m demos.realtime_motion_graph_web.run
# then open http://localhost:6660
启动器在 :1318 上启动后端,在 :6660 上启动 Next.js 开发服务器。首次运行会自动安装 Web 应用和共享 SDK(packages/demon-client)node_modules。在 -- 之后转发后端标志:
uv run python -u -m demos.realtime_motion_graph_web.run -- --accel tensorrt
uv run python -u -m demos.realtime_motion_graph_web.run -- --checkpoint xl
外部静态演示仓库可以在运行时通过 --demo <path> 挂载。DEMON 将它们作为已构建的静态文件提供服务,并在启动时打印其直接 URL:
uv run python -u -m demos.realtime_motion_graph_web.run --demo C:\path\to\demo
这些仓库拥有任何浏览器/CDN/构建依赖项;DEMON 仅提供静态托管以及位于 /sdk/demon-client.js 的共享浏览器 SDK。有关具体的无构建示例,请参阅 daydreamlive/demon-example-apps:
git clone https://github.com/daydreamlive/demon-example-apps.git
uv run python -u -m demos.realtime_motion_graph_web.run --demo C:\path\to\demon-example-apps\apps\summon
Highlights:
- Prompt A ↔ B 混合。 两个文本字段加一个混合滑块。每次提交执行一次编码器;滑块按刻度进行线性插值。
- LoRA 库。 浏览按流派分组的 LoRAs,点击启用,拖动推子调整强度。可选自动前置触发词以保持提示词准确。
- 音色与结构参考。 独立的固定素材、上传的片段或短麦克风录音可偏向乐器特征及段落 / 节奏 / 动态。可自由混合。
- 源音频替换。 从库中选择、上传或从麦克风录制 60 秒片段。
- 调度曲线。 在时间轴上绘制降噪、提示强度、反馈、偏移及任意 LoRA 强度的自动化。平滑 / 线性 / 阶梯插值。
- MIDI 学习。 右键点击任意滑块,晃动物理控制器,完成。映射按选项配置文件持久化。
- 音频响应视频。 WebGL2 着色器管线,具有饱和度驱动的颜色视差和底鼓泛光。
- 录制。 捕获音频(Opus/WebM,AAC/M4A 回退)或将实时图形画布作为视频录制,并混入音频。
- 配置导入 / 导出。 将完整的实时会话状态(旋钮、提示词、LoRAs、曲线)快照为 JSON。
- 内置 MCP 服务器。 每个面向用户的操作都暴露为 MCP 工具。可通过 Claude Code 或任何 MCP 客户端驱动演示。
所有默认设置(旋钮位置、走窗行为、空闲重置、LUFS 匹配器、音频响应着色器参数、XL 检查点覆盖)均位于 demos/realtime_motion_graph_web/web/public/config.json。编辑,刷新,完成。
请参阅 demos/realtime_motion_graph_web/README.md 了解后端参数、线协议、MCP 初始设置以及前端架构。
其他入口点
examples/session_demo.py:一次性生成,持久会话。examples/realtime_cover.py:实时翻唱工作流,涉及双提示、双 LoRA、音色/提示参考、时间掩码以及引擎专属的逐帧曲线。examples/covers/:独立的按功能划分的脚本(参见 程序化使用 下的表格)。demos/test_stream_cover_graph.py:由 Python 驱动的流式翻唱图。
引擎内部机制
功能 下列出的功能来自流式管道中的几种机制。完整概览:
完整的引擎概览(点击展开)
- ACE-Step v1.5 的流式扩散。
StreamPipeline(acestep/engine/stream.py) 维护一个正在生成中的环形缓冲区。每个 tick 执行一次批处理解码器前向传播(当 CFG 激活时为两次:正向 + 负向),使每个活动槽位推进一个去噪步骤。解码器通过相同的代码路径分发到 TensorRT 或 PyTorch。深度可在流中热调整(pipeline.set_depth(n));活动槽位会自然排空。 - 异构槽位。 每个正在生成中的槽位都携带其自身的
SlotRequest:其自身的种子,其自身的denoise强度(带有其自身缓存的时间步长调度),其自身的源潜在变量,其自身的逐帧曲线,其自身的条件(一个或多个带有逐帧temporal_weight和逐条件step_range的SlotCondition),其自身的 CFG 模式,其自身的 x0 目标,以及其自身的潜在噪声掩码。单个环形缓冲区可以同时混合一个denoise=1.0再生成、一个denoise=0.5风格迁移和一个 RCFG-self请求,并在一次前向传播中对它们进行批处理。 - 逐帧标量或曲线调制。 速度缩放、SDE 重噪声、ODE 噪声注入、引导缩放、x0 目标强度、x0 目标曲线、初始噪声混合、APG 动量、CFG 重缩放、DCW 缩放器以及条件时间权重均接受 Python 标量或
[T]张量,在边界处通过normalize_curve进行规范化,以便内核看到一种形状。 - 通道引导。 在每次前向传播之前应用于
xt的[1, T, 64]逐通道增益。由于其逐通道且逐帧的形状不符合[T]-曲线模式,因此存在于其自身的表面中(通过pipeline.set_channel_gain_tensor(...)设置)。 - 共享可变曲线。 叠加在异构槽位之上:
pipeline.set_shared_curve(name, value)一次性为所有在途槽位的下一个 tick 覆盖其中一个曲线形状字段(velocity_scale、sde_denoise_curve、ode_noise_curve、guidance_curve、apg_momentum、x0_target_strength、cfg_rescale_curve)。该覆盖立即生效,而非等待新提交通过流水线。传入None可将该名称恢复为按槽位行为。 - 多条件合成。 在单个槽位内,解码器针对每个活动条件运行一次,速度由
temporal_weight按帧混合;条件由step_range在调度中启用或禁用。ConditioningBlend(标量 alpha)和ConditioningCombine(按帧时间权重)是类型化入口点。 - 三种 CFG 模式。 标准 CFG(每步执行一次无条件前向传播)、RCFG-
initialize(每个槽位执行一次无条件前向传播,并在调度的其余部分缓存)以及 RCFG-self(零次无条件前向传播:槽位的初始噪声作为虚拟无条件速度)。所有三种模式都在其上叠加 APG 动量以及可选的按帧 CFG 重缩放曲线。 - 潜在噪声掩码修复。 匹配 ComfyUI 语义的双向 x0 混合:在
xt上进行预混合(以便解码器在保留区域看到正确加噪的上下文)以及在预测的x0上进行后混合。支持按步强度函数以实现渐进式掩码。 - DCW 后步校正。 源自 Yu et al. CVPR 2026 的小波域采样端校正,移植自上游 ACE-Step v0.1.7。包含四种模式(low / high / double / pix),并带有可选的高级界面(
mult_blend,mag_phase,soft_thresh),在零值时与上游参考实现字节级一致。可通过pipeline.set_dcw(...)进行热更新。 - Hot LoRA。 注册一次目录,即可在不重建任何内容的情况下启用 / set_strength / 移除。LoRA 管理器(
acestep/engine/lora.py) 负责处理生命周期和增量计算;当解码器处于 TRT 模式时,通过针对实时引擎的 refitter 应用路由。 - 端到端 TRT 加速。 DiT 解码器、VAE 编码和 VAE 解码各自独立选择
tensorrt | compile | eager。TRT 解码器支持 refit,因此 LoRA 切换不会重建引擎。VAE 解码具有窗口化变体(vae_decode_fp16_1s_fixed,固定 1 秒配置文件),该变体构建一次并在所有时长中复用;调用者通过t_start指定窗口起始位置。 - 流式与批处理位级一致。 流式路径和一次性路径由
acestep/engine/ode_steps.py中的相同纯步长原语组合而成;它们产生相同的输出。
DEMON 的对比
DEMON 之于音频,犹如 StreamDiffusion 之于图像:一个流式、可实时操控的扩散运行时。以下是它与最接近的参照点的关系——这是一张关系图,而非基准测试:
| DEMON | ACE-Step v1.5 (上游) | StreamDiffusion | |
|---|---|---|---|
| 模态 | 音乐 / 音频 | 音乐 / 音频 | 图像 |
| 生成 | 进行中降噪阶段的流式环形缓冲区 | 一次性批处理 | 流式环形缓冲区(图像对应物) |
| 逐帧控制 | 每个旋钮均为标量或 [T] 曲线,可在流中热修改 | 每次生成的参数 | — |
| 环形缓冲区深度 | 可在流中热调整大小 | — | — |
| 流式与批处理 | 位级一致输出 | 仅批处理 | — |
| 加速 | 端到端 TensorRT(解码器 + VAE) | — | TensorRT |
研究与引用
DEMON 的主要论文已发布于 arXiv;两篇配套技术笔记即将发布:
- DEMON: Diffusion Engine for Musical Orchestrated Noise — 主要论文 (arXiv:2605.28657)
- FastOobleckDecoder (VAE 蒸馏) — 即将发布
- Latent Channel Semantics (64 通道 VAE 表征) — 即将发布
如果您在工作中使用了 DEMON,请同时引用 DEMON 和底层的 ACE-Step 模型:
@article{fosdick2026demon,
title = {DEMON: Diffusion Engine for Musical Orchestrated Noise},
author = {Fosdick, Ryan},
journal = {arXiv preprint arXiv:2605.28657},
year = {2026}
}
@software{demon,
author = {Fosdick, Ryan},
title = {DEMON: Diffusion Engine for Musical Orchestrated Noise},
year = {2026},
url = {https://github.com/daydreamlive/DEMON}
}
@article{acestep2026,
title = {ACE-Step 1.5: Pushing the Boundaries of Open-Source Music Generation},
author = {Gong and others},
journal = {arXiv preprint arXiv:2602.00744},
year = {2026}
}
贡献
欢迎贡献。维护中的 agent/developer 指南是 AGENTS.md — 它涵盖了开发环境搭建、契约优先的控制面(每个旋钮和线协议都恰好存在于一个注册表中),以及在注册表变更后如何重新生成生成的 TypeScript 类型。使用以下命令运行测试套件:
uv run pytest tests/
然后在 GitHub 上发起一个 pull request 或提交一个 issue。
致谢
DEMON 构建在 ACE-Step 之上。基础扩散模型、VAE、文本编码器以及 5 Hz LM 均为 ACE-Step 的成果;没有它们,这一切都不复存在。非常感谢 ACE-Step 团队在 MIT 许可下发布了 v1.5 的权重和代码。
如果您在您的工作中使用了 DEMON,请同时引用 ACE-Step。
作者
DEMON 最初由 Ryan Fosdick(@RyanOnTheInside)创建。由 Daydream Live 及贡献者维护。
许可证
DEMON 依据 GNU Affero General Public License v3.0 或更高版本(AGPL-3.0-or-later)分发;完整文本请参阅 LICENSE。除其他事项外,这意味着通过网络向用户提供的修改版本必须向这些用户提供相应的源代码(AGPL §13)。
DEMON 的部分内容源自 ACE-Step,最初依据 MIT 许可证发布。原始 MIT 声明已按要求保留在 LICENSE-MIT 中;ACE-Step 部分在其自身条款下仍依据 MIT 可用,而组合作品则依据 AGPL-3.0-or-later 提供。