深呼吸女声翻唱-制作记录.md

《深呼吸》女声翻唱版 · 制作记录

日期:2026-09-16 源曲:羽泉《深呼吸》(用户提供的 MP3,4:59 / 44.1kHz) 声线参考:金莎《星月神话》(用户提供的 MP3,4:09)—— 只作音色/音区参考 管线:SheetSage2 提取旋律 → 整谱移调 → YuE2 cot=melody 重渲染(人声+伴奏全新生成)


一、交付清单

文件时长格式说明
01-深呼吸-女声翻唱-金莎音区.flac / .mp34:5648kHz 立体声主推:旋律升 5 半音,落在金莎的声线区间
02-深呼吸-女声翻唱-原调版.flac / .mp35:0148kHz 立体声备选:保持原调,仅换音色
脚本/——本次用到的全部脚本(可复现)

歌词文件是流水线输入,未随交付发布。


二、先说清技术边界(重要)

YuE2 不做音色克隆。 官方 README 明确写:

Reference audio is used to extract a symbolic score; it does not clone the original singer. This is not voice cloning and does not preserve the original waveform.

所以"借金莎的少女声线"我落实为两件可验证的事,而不是克隆:

  1. 音区对齐:测出金莎在《星月神话》里的人声基频区间,把翻唱旋律移调到同一音区(客观可测);
  2. 音色描述:在风格提示词里用文本描述她的音色特征(纤细、纯净、气声、清亮、少女感),由模型据此塑造音色。

不能保证的是"听起来就是金莎本人"——那需要专门的音色克隆/转换模型(如 RVC、so-vits 之类),YuE2 链路做不到。


三、管线(这版和第 2 首"战场纯音乐"不同的地方)

源曲 MP3
  └─ ffmpeg 去 ID3 转 FLAC          ← 见"坑 1"
      └─ SheetSage2 转谱(melody_only=true)
          └─ 得到纯旋律 ABC(无人声、无和弦,只有 Vocal 声部 + Ins 休止)
              ├─ ABCModifier 整谱移调 +5 半音(调号 Ab→Db 同步)
              ├─ MelodyCleanup light(清理过短/离群音符)
              └─ YuE2 Sampler(cot=melody + abc + 新歌词段落 + 新风格提示词)
                  └─ 48kHz 立体声翻唱

关键点:cot=melody 且只喂旋律 ABC(不给和弦)→ 伴奏由模型按新风格自由生成,所以移调不会与伴奏打架。


四、客观验收数据

1) 人声基频(YIN 算法,同一把尺子量三条轨)

轨道中位 F05–95% 音域判定
原唱·羽泉(男)223 Hz (A3)A2 – G#4高音男声
参考·金莎(女)299 Hz (D4)A3 – A#4甜美女声
翻唱 v2·金莎音区312 Hz (D#4)G3 – A#4与参考中位差 0.7 半音,上限完全一致
(对照)翻唱 v1·原调236 Hz (A#3)D#3 – F4比参考低 4.1 半音

→ v2 把翻唱搬进了金莎的音区,这是"借鉴声线"里唯一能客观验证的部分。

2) 旋律保真度(确认是同一首歌,不是另写一首)

对翻唱重新转谱后与原曲旋律对比:

指标值含义
旋律音程分布余弦相似度0.988接近 1.0 → 旋律走向与原曲一致(移调不变量)
转谱音符数原 613 / 翻唱 550同一量级
中位音高差(ABC 口径)+3 半音与移调设定同向(口径不同于 F0 帧加权)

3) 生成开销

版本端到端semantic tokens峰值显存
v1(原调)6.2 min752011.38 GiB
v2(+5 半音, cfg=1.2)9.2 min~7500—

cfg 从官方默认 1.0 提到 1.2 会算两遍前向,耗时明显增加(这也是 v2 慢 3 分钟的原因)。


五、踩到的坑(含一个通用 bug)

坑 1:带 ID3 标签的 MP3 会让 ComfyUI 的 LoadAudio 直接崩 ⚠️

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 0: invalid continuation byte
  at comfyui nodes_audio.py LoadAudio.execute -> load(audio_path)

你上传的两首 MP3 都带 GBK 编码的中文 ID3 标签,ComfyUI 读元数据时按 UTF-8 解码 → 炸。 绕过办法(已验证):

ffmpeg -y -i input.mp3 -map_metadata -1 -c:a flac input.flac

即"先去掉元数据转成 FLAC"。以后凡是中文歌的 MP3 走 ComfyUI,都建议先过这一步。

坑 2:YuE2SaveABCFile 的参数叫 filename 不是 filename_prefix

写错会得到 HTTP 400(/prompt 的报错体不打印出来,只看得到 400)。已在脚本里补上错误体打印。 另:ABC 工具的产物不出现在 /history,要落盘在 output/YuE2_ABC/<时间戳>/ 里手动取。

坑 3:基频测量选错算法会得出相反结论

先用"自相关取全局峰"测,金莎被测成 167 Hz(比男声还低)——强二次谐波导致降八度错误。 改用 YIN(累积均值归一化差值 + 第一谷值 + 抛物线插值)后数值才合理。做男女声判定必须用 YIN 类算法。

坑 4:我自己写错参数导致一次空跑

--cfg 当时还没实现,脚本直接报 unrecognized arguments,白等 1 分钟(已给脚本补上 --cfg)。


六、复现命令

# 1) 源曲转谱(去掉 ID3 的 FLAC)
ffmpeg -y -i 源曲.mp3 -map_metadata -1 -c:a flac 源曲.flac     # 放进 ComfyUI/input/
python3 yue2-sheetsage.py --audio 源曲.flac --melody-only --tag cover-src

# 2) 整谱移调 + 清理(+5 半音,调号同步)
python3 yue2-abc-shift.py --abc melody-source.abc --semitones 5 --scope whole_score --out melody-p5.abc

# 3) 重渲染(cot=melody + 旋律 ABC + 目标音色提示词)
python3 yue2-run.py --cot melody --abc-file melody-p5.abc --lyrics-file 歌词.txt \
  --sem-mx 8500 --attn sdpa --cfg 1.2 --seed 999999 \
  --style "Mandarin pop, sweet youthful girl lead vocal with the delicate timbre of Jin Sha, ..." \
  --tag cover-female-p5 --outdir <输出目录>

# 4) 验收:分离人声 + YIN 测基频
venv/bin/python -m demucs --two-stems=vocals -n htdemucs -o /home/zyw/demucs-out <成品.flac>
python3 yin-f0.py /home/zyw/demucs-out/htdemucs/<名>/vocals.wav 标签

七、还可以继续调的

下载此文件