YuE2 音乐编辑完整闭环:改一张 ABC 乐谱,重渲一整首录音
用 YuE2 音乐编辑,你只改乐谱不碰波形:把模型写出的 ABC 乐谱当接口,改和弦、速度或段落顺序,再重新渲染成完整录音。读完你能跑通"导出 → 校验 → 渲染 → 试听"整条链路。
白盒音乐生成:先落谱,再出声
想给一首歌换上爵士味和声,但旋律一个音都不能动。拿到黑盒模型手里,你只能描述需求、祈祷结果;YuE2 的白盒音乐生成思路是反过来的——先把创作意图落成一份可读可改的 ABC 乐谱(用纯文本记音高、时值、和弦与速度的记谱法),你改完谱,同一个生成器再把它渲染成音频。
流水线分四步:plan() 产出 SymbolicPlan(含 score.abc 与 token 序列),generate_semantic() 把乐谱编码成语义 token,synthesize() 与 decode() 再把 token 还原成 48 kHz 立体声。编辑、创建、翻唱三者的差别只在乐谱从哪来:模型自生成、转录而来,或人工与 Agent 修订。
要心里有数的一件事:每次编辑渲染出来的都是一整首新录音。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 / C8 | C4 的三十二分 / 十六分 / 四分音符 |
c、c'、C, | C5、C6、C3 |
z8 | 四分休止符 |
Z、Z4 | 休止 1 个 / 4 个完整小节 |
C8-C8 | 一个二分音符 C,第二个 token 不起新音 |
"Am7"z16 | A 小七从这里开始,旋律休止半个二分音符 |
⚠️ 三个最容易翻车的地方,以及正确写法:
| 坑 | 正确写法 |
|---|---|
临时记号按字母跨八度传播:^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 原始产物、独立指出问题,再与编辑方记录对账
闭环 = 导出 → 校验 → 渲染 → 试听,下一版改动就从谱子上那几行引号开始。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/gitblog_00863/article/details/156526813





