NotaGen

GitHub
1.2k 128 中等 3 次阅读 5天前MIT音频语言模型
AI 解读 由 AI 自动生成,仅供参考

NotaGen 是一个专注于生成高质量古典乐谱的符号音乐生成模型。它借鉴大语言模型的成功经验,致力于提升生成音乐的音乐性,解决传统算法难以创作出结构严谨、风格地道的古典音乐的问题。

NotaGen 采用独特的三阶段训练范式:首先在 160 万首乐曲上进行预训练,随后基于时期、作曲家等提示词在约 9000 首古典作品上微调,最后通过创新的 CLaMP-DPO 强化学习方法进一步优化,无需人工标注即可显著提升作品质量。项目提供了从小型到大型等多种规模的模型权重,甚至推出了优化版 NotaGen-X,方便不同需求的用户部署。

无论是音乐人工智能领域的研究人员、希望集成音乐生成功能的开发者,还是寻找创作灵感的音乐人,都能通过 NotaGen 获得专业的乐谱生成能力。项目开源了代码与权重,并提供了在线演示空间,欢迎体验由 AI 创作的古典乐章。

使用场景

独立游戏开发者正在为一款历史策略游戏制作配乐,急需符合特定时期风格且可编辑的高质量古典乐谱。

没有 NotaGen 时

  • 传统 AI 生成的音频无法提供符号乐谱,后期修改难度极大,无法调整具体音符。
  • 手动创作古典乐谱耗时耗力,开发者往往缺乏深厚的乐理知识,难以保证质量。
  • 难以精准控制音乐风格,如区分巴洛克与浪漫主义时期的和声特点与配器。
  • 现有模型生成的旋律缺乏长期连贯性,容易出现重复片段或逻辑断裂。

使用 NotaGen 后

  • NotaGen 直接生成符号音乐,方便在 DAW 中进一步编辑和调整乐器轨道。
  • 利用预训练和微调范式,只需输入提示词即可快速产出专业级初稿,效率倍增。
  • 支持通过“时期 - 作曲家 - 配器”提示词,精准锁定目标音乐风格与情感色彩。
  • 引入 CLaMP-DPO 强化学习,无需人工标注即可优化音乐性,旋律流畅自然且富有变化。

NotaGen 通过大语言模型训练范式,将古典音乐创作门槛大幅降低,同时保证了专业级的乐理质量与艺术表现力。

运行环境要求

操作系统
  • Linux
  • Windows
GPU

必需 NVIDIA GPU,推理需 8GB+ 显存 (NotaGen-X),训练或运行 NotaGen-large 需 24GB+ 显存,CUDA 11.8

内存

未说明

依赖
notes预训练权重不可直接用于条件生成,需微调;强化学习阶段需单独下载配置 CLaMP 2 模型;数据需预处理为 ABC 格式;提供 Colab 和 ComfyUI 替代运行方案。
python3.10
torch==2.3.0
accelerate
optimum
NotaGen hero image

快速开始

🎵 NotaGen:利用大语言模型训练范式推进符号音乐生成 (Symbolic Music Generation) 中的音乐性

Paper    Weights    Space    Demo

NotaGen

📖 概述

NotaGen 是一个符号音乐生成 (Symbolic Music Generation) 模型,旨在探索生成高质量古典乐谱的潜力。受大语言模型 (Large Language Models, LLMs) 成功的启发,NotaGen 采用了三阶段训练范式:

  • 🧠 在 160 万首音乐作品上进行预训练 (Pre-training)
  • 🎯 在约 9000 首古典作品上进行微调 (Fine-tuning),使用 period-composer-instrumentation(时期 - 作曲家 - 配器)提示词
  • 🚀 使用我们新颖的 CLaMP-DPO 方法进行强化学习 (Reinforcement Learning)(无需人工标注或预定义奖励。)

查看我们的 演示页面 并欣赏由 NotaGen 创作的音乐!

⚙️ 环境设置

conda create --name notagen python=3.10
conda activate notagen
conda install pytorch==2.3.0 pytorch-cuda=11.8 -c pytorch -c nvidia
pip install accelerate
pip install optimum
pip install -r requirements.txt

🏋️ NotaGen 模型权重

预训练

我们提供了不同规模的预训练权重:

模型 (Models) 参数量 (Parameters) Patch 级解码器层数 (Patch-level Decoder Layers) Character 级解码器层数 (Character-level Decoder Layers) 隐藏层大小 (Hidden Size) Patch 长度 (上下文长度) (Patch Length (Context Length))
NotaGen-small 110M 12 3 768 2048
NotaGen-medium 244M 16 3 1024 2048
NotaGen-large 516M 20 6 1280 1024

注意:预训练权重不能用于基于 'period-composer-instrumentation' 的条件生成。

微调

我们在约 9000 首古典作品的语料库上对 NotaGen-large 进行了微调。您可以 此处 下载权重。

强化学习

在预训练和微调之后,我们使用 3 次迭代的 CLaMP-DPO 优化了 NotaGen-large。您可以 此处 下载权重。

🌟 NotaGen-X

受 Deepseek-R1 启发,我们进一步优化了 NotaGen 的训练流程,并发布了一个更好的版本 --- NotaGen-X。与论文中的版本相比,NotaGen-X 包含了以下改进:

  • 我们在预训练和微调之间引入了一个后训练 (post-training) 阶段,使用预训练数据集中的古典风格子集对模型进行优化。
  • 我们在微调阶段移除了调性增强 (key augmentation),使得生成作品的乐器范围更加合理。
  • 在强化学习 (RL) 之后,我们利用生成的检查点 (checkpoint) 收集了一组新的后训练数据。从预训练检查点开始,我们进行了另一轮后训练、微调和强化学习。

如果您想为 NotaGen-X 添加新的作曲家风格,请参阅 issue #18 获取更多说明 :D

🎹 演示

在线 Gradio 演示

我们在 Huggingface Space 上为 NotaGen-X 开发了一个 在线 gradio 演示。您可以输入 "Period-Composer-Instrumentation"(时期 - 作曲家 - 配器) 作为提示词,让 NotaGen 生成音乐,预览音频/乐谱 PDF,并下载它们 :D

NotaGen Gradio Demo

本地 Gradio 演示

我们为 NotaGen-X 开发了一个本地 Gradio 演示。您可以输入 "Period-Composer-Instrumentation"(时期 - 作曲家 - 配器) 作为提示词,让 NotaGen 生成音乐!

NotaGen Gradio Demo

本地部署 NotaGen-X 推理可能需要 8GB 显存 (GPU memory)。有关实现细节,请查看 gradio/README.md。我们也在努力开发在线演示。

在线 Colab 笔记本

感谢 @deeplearn-art 贡献的 NotaGen Google Colab 笔记本! 您可以运行它并访问 Gradio 公共链接来体验此演示。🤩

ComfyUI

感谢 @billwuhao 贡献的 NotaGen ComfyUI 节点! 它可以自动将生成的 .abc 文件转换为 .xml、.mp3 和 .png 格式。您也可以聆听生成的音乐并查看乐谱!请访问 仓库页面 获取更多信息。🤩

NotaGen ComfyUI

🛠️ 数据预处理与后处理

关于 ABC 记谱法(ABC notation) 文件与 MusicXML(音乐标记语言) 文件之间的互转,请查看 data/README.md 获取说明。

为了说明具体的数据格式,我们提供了一个来自 OpenScore Lieder舒伯特艺术歌曲(Schubert's lieder) 作曲小型数据集,其中包括:

  • 🗂️ 交错 ABC 文件夹(Interleaved ABC folders)
  • 🗂️ 增强 ABC 文件夹(Augmented ABC folders)
  • 📄 用于训练和评估的数据索引文件

您可以 此处 下载并将其放在 data/ 目录下。

在下方的 微调(Fine-tuning)强化学习(Reinforcement Learning) 说明中,我们将使用此数据集作为我们实现的示例。它不包含“时期 - 作曲家 - 配器(period-composer-instrumentation)”条件控制(conditioning),仅用于展示如何将预训练的 NotaGen 适配到特定的音乐风格。

🧠 预训练

如果您想使用自己的数据预训练一个空白的 NotaGen 模型,请:

  1. 按照 data/README.md 中的说明预处理数据并生成数据索引文件
  2. 修改 pretrain/config.py 中的参数

使用以下命令进行预训练:

cd pretrain/
accelerate launch --multi_gpu --mixed_precision fp16 train-gen.py

🎯 微调

这里我们提供一个使用上述 舒伯特艺术歌曲(Schubert's lieder) 数据微调 NotaGen-large 的示例。

注意: 使用 NotaGen-large 进行训练和推理至少需要 24GB 显存(GPU memory)。或者,您可以使用 NotaGen-smallNotaGen-medium 并在 finetune/config.py 中更改模型配置。

配置

  • finetune/config.py 中:
    • 修改 DATA_TRAIN_INDEX_PATHDATA_EVAL_INDEX_PATH
      # Configuration for the data
      DATA_TRAIN_INDEX_PATH = "../data/schubert_augmented_train.jsonl" 
      DATA_EVAL_INDEX_PATH  = "../data/schubert_augmented_eval.jsonl"
      
    • 下载预训练的 NotaGen 权重(weights),并修改 PRETRAINED_PATH
      PRETRAINED_PATH = "../pretrain/weights_notagen_pretrain_p_size_16_p_length_1024_p_layers_20_c_layers_6_h_size_1280_lr_0.0001_batch_4.pth"  # Use NotaGen-large
      
    • EXP_TAG 用于区分模型。它将整合进 检查点(ckpt) 的名称中。这里我们将其设置为 schubert
    • 您也可以修改其他参数,如学习率。

执行

使用以下命令进行微调:

cd finetune/
CUDA_VISIBLE_DEVICES=0 python train-gen.py

🚀 强化学习(CLaMP-DPO)

这里我们提供一个如何使用 CLaMP-DPO 增强使用 舒伯特艺术歌曲(Schubert's lieder) 数据微调后的模型的示例。

⚙️ CLaMP 2 设置

下载模型权重并将它们放在 clamp2/ 文件夹下:

🔍 提取真实值(Ground Truth)特征

修改 clamp2/extract_clamp2.py 中的 input_diroutput_dir

input_dir = '../data/schubert_interleaved'  # interleaved abc folder
output_dir = 'feature/schubert_interleaved'  # feature folder

提取特征:

cd clamp2/
python extract_clamp2.py

🔄 CLaMP-DPO

这里我们提供一个 CLaMP-DPO(基于 CLaMP 的直接偏好优化 Direct Preference Optimization)迭代示例,起始模型是在 Schubert's lieder(舒伯特艺术歌曲)数据上进行 fine-tuned(微调)的模型。

1. Inference(推理)

  • inference/config.py 中将 INFERENCE_WEIGHTS_PATH 修改为 fine-tuned(微调)权重的路径,并将 NUM_SAMPLES 修改为要生成的样本数量:
      INFERENCE_WEIGHTS_PATH = '../finetune/weights_notagen_schubert_p_size_16_p_length_1024_p_layers_20_c_layers_6_h_size_1280_lr_1e-05_batch_1.pth'              
      NUM_SAMPLES = 1000                                               
    
  • 执行 Inference(推理):
    cd inference/
    python inference.py
    
    这将生成一个 output/ 文件夹,包含两个子文件夹:originalinterleavedoriginal/ 子目录存储模型的原始推理输出,而 interleaved/ 子目录包含经过 rest measure completion(休止符小节补全)后处理的数据,兼容 CLaMP 2。每个子目录都将包含一个特定于模型的文件夹,命名为模型名称与其采样参数的组合。

2. 提取生成数据特征

修改 clamp2/extract_clamp2.py 中的 input_diroutput_dir

input_dir = '../output/interleaved/weights_notagen_schubert_p_size_16_p_length_1024_p_layers_20_c_layers_6_h_size_1280_lr_1e-05_batch_1_k_9_p_0.9_temp_1.2'  # interleaved abc folder
output_dir = 'feature/weights_notagen_schubert_p_size_16_p_length_1024_p_layers_20_c_layers_6_h_size_1280_lr_1e-05_batch_1_k_9_p_0.9_temp_1.2'  # feature folder

提取特征:

cd clamp2/
python extract_clamp2.py

3. 平均 CLaMP 2 Score(得分)统计(可选)

如果您关心当前模型的 平均 CLaMP 2 Score(Average CLaMP 2 Score),请修改 clamp2/statistics.py 中的参数:

gt_feature_folder = 'feature/schubert_interleaved'
output_feature_folder = 'feature/weights_notagen_schubert_p_size_16_p_length_1024_p_layers_20_c_layers_6_h_size_1280_lr_1e-05_batch_1_k_9_p_0.9_temp_1.2'

然后运行此脚本:

cd clamp2/
python statistics.py

4. 构建偏好数据

修改 RL/data.py 中的参数:

gt_feature_folder = '../clamp2/feature/schubert_interleaved'
output_feature_folder = '../clamp2/feature/weights_notagen_schubert_p_size_16_p_length_1024_p_layers_20_c_layers_6_h_size_1280_lr_1e-05_batch_1_k_9_p_0.9_temp_1.2'
output_original_abc_folder = '../output/original/weights_notagen_schubert_p_size_16_p_length_1024_p_layers_20_c_layers_6_h_size_1280_lr_1e-05_batch_1_k_9_p_0.9_temp_1.2'
output_interleaved_abc_folder = '../output/interleaved/weights_notagen_schubert_p_size_16_p_length_1024_p_layers_20_c_layers_6_h_size_1280_lr_1e-05_batch_1_k_9_p_0.9_temp_1.2'
data_index_path = 'schubert_RL1.json'  # Data for the first iteration of RL
data_select_portion = 0.1              

在此脚本中,将计算并排序每个生成乐曲的 CLaMP 2 Score(CLaMP 2 得分)。chosen(选中)和 rejected(拒绝)集中的数据比例由 data_select_portion 决定。此外,还有三条规则用于从选中集中排除有问题的乐谱:

  • 排除存在时长对齐问题的乐谱;
  • 排除可能抄袭 ground truth data(真实数据)的乐谱(ld_sim>0.95);
  • 排除同一仪器的 staves(谱表)未分组在一起的乐谱。

偏好数据文件将命名为 data_index_path,记录选中集和拒绝集中的文件路径。

运行此脚本:

cd RL/
python data.py

5. DPO(Direct Preference Optimization,直接偏好优化)训练

修改 RL/config.py 中的参数:

DATA_INDEX_PATH = 'schubert_RL1.json'  # Preference data path
PRETRAINED_PATH = '../finetune/weights_notagen_schubert_p_size_16_p_length_1024_p_layers_20_c_layers_6_h_size_1280_lr_1e-05_batch_1.pth'  # The model to go through DPO optimization
EXP_TAG = 'schubert-RL1'              # Model tag for differentiation

您也可以修改其他参数,如 OPTIMATION_STEPSDPO hyper-parameters(超参数)。

运行此脚本:

cd RL/
CUDA_VISIBLE_DEVICES=0 python train.py

训练完成后,一个名为 weights_notagen_schubert-RL1_beta_0.1_lambda_10_p_size_16_p_length_1024_p_layers_20_c_layers_6_h_size_1280_lr_1e-06.pth 的模型将保存在 RL/ 下。对于第二轮 CLaMP-DPO,请回到第一个推理阶段,让新模型生成乐曲。

对于这个基于 Schubert's lieder(舒伯特艺术歌曲)数据的小型实验,我们在此发布 fine-tuned(微调)模型及每次 CLaMP-DPO 迭代后模型的 平均 CLaMP 2 Score(Average CLaMP 2 Score),以供参考:

CLaMP-DPO 迭代次数 (K) 平均 CLaMP 2 Score
0 (微调后) 0.324
1 0.579
2 0.778

如果您对此方法感兴趣,欢迎在您自己的风格特定数据集上尝试 :D

📚 引用

如果您在工作中发现 NotaGenCLaMP-DPO 有用,请引用我们的论文。

@misc{wang2025notagenadvancingmusicalitysymbolic,
      title={NotaGen: Advancing Musicality in Symbolic Music Generation with Large Language Model Training Paradigms}, 
      author={Yashan Wang and Shangda Wu and Jianhuai Hu and Xingjian Du and Yueqi Peng and Yongxin Huang and Shuai Fan and Xiaobing Li and Feng Yu and Maosong Sun},
      year={2025},
      eprint={2502.18008},
      archivePrefix={arXiv},
      primaryClass={cs.SD},
      url={https://arxiv.org/abs/2502.18008}, 
}

常见问题

相似工具推荐

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架

PaddleOCR

PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来,转换成计算机可读取的结构化数据,让机器真正“看懂”图文内容。 面对海量纸质或电子文档,PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域,它扮演着连接图像与大型语言模型(LLM)的桥梁角色,能将视觉信息直接转化为文本输入,助力智能问答、文档分析等应用场景落地。 PaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显:不仅支持全球 100 多种语言的识别,还能在 Windows、Linux、macOS 等多个系统上运行,并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目,PaddleOCR 既能满足快速集成的需求,也能支撑前沿的视觉语言研究,是处理文字识别任务的理想选择。

74.9k|★★★☆☆|今天
语言模型图像开发框架

OpenHands

OpenHands 是一个专注于 AI 驱动开发的开源平台,旨在让智能体(Agent)像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点,通过自动化流程显著提升开发速度。 无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员,还是需要快速原型验证的技术团队,都能从中受益。OpenHands 提供了灵活多样的使用方式:既可以通过命令行(CLI)或本地图形界面在个人电脑上轻松上手,体验类似 Devin 的流畅交互;也能利用其强大的 Python SDK 自定义智能体逻辑,甚至在云端大规模部署上千个智能体并行工作。 其核心技术亮点在于模块化的软件智能体 SDK,这不仅构成了平台的引擎,还支持高度可组合的开发模式。此外,OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩,证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能,支持与 Slack、Jira 等工具集成,并提供细粒度的权限管理,适合从个人开发者到大型企业的各类用户场景。

70.6k|★★★☆☆|今天
语言模型Agent开发框架