DiffSynth-Music
DiffSynth-Music 是 DiffSynth-Studio 团队基于 ACE-Step-1.5 训练的可控生成音乐模型套件,模型的基础架构沿用 ACE-Step-1.5,增加了多个额外的模块,支持节拍、人声、伴奏、韵律和音色参考等多种控制方式。
安装
在使用本项目进行模型推理和训练前,请先安装 DiffSynth-Studio。
git clone https://github.com/modelscope/DiffSynth-Studio.git
cd DiffSynth-Studio
pip install -e .
更多安装信息请参考 依赖安装。
快速开始
运行以下代码将加载 DiffSynth-Studio/DiffSynth-Music 模型进行推理。示例覆盖六种用法:原生音乐合成、节拍控制、人声控制、伴奏控制、韵律控制和音色参考。
import torch, torchaudio
from diffsynth.pipelines.diffsynth_music import DiffSynthMusicPipeline, ModelConfig
from diffsynth.diffusion.template import TemplatePipeline
from diffsynth.core.data.operators import LoadMultiTrackAudio
from diffsynth.utils.music_tools import extract_prosody, generate_click
from modelscope import snapshot_download
pipe = DiffSynthMusicPipeline.from_pretrained(
torch_dtype=torch.bfloat16,
device="cuda",
model_configs=[
ModelConfig(model_id="DiffSynth-Studio/DiffSynth-Music", origin_file_pattern="transformer/model.safetensors"),
ModelConfig(model_id="DiffSynth-Studio/DiffSynth-Music", origin_file_pattern="conditioner/model.safetensors"),
ModelConfig(model_id="DiffSynth-Studio/DiffSynth-Music", origin_file_pattern="text_encoder/model.safetensors"),
ModelConfig(model_id="DiffSynth-Studio/DiffSynth-Music", origin_file_pattern="vae/model.safetensors"),
ModelConfig(model_id="DiffSynth-Studio/DiffSynth-Music", origin_file_pattern="track_separator/model.safetensors", computation_dtype=torch.float32),
],
tokenizer_config=ModelConfig(model_id="DiffSynth-Studio/DiffSynth-Music", origin_file_pattern="text_encoder/"),
)
template = TemplatePipeline.from_pretrained(
torch_dtype=torch.bfloat16,
device="cuda",
model_configs=[
ModelConfig(model_id="DiffSynth-Studio/DiffSynth-Music", origin_file_pattern="template_control/"),
ModelConfig(model_id="DiffSynth-Studio/DiffSynth-Music", origin_file_pattern="template_prosody/"),
ModelConfig(model_id="DiffSynth-Studio/DiffSynth-Music", origin_file_pattern="template_reference/"),
],
)
lyrics = "[Intro]\n\n你的歌词..."
prompt = "An explosive, high-energy pop-rock track with a strong anime theme song feel."
snapshot_download("DiffSynth-Studio/DiffSynth-Music", allow_file_pattern="assets/*", local_dir="data")
# 原生音乐合成
audio = template(
pipe,
prompt=prompt, negative_prompt=pipe.default_negative_prompt,
lyrics=lyrics,
duration=240,
seed=42, tiled=True, cfg_scale=4, num_inference_steps=50,
)
torchaudio.save("audio_1_output.mp3", audio, 48000)
# 节拍控制
beats = generate_click(120, duration=240)
audio = template(
pipe,
prompt=prompt, negative_prompt=pipe.default_negative_prompt,
lyrics=lyrics,
duration=240,
seed=42, tiled=True, cfg_scale=4, num_inference_steps=50,
template_inputs=[{"model_id": 0, "audio": beats}],
negative_template_inputs=[{"model_id": 0, "audio": beats * 0}],
)
torchaudio.save("audio_2_output.mp3", audio, 48000)
# 人声控制
audio = LoadMultiTrackAudio(division_factor=3840)("data/assets/audio_reference.mp3")
vocals = pipe.extract_track(audio, track="vocals")
audio = template(
pipe,
prompt=prompt, negative_prompt=pipe.default_negative_prompt,
lyrics="",
duration=vocals.shape[1] / 48000,
seed=42, tiled=True, cfg_scale=4, num_inference_steps=50,
template_inputs=[{"model_id": 0, "audio": vocals}],
negative_template_inputs=[{"model_id": 0, "audio": vocals}],
target_audio=vocals, target_track="vocals",
)
torchaudio.save("audio_3_output.mp3", audio, 48000)
# 伴奏控制
audio = LoadMultiTrackAudio(division_factor=3840)("data/assets/audio_reference.mp3")
music = pipe.extract_track(audio, track=["drums", "bass", "other"])
audio = template(
pipe,
prompt=prompt, negative_prompt=pipe.default_negative_prompt,
lyrics=lyrics,
duration=music.shape[1] / 48000,
seed=42, tiled=True, cfg_scale=4, num_inference_steps=50,
template_inputs=[{"model_id": 0, "audio": music}],
negative_template_inputs=[{"model_id": 0, "audio": music}],
target_audio=music, target_track=["drums", "bass", "other"],
)
torchaudio.save("audio_4_output.mp3", audio, 48000)
# 韵律控制
audio = LoadMultiTrackAudio(division_factor=3840)("data/assets/audio_reference.mp3")
vocals = pipe.extract_track(audio, track="vocals")
prosody = extract_prosody(vocals)
audio = template(
pipe,
prompt=prompt, negative_prompt=pipe.default_negative_prompt,
lyrics=lyrics,
duration=prosody.shape[1] / 48000,
seed=42, tiled=True, cfg_scale=4, num_inference_steps=50,
template_inputs=[{"model_id": 1, "audio": prosody}],
negative_template_inputs=[{"model_id": 1, "audio": prosody}],
)
torchaudio.save("audio_5_output.mp3", audio, 48000)
# 音色参考
audio = LoadMultiTrackAudio(division_factor=3840)("data/assets/audio_reference.mp3")
audio = template(
pipe,
prompt="Music", negative_prompt="", # 音色由参考音频控制
lyrics=lyrics,
duration=200,
seed=42, tiled=True, cfg_scale=4, num_inference_steps=100,
template_inputs=[{"model_id": 2, "audio": audio}],
)
torchaudio.save("audio_6_output.mp3", audio, 48000)
低显存推理版本见 examples/diffsynth_music/model_inference_low_vram/DiffSynth-Music.py。
模型概览
| 模型 ID | 推理 | 低显存推理 | 全量训练 | 全量训练验证 | LoRA 训练 | LoRA 训练验证 |
|---|---|---|---|---|---|---|
| DiffSynth-Studio/DiffSynth-Music | code | code | code | code | - | - |
模型推理
通过 DiffSynthMusicPipeline.from_pretrained 加载模型,详见 加载模型。
DiffSynthMusicPipeline 推理的主要参数包括:
prompt:音乐描述,指定流派、情绪和风格。negative_prompt:无分类器引导的负向提示词。lyrics:歌词。[Intro]、[Verse]等结构标签必须单独占一行。留空可生成纯音乐。bpm:每分钟节拍数。默认 100。timesignature:拍号。默认 "4"。keyscale:调性与音阶。默认 "B minor"。input_audio:可选的输入音频张量,与denoising_strength配合实现音频到音频生成。duration:生成音频的时长(秒)。num_inference_steps:流匹配步数。cfg_scale:无分类器引导强度。seed:随机种子。tiled:是否使用分块 VAE 解码。kv_cache:预计算的 KV 缓存,加速推理。target_audio/target_track:可选的音轨融合,将输出中的指定音轨替换为target_audio中对应音轨。
TemplatePipeline 提供三个控制适配器,通过 template_inputs 中的 model_id 指定:
model_id: 0— template_control:节拍/人声/伴奏控制。生成音频跟随给定音频的节奏。配合target_audio可将目标音轨融合进输出。model_id: 1— template_prosody:生成人声跟随给定音频的基频与韵律。使用extract_prosody构建输入。model_id: 2— template_reference:输出音色由参考音频控制。
显存不足时请参考 显存管理。
模型训练
模型支持对 DiT(trainable models: dit)在 (prompt, lyrics, audio) 数据上进行 LoRA 训练和全量训练。训练脚本见 examples/diffsynth_music/model_training。