
YuE2 音乐生成与翻唱实战conditioning 模式、ABC 乐谱编辑、可复现分阶段管线与双解码器评测【免费下载链接】YuEYuE2: frontier music generation with symbolic planning, zero-shot covers, and agentic music editing.项目地址: https://gitcode.com/GitHub_Trending/yue/YuE本篇技术指南围绕 YuE2 推理运行时yue2-infer0.1.6讲解三条核心工作流从文本生成原创歌曲full / melody / off 三种条件化模式、基于乐谱或录音的翻唱cover、以及编辑乐谱后的再生成本与可复现评测。读完你将掌握yue2Python API 与 CLI 的完整调用方式、SymbolicPlan精确续跑的底层机制、CFG 与采样默认值以及如何用同一份 acoustic latents 分别驱动聆听版与评测版 VAE 解码。所有说明以本仓库 generation-and-covers.md 为骨架并结合 pipeline.py、protocol.py、cli.py 等源码级实现证据展开。前置条件接口版本、模型快照与可复现实验本指南基于yue2-infer0.1.6接口。使用前请先按 models-and-setup.md 完成安装并下载公开模型快照且每次运行都要记录包版本yue2-infer模型 revisionYuE2-3B与 VAE 的 commit / 本地快照权重哈希weights_manifest.json中的 sha256。在把某个新安装视为“复现实验”之前必须先跑出全新的输出进行验证而不是直接沿用历史结论。本仓库的yue2 doctor命令见 cli.py可输出 torch / transformers / huggingface-hub / safetensors / tiktoken / soundfile 的版本、CUDA 设备信息与模型路径供环境就绪性检查但它的报告字段明确标注validated: false并提示“环境就绪不等于 24GB 真实可跑”只适合作为排查起点。选择 conditioning 模式cot 与 ABC 输入的四种组合YuE2 的条件化由请求字段cotchain-of-thought 缩写这里指符号规划开关与外部 ABC 输入共同决定。官方文档给出了明确的决策表这里完整保留并补充源码层面的验证逻辑任务cotABC 输入从文本生成旋律、和声与音频full省略YuE2 自行规划带和弦的旋律先生成一条旋律再生成音频melody省略YuE2 规划不带和弦符号的旋律直接从文本生成音频off必须省略用另一种风格翻唱现有旋律melody提供去掉和弦符号的 melody-only ABC重新配和声或编辑乐谱full提供编辑后的旋律-和弦 ABC以下几点是实操中常见的误用务必注意这些模式会各自选择不同的原生指令见 protocol.py 中INSTRUCTIONS的定义不要在 style prompt 里粘贴你自己的替换指令外部 ABC 输入会绕过符号规划器但并不会再调用第二个规划器去“修补”乐谱——输入什么乐谱语义阶段就按什么乐谱生成cotmelody不会自动从输入文件中删除和弦符号需要先用 ABC 工具显式 strip-chords见下文翻唱一节。请求字段全集与不存在的字段YuE2 的歌曲请求只接受style、lyrics、cot、seed、abc、cfg_scale、id这几个字段CLI 另有abc_sampling/semantic_sampling采样覆盖。其中tags是style的别名两者同时给出时必须一致否则 pipeline.py 中的_request会直接抛出ValueError(style and tags are aliases and cannot disagree)请求中没有reference_audio、phonemes、bpm、negative_prompt、编辑区间、参考歌手等字段速度和拍号请写进 ABC并在 style 中一致地描述发音与音符对齐说明应放在验证 sidecar 中它们不是硬性 conditioning 输入。从 protocol.py 的SongRequest校验可以看出更多约束cot必须是off/melody/full三者之一seed必须是[0, 2**63)内的整数id必须是文件名安全的标识符[A-Za-z0-9][A-Za-z0-9_.-]{0,179}cfg_scale必须在[0, 20]且有限当cotoff时外部 ABC 会被拒绝。生成并保存全部三种模式下面的示例使用本地已验证快照把目录变量换成你在 setup 阶段获得的快照路径即可把完整的分段歌词保存在lyrics.txt然后串行运行三个 pipelineimport os from pathlib import Path from yue2 import YuE2Pipeline model os.environ[YUE2_MODEL_DIR] listening_vae os.environ[YUE2_LISTEN_VAE_DIR] style ( English, warm female vocal, contemporary pop, 96 BPM, piano, rounded electric bass, restrained drums, clear diction ) lyrics Path(lyrics.txt).read_bytes().decode(utf-8) with YuE2Pipeline.from_pretrained( model, vaelistening_vae, devicecuda, local_files_onlyTrue, ) as pipe: for mode in (full, melody, off): output Path(outputs) / foriginal_{mode} output.mkdir(parentsTrue, exist_okFalse) song pipe( idforiginal_{mode}, stylestyle, lyricslyrics, cotmode, seed831001, ) receipt song.save_artifacts(output) print(mode, receipt[status], receipt[truncated])要点说明from_pretrained(model, vae..., devicecuda, local_files_onlyTrue)表示从本地目录加载local_files_onlyTrue对应离线运行如果要从 Hub 加载则使用from_pretrained(repo, revisionmodel_revision, vaevae_repo, vae_revisionvae_revision, devicecuda)revision 必须是独立验证过的提交。cache_dir、token和local_files_only都被支持token 应放在认证环境变量中不要写进脚本和 manifestoutput.mkdir(parentsTrue, exist_okFalse)强制使用全新目录——Python 的保存方法会覆盖已存在文件因此要求目标目录为空storage.py 的copy_model_files同样拒绝非空目标。从源码看一次pipe(...)调用内部等价于 pipeline.py 的完整链路plan()符号规划→generate_semantic()语义 token→synthesize()合成 acoustic latents→decode()VAE 解码为 48 kHz 音频并把各阶段耗时、权重身份与请求身份写入SongResult。save_artifacts 保存了什么save_artifacts会把一次运行的全部可复现资产写入目录见 pipeline.pyaudio.flac48 kHz 立体声 FLACscore.abc适用时规划或输入的原生 ABC 乐谱精确的 ABC token IDs 与 prefixabc_tokens.npy、prefix.npy及plan.json/plan_manifest.json语义 tokensemantic.npyacoustic latentslatent.npy请求request.json、配置config.json、时序timing、解码器身份weights与所有文件的 sha256 哈希result.json中的artifacts字段。如果你只需要音频可以用song.save(song.flac)或song.save(song.wav)pipeline.py 校验扩展名只能是.flac/.wavMP3 属于单独的交付转换。再次强调statuscomplete并不等于歌曲未被截断。必须同时检查 ABC 与语义两路截断标志receipt[truncated]返回{abc: ..., semantic: ...}然后核对时长、结尾、可听性以及请求的音乐行为是否成立。导出、编辑与再生成本固定基线乐谱先只生成一次完整规划保持该目录不可变然后复制score.abc进行编辑在合成前先验证编辑后的乐谱from pathlib import Path from yue2 import YuE2Pipeline with YuE2Pipeline.from_pretrained( model, vaelistening_vae, devicecuda, local_files_onlyTrue, ) as pipe: original_dir Path(outputs/original_plan) original_dir.mkdir(parentsTrue, exist_okFalse) plan pipe.plan( idoriginal, stylestyle, lyricslyrics, cotfull, seed831001, ) plan.save(original_dir) # Copy the score to edits/jazz.abc; edit and validate it in a separate step.pipe.plan(...)只执行符号规划阶段cotoff时没有符号规划直接返回空 ABC 的SymbolicPlanpipeline.py。plan.save(original_dir)写入score.abc、abc_tokens.npy、prefix.npy、plan.json和带哈希的plan_manifest.json。编辑并再生成本编辑好的乐谱文件存在后用新的风格和abcedited_abc重新生成jazz_style ( English, intimate female jazz vocal, relaxed 88 BPM, piano, tenor saxophone, upright bass, brushed drums, no guitar, spacious modern harmony, natural English phrasing ) edited_abc Path(edits/jazz.abc).read_bytes().decode(utf-8) output Path(outputs/jazz_edit) output.mkdir(parentsTrue, exist_okFalse) with YuE2Pipeline.from_pretrained( model, vaelistening_vae, devicecuda, local_files_onlyTrue, ) as pipe: song pipe( idjazz_edit, stylejazz_style, lyricslyrics, cotfull, seed831001, abcedited_abc, ) song.save_artifacts(output)这会在修正后的音乐条件下重新生成整首歌但不承诺未编辑段落的波形、歌手身份或演奏完全不变固定 seed 只是让对比更容易追踪不同条件仍然会产生不同音频。编辑乐谱前请先阅读 abc-editing.md 了解原生 ABC 方言的约束如L:1/32节奏网格、升降号按字母跨八度传播、Z整小节休止等。Agentic 编辑约束优先做 agentic智能体编辑时把导出的乐谱、原始请求和显式不变量交给音乐编辑 agent要求返回一份编辑后的 ABC 文件以及一份逐小节bar-by-bar变更记录渲染前验证旋律保持如要求、和弦时序与兼容性、拍号、连音线ties、乐句长度与歌词音节数英文歌词改动即使音节数与旧词一致通常仍需要调整重音stress与元音时长vowel duration。run_yue2.py与abc_tools.py提供了配套检查见 skills/yue2-music/scriptsinspect检查原生方言结构compare做精确的旋律/音符不变量比较strip-chords生成无和弦 ABC。从乐谱或录音做翻唱基于乐谱score-based cover使用验证过的 melody-only ABC无和弦符号与目标歌词melody_abc Path(edits/source_melody.abc).read_bytes().decode(utf-8) with YuE2Pipeline.from_pretrained( model, vaelistening_vae, devicecuda, local_files_onlyTrue, ) as pipe: output Path(outputs/cover) output.mkdir(parentsTrue, exist_okFalse) song pipe( idcover, stylejazz_style, lyricslyrics, cotmelody, seed831001, abcmelody_abc, ) song.save_artifacts(output)基于录音audio-based cover对源录音先用SheetSage2转写人工复核旋律与节奏后移除和弦标注再走与上面完全相同的调用。转写模型链参见 models-and-setup.md典型链路为source audio → SheetSage2自动加载 MERT-v2-FullSong 父模型→ melody_onlyTrue → 检查/修正无和弦旋律 ABC → YuE2-3B with cotmelody 目标风格 目标歌词 → acoustic latents → YuE2-Vae → 聆听音频需要记住的边界源分离、转写、歌词识别、乐谱条件生成是四个不同的操作。该接口没有直接的“音频上传”参数且 YuE2 的 VAE encoder不能替代旋律转写——不要试图用latent.npy反推旋律。cotmelody也不会自动剥掉输入 ABC 里的和弦符号需先用abc_tools.py strip-chordsskills/yue2-music/scripts/abc_tools.py显式处理该工具默认保留 Vocal 与 Ins 两条旋律--keep-voice Vocal可只保留指定声部。精确保留各阶段输出SymbolicPlan 续跑与禁止项官方支持的分阶段续跑序列是from yue2 import SymbolicPlan plan SymbolicPlan.load(outputs/original_plan) with YuE2Pipeline.from_pretrained( model, vaelistening_vae, devicecuda, local_files_onlyTrue, ) as pipe: semantic pipe.generate_semantic(plan) latents pipe.synthesize(semantic) audio pipe.decode(latents)这是从原始 plan 继续不会对 ABC 做解码再重新 tokenize。SymbolicPlan.loadpipeline.py会校验plan_manifest.json中所有文件的 sha256、token 数组的一维整数性以及 ABC 文本一致性任何人为修改已保存 plan 目录内文件的行为都会让校验失败——修订乐谱必须走新的请求而不是改文件。同时要明确以下限制不存在SemanticResult.load、SongResult.load或通用的自动断点续跑partial-resume机制阶段调用返回的是对象/数组如果你自建分阶段 runner必须显式保存plan、精确语义 token、latent 数组与 provenance编辑 style、歌词或 ABC 后必须重新做语义生成与合成synthesize缓存 latents 只在只换解码器时可复用音乐内容一旦变化latents 必须重新生成。用同一份 latents 做聆听与评测双解码YuE2 提供两个 VAE聆听/默认版本用YuE2-Vae复现文档记录的 benchmark 解码器时用YuE2-Vae-legacy。记录时要写完整的模型名与哈希不要凭 “legacy” 这个词推断时间先后并且两份音频及其 manifest 要分开存放。下面的例子加载解码器但不重新生成歌曲只对已保存的latent.npy解码并写出带哈希与解码器身份的 manifestimport hashlib import json import numpy as np import soundfile as sf evaluation_vae os.environ[YUE2_EVAL_VAE_DIR] source Path(outputs/jazz_edit/latent.npy) latents np.load(source, allow_pickleFalse) output Path(evaluation/jazz_edit) output.mkdir(parentsTrue, exist_okFalse) def sha256(path): digest hashlib.sha256() with Path(path).open(rb) as stream: for block in iter(lambda: stream.read(8 * 1024 * 1024), b): digest.update(block) return digest.hexdigest() with YuE2Pipeline.from_pretrained( model, vaeevaluation_vae, devicecuda, local_files_onlyTrue, ) as decoder: audio decoder.decode(latents) sf.write(output / audio.flac, audio, 48000, subtypePCM_24) manifest { operation: decode_cached_latents, decoder_role: evaluation, weights: decoder.weights, latent_sha256: sha256(source), audio_sha256: sha256(output / audio.flac), sample_rate: 48000, decoder_dtype: float32, core_frames: decoder.vae_core_frames, halo_frames: 16, } (output / decoder.json).write_text( json.dumps(manifest, indent2) \n, encodingutf-8, )技术细节接受的 latent 形状为[T,64]或[1,64,T]返回数组为 samples × 2 声道pipeline.py 会做转置、tile 解码默认 512/1024 core frames 16 halo frames与[-1,1]截断不要把这颗新音频塞进旧的SongResultmanifest——旧 manifest 的 decoder identity 描述的是聆听版 VAEdecode(..., vae...)也存在但它不接受单独的 revision 参数要么用已验证的本地快照要么像上面一样单独配置一条 pipeline本仓库 run_yue2.py decode 正是这一做法的封装还额外校验--model必须与源生成的模型身份一致。CLI 等价命令与 resume 行为给定包含id、style、lyrics、可选seed的请求 JSONCLI 等价命令如下yue2 generate --request requests/original.json --cot full --output outputs/full yue2 generate --request requests/original.json --cot melody --output outputs/melody yue2 generate --request requests/original.json --cot off --output outputs/off yue2 generate --request requests/original.json --stage plan --output outputs/plan yue2 generate --request requests/jazz.json --cot full --abc-file edits/jazz.abc --output outputs/edited yue2 generate --request requests/cover.json --cot melody --abc-file edits/source_melody.abc --output outputs/cover yue2 batch --input requests/all.jsonl --output outputs/batch传本地已验证快照时加--model、--vae和--offline用 Hub 快照时再加--revision与--vae-revisionCLI 输出嵌套在--output/request-id/下JSON 中可以使用相对请求文件解析的abc_pathPython API 则接收abc文本batch 要求所有请求 id 唯一且串行执行cli.py 中concurrency被强制为 1并逐行校验 id 唯一性--resume只验证并复用已完成的匹配结果含其哈希见 storage.py 的verify_result不会续跑中断的 AR/NAR 生成不完整运行、或任何请求/模型/配置发生变化时请使用全新目录CLI 的阶段只有plan与audio没有独立的 semantic / synthesis / decode 子命令。CFG、默认值与评测边界语义 CFG 的默认值与覆盖语义 CFG 默认在full/melody下为1.0在off下为1.01见 protocol.py 的guidance属性显式实验可传cfg_scale1.2或 CLI--cfg-scale 1.2校验范围[0, 20]——它不是保证的听感提升有乐谱时negative 分支保留相同的指令与精确 ABC仅移除 style 与歌词protocol.py 的negative_prefixoff模式的 negative 分支只保留指令pipeline.py 记录为instruction_onlyABC 规划本身没有 CFG。标准预设与硬件基线标准预设preset为AR/NAR 使用 BF16VAE 使用 FP32合成步数 32 步 midpoint ODE上下文 24576见 protocol.py 的GenerationConfig其中context被强制等于 24576、ode_method强制 midpoint。可复现对比请保持该预设不变。受支持的基线环境是支持 BF16 的 NVIDIA GPU24 GB 显存每个 pipeline 同时只处理一个请求。可选的 backendtorch/torch-eager/vllm或精度变化如fp8量化需要各自独立验证不要为让基线跑通而悄悄缩短歌曲或降低合成步数——这是明确禁止的“隐藏 OOM”式操作。相关测试 test_cli_public.py 也验证了公开包只暴露doctor/generate/batchverify/bench/eval等命令会被拒绝。评测范围的边界公开运行时提供yue2 doctor、generate、batch与 Python API冻结的 benchmark 评测需要单独的评分代码与资产参见 listening-and-evaluation.md。SongBench 分数、ASR/PER、乐谱检查与人工聆听回答的是不同的问题报告应如实列出实际执行的检查并保留失败记录、截断标志与每种请求模式没有任何单一指标能单独证明音频中实现了精确的乐谱或音素对齐——ABC 校验通过不等于听感成立转写结果也不应被当成生成器的“错误”证据。小结把以上环节串起来一条可复现的 YuE2 工作流是固定已验证快照 → 按任务选择 cot/ABC 条件 → 一次性生成 full/melody/off 三种模式并save_artifacts→ 对 full 模式只规划一次并把原始目录冻结 → 复制并编辑score.abc用 abc-editing.md 与abc_tools.py验证→ 用abcedited_abc或--abc-file再生成本 → 需要翻唱时从 SheetSage2 转写并 strip-chords 后走cotmelody→ 最后用同一份latent.npy分别驱动YuE2-Vae与YuE2-Vae-legacy双解码manifest 中完整记录请求、配置、权重身份与哈希。坚持记录哈希与截断标志、不覆盖旧结果、不把“跑完”当“成功”就能让每一次生成、改编与评测都成为可追溯、可对比的严肃实验。【免费下载链接】YuEYuE2: frontier music generation with symbolic planning, zero-shot covers, and agentic music editing.项目地址: https://gitcode.com/GitHub_Trending/yue/YuE创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考