苗伊姬Desmond头像

YuE2 音乐编辑完整闭环:改一张 ABC 乐谱,重渲一整首录音

YuE2 音乐编辑完整闭环:改一张 ABC 乐谱,重渲一整首录音

【免费下载链接】YuE YuE2: frontier music generation with symbolic planning, zero-shot covers, and agentic music editing. 【免费下载链接】YuE 项目地址: https://gitcode.com/GitHub_Trending/yue/YuE

用 YuE2 音乐编辑,你只改乐谱不碰波形:把模型写出的 ABC 乐谱当接口,改和弦、速度或段落顺序,再重新渲染成完整录音。读完你能跑通"导出 → 校验 → 渲染 → 试听"整条链路。

白盒音乐生成:先落谱,再出声

想给一首歌换上爵士味和声,但旋律一个音都不能动。拿到黑盒模型手里,你只能描述需求、祈祷结果;YuE2 的白盒音乐生成思路是反过来的——先把创作意图落成一份可读可改的 ABC 乐谱(用纯文本记音高、时值、和弦与速度的记谱法),你改完谱,同一个生成器再把它渲染成音频。

流水线分四步:plan() 产出 SymbolicPlan(含 score.abc 与 token 序列),generate_semantic() 把乐谱编码成语义 token,synthesize() 与 decode() 再把 token 还原成 48 kHz 立体声。编辑、创建、翻唱三者的差别只在乐谱从哪来:模型自生成、转录而来,或人工与 Agent 修订。

YuE2 音乐编辑架构:风格与歌词经可编辑 ABC 乐谱、语义 token 与声学隐变量渲染为音频

要心里有数的一件事:每次编辑渲染出来的都是一整首新录音。YuE2 不做波形局部 inpainting,符号层面"不变"也不保证改动之外的小节在音色、演唱与波形上跟原版一致——所以下面每一步都先校验、再渲染、最后靠耳朵验收。

用 abc_tools.py 校验和声重配的最小实验

仓库里 examples/score.abc 与 examples/score-jazz.abc 是一对现成 fixture:旋律、歌词顺序、节拍、速度、风格、种子完全相同,唯一差别是后者把 C、G、Am、F 四个三和弦改写为 Cmaj7、G7、Am7、Fmaj7。这就是"和声重配不破坏旋律"的最小实验台。

把仓库拉到本地后依次执行(以下命令都以仓库根目录为工作目录):

git clone https://gitcode.com/GitHub_Trending/yue/YuE
cd YuE
python skills/yue2-music/scripts/abc_tools.py inspect examples/score.abc
python skills/yue2-music/scripts/abc_tools.py inspect examples/score-jazz.abc

两条 inspect 各自在回答:这份谱子符不符合原生两声部方言、能否被解析?通过后会拿到精确事件报告——onset、MIDI 音高、时值都是精确分数;但它只声明结构合法,不代表听感没问题。

python skills/yue2-music/scripts/abc_tools.py compare \
  examples/score.abc examples/score-jazz.abc

它在回答:两版的发声音符、onset、时值与拍号网格是否逐项相同?预期得到 match: true——这一步有意不比较和声,差异只该出现在引号里。

python examples/generate.py --abc-file examples/score.abc \
  --cot full --output outputs/harmony-before
python examples/generate.py --abc-file examples/score-jazz.abc \
  --cot full --output outputs/harmony-after

这两条各渲染一个版本,回答"新和声到底被实现了没有"——答案只能靠耳朵,分别试听两个目录里的 audio.flac。generate.py 拒绝写入已存在的目录,所以每个版本都要用全新输出目录;--request 默认读取同目录的 song.json,--abc-file 会把文件内容写进请求的 abc 字段,--cot 限定 full/melody/off 三选一,提供乐谱时不允许 off。

🔎 跑完这组命令再看 abc_tools.py 的另外两个能力,各司其职:inspect 保证结构合法并导出精确事件,不保证音乐正确,更不碰音频;compare 保证两版谱的发声音符序列与小节网格一致(默认还要求四分音符速度相同,加 --allow-tempo-change 才放行改速度),不保证生成音频一致,也不比和声;strip-chords 只删乐谱行里的引号和弦符号,并自证所有发声音符、onset、时值、拍号、速度未变,不替你判断翻唱效果——配合 cot="melody" 使用时,run_yue2.py 的预检会直接拒绝仍带和弦的 melody 输入。

解析器是 fail-closed 的:遇到连音、装饰音、反复记号、w: 歌词字段等不支持内容会直接抛错,而不是猜一个时值。退出码就是分层信号:inspect 结构失败退出码 2,compare 不一致退出码 1,通过则是 0——被拒的谱子可能只是记谱需要转换,不能把它当成音乐错误。

plan 导出 ABC 乐谱:给 Agent 委托编辑写边界简报

从零开始编辑时,先用 plan 子命令导出完整计划(等价于 pipe.plan(),保存 score.abc、token 序列与原生产物):

python skills/yue2-music/scripts/run_yue2.py plan \
  --request examples/song.json --output outputs/plan
cp outputs/plan/score.abc edited.abc

第一条生成并落盘计划目录,第二条把乐谱复制成独立文件——原版目录原封不动,后续改动全发生在副本上。

请求文件是 examples/song.json 这样的结构(节选),改歌时只动目标字段:

{
  "style": "English, warm piano pop, expressive female voice, acoustic piano, rounded bass and light drums, lyrical memorable melody, unhurried phrasing, 88 BPM",
  "lyrics": "[Verse]\nNeon fades along the lane\nFootsteps keep the time of rain\n…",
  "cot": "full",
  "seed": 831001
}

把编辑交出去时,别只丢一句"make this jazzy"。有边界的简报要写清改什么、锁什么、交付什么,可以这样表述:

用爵士风格的和弦为这首歌重新配和声。人声与器乐的全部旋律音符、每个音符的时值、小节边界、段落顺序、速度统统不动;歌词与风格字段保持原样,方便前后对比。保存一份新的 ABC 文件,并逐小节说明改了哪些和弦、为什么。

之后照例 inspect + compare 校验,再 generate.py --abc-file edited.abc 渲染。改歌词要贴合旋律分句与音节数,别逐字翻译;改风格要同步更新 style 字段与 Q:1/4=<BPM>;改曲式时两个声部的谱与歌词段落要同步增删。生成 API 只接收歌词和 ABC,没有强制音素对齐通道——音节与音符的对应关系记在旁车 JSON/Markdown 里,不要往谱里塞 w: 字段。

原生方言速查:abc_tools.py 校验不过多半是这三类坑

abc_tools.py 是纯标准库实现的有界解析器,不是通用 ABC 解析器。原生格式长这样:

X:1
T:
M:4/4
L:1/32
Q:1/4=88
V: Vocal clef=treble name="Vocal Melody" snm="Vocal"
V: Ins clef=treble name="Ins Melody" snm="Inst."
K:G
% verse
V: Vocal
"Gmaj7"B8d8"Am7"c8A8|"D7"F16"G"G16|
V: Ins
Z2|

头部要求固定的 X:1、空 T:、整数 BPM 的 Q:1/4=,两个声部定义逐字保留;和弦符号只能写在 Vocal 声部的引号里,哪怕该声部正在休止。两个声部都是单旋律线,Ins 承载器乐主题或独奏,不是钢琴和弦织体谱。导出按 1~4 小节一组输出 V: Vocal 块加 V: Ins 块,% verse、% chorus 注释标记结构;拍号或调号变化开新组,且两声部必须同时携带匹配的 M:/K:。L:1/32 常见但不必然,导出给多少分母就保留多少。

以 L:1/32 为例的记谱速查(其他分母按比例换算):

记谱含义
C / C2 / C8C4 的三十二分 / 十六分 / 四分音符
c、c'、C,C5、C6、C3
z8四分休止符
Z、Z4休止 1 个 / 4 个完整小节
C8-C8一个二分音符 C,第二个 token 不起新音
"Am7"z16A 小七从这里开始,旋律休止半个二分音符

⚠️ 三个最容易翻车的地方,以及正确写法:

坑正确写法
临时记号按字母跨八度传播:^F 之后,同一小节的 F 和 f 都是升想还原就明写 =F;换小节或变调才重置。别换成语义不同的通用 ABC 解析器悄悄重解析
Z 按整小节计数,不按 L 单位:4/4 里 Z4 是四个休止小节需要精确到拍就写 z8 这类单位休止;和声或调号变化处不要用压缩休止跨过
休止符不可连音、连音必须连接等音高、谱尾不能有未解决连音延续音写 C8-C8;写成 C8C8 会变成两次起音的断奏,音高序列相近,发音已变

和弦词表同样是封闭的:大调(无后缀)、m、dim、aug、7、maj7、m7、dim7、m7b5、sus4、sus2、6、m6、7sus4、m(maj7);根音与可选斜杠低音用音名,如 Dbaug、F#m7/C#、A7/E。C13、A7alt、C:maj 不是原生符号——想要更丰富的织体,写进 style 提示词,那是生成请求,不是承诺。

SKILL.md 技能包:Agent 委托编辑的交付前自检

在支持 SKILL.md 技能包的 Agent 里加载 skills/yue2-music/SKILL.md,即可拿到生成、转录、ABC 检查、缓存解码与试听对比的完整编排——它只在既有 API 之间做调度,不需要单独的"智能体编辑专用"检查点。委托之前先把契约写进简报:"保留旋律"到底指精确音高加节奏、同音高改节奏、可辨识主题,还是边界内的自由改编;契约允许节奏或旋律变化时,compare 精确比较失败属于预期行为,要审计它报告的第几个音符起差异,而不是把失败标成"已保留"。

交付前逐项过一遍清单(细节见 references/abc-editing.md 的收尾要求):

  •  基线版本已渲染并冻结原始产物目录;本次版本使用了全新输出目录
  •  简报写明了契约:哪些声部/段落、歌词、速度、节拍不可变,"保留"的准确含义是什么
  •  编辑方返回新 ABC、修订后的请求、编辑清单与音乐理由,逐小节说明已核过
  •  abc_tools.py inspect 通过(原生结构 OK),compare 结果与契约预期一致
  •  完整录音已试听,重点听改动小节及其过渡;确认 song.truncated 没有截断
  •  原始与编辑后的 ABC、风格、歌词、种子、校验记录和音频全部留档
  •  独立评审先看过 before/after 原始产物、独立指出问题,再与编辑方记录对账

YuE2 白盒音乐生成与 ABC 乐谱编辑能力一览

闭环 = 导出 → 校验 → 渲染 → 试听,下一版改动就从谱子上那几行引号开始。

【免费下载链接】YuE YuE2: frontier music generation with symbolic planning, zero-shot covers, and agentic music editing. 【免费下载链接】YuE 项目地址: https://gitcode.com/GitHub_Trending/yue/YuE

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/gitblog_00863/article/details/156526813

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--