跳转至

音色工程 · 00 公用部分(素材 / 混音 / 指标)

这套档案按「公用 + 两套模型」拆成三篇,改方法时只改对应那一篇,别混。 - 本篇:素材、清洗、混音后期、客观指标、链接、待办(两套模型都适用) - 音色工程_01_RVC.md:RVC 训练、推理参数、常驻服务、长音修复(在用) - 音色工程_02_SVC.md:so-vits-svc 环境、流程、短板(已暂停)

写于 2026-11-11。所有数字都是本机实测(RTX 3060 / 功耗锁 100W)。


0. 先看这一句

素材决定上限,模型决定下限,后期只能小修。 所有「加厚 / 压气声 / 硬提亮」的后期尝试都失败过,问题最后都回到素材侧。


0.5 术语表(先认词,再看流程)

按类别排,遇到不懂的词回这里查。标「本机」的是我们自己的口径。

音频基础

词 解释
采样率(sr) 每秒取多少个点,44.1k / 48k 指这个。RVC 有 40k、48k 两档;SVC 官方写死 44.1k。采样率越高,高频保留越多。
单声道 / 立体声 训练统一单声道(一条波形);成品混音才用立体声。
float32 波形存成 32 位浮点,无损,避免二次编码损失。
基频 F0 声带每秒振动次数,单位 Hz。它决定「音有多高」,不决定音色。说话时女声常 165–255Hz,唱起来 300–500Hz 很常见。
半音(semitone) 音高最小刻度,钢琴相邻两个键。12 个半音 = 一个八度 = 频率翻倍。「降 2 半音」就是 pitch 减 2。
谐波 / 泛音 基频之上成整数倍的频率成分,决定「音色」。同一个人唱同一个音,换个口型谐波结构就变。
LUFS 整体响度的国际标准单位(EBU R128)。越接近 0 越响,流媒体一般 −14,我们成品定 −12。
True Peak 解码后的真实峰值,防止超过 0 dBFS 造成削波。我们控制在 −2 ~ 0 dBFS。
削波(clipping) 波形超出上限被切平,听感是爆响/破音。

频谱与音色(判断「像不像」的指标)

词 解释
谱质心 频谱能量的「重心」,越高声音越亮。
尖锐度(acum) 由谱质心换算的明亮度指标,更贴人耳。目标区 0.04–0.11。
谱倾斜 频谱从低到高的下降陡不陡。越平 = 低频越多 = 听感越「厚」。
HNR 谐噪比,谐波能量与噪声能量之比。越高越干净,越低气声越多。
jitter 音高在相邻周期之间的抖动,高了听感发虚、不稳。
attack(起音) 声音从 10% 能量升到 90% 的时间。越短越「锐」,越长越「柔」。
实度(本机) 有声帧占总帧的比例,衡量声音「实」还是「虚」。必须标口径:单条 / 有声帧 / 整段,三种算法能差一倍。
音色漂移(timbre drift) 转换前后音色偏离程度,越小越像同一个人。
>5kHz 能量占比(本机) 高频保留量。素材中位只有 0.006,目标歌干声约 0.10 —— 这是「发闷」的根源。

音高提取与模型

词 解释
rmvpe / crepe / fcpe / harvest 四种音高(F0)提取算法。rmvpe 平均最准但高音长音会跟歪;crepe 慢一点、长音稳;fcpe 缺模型文件会直接报错;harvest 在 Applio 里没有这个选项。
ContentVec / HuBERT RVC 用的内容编码器,把「说了什么」和「谁在说」拆开,语言信息剥得比较干净。
whisper-ppg SVC 可选的内容编码器,来自 Whisper(语音识别模型),会把「这是哪种语言的口型」一起学进去 → 三语混训必串。
NSF-HiFiGAN SVC 的声码器,负责把频谱还原成波形。它是「更闷更暗」的主要来源之一。
Faiss / 索引(.index) 把训练集音色特征建成检索库,推理时按相似度把音色往库里拉。
index-rate(检索强度) 拉多狠。0 = 不查库;0.5 稳;0.75+ 更像,但容易带噪、过拟合。
protect(保护) 保护清辅音和呼吸声的参数,官方默认 0.33、上限一半是 0.5。实测调到 0.5 反而更差(高频 0.062→0.050),别乱动。
训练窗口 / segment_size 每次喂给模型的音频长度。48k 下 17280 ≈ 0.36 秒,34560 ≈ 0.72 秒。窗口拉长能容纳更长片段,但短于 1.5 秒的素材装不下、会报形状错误。
切片(slice) 把长音频切成训练用小段,一般 ≤ 30 秒;太长的长音会被切在中间。
epoch / step epoch = 整个数据集过一遍;step = 走过多少个 batch。我们 20 epoch ≈ 8160 step。
过拟合 模型把训练集背下来了,转换时带出素材里的杂音、口音、呼吸声。
checkpoint(.pth) 训练中间产物。整包 checkpoint(几百 MB)含优化器状态,导出推理模型时要取其中 model 这一项。

处理链里的效果器

词 解释
高通(highpass) 只让高频通过,切掉低频嗡声。我们人声 95Hz、伴奏 50Hz、素材 70Hz。
afftdn FFmpeg 的频域降噪,nf 是噪声底阈值,nf=-32 属轻降;降狠了会把气声一起吃掉。
loudnorm FFmpeg 的响度归一。用于素材统一没问题;用于成品母带会「一涨一落」,所以成品改用固定增益 + ebur128 实测。
compressor(压缩器) 把响的部分压下来让整体更平。我们人声 3.5:1,阈值 0.12。
alimiter 限幅器,防超峰值。加 level=disabled 时实测峰值会略高于标称 limit。
rubberband 变速/变调库。升调时伴奏要同步降:pitch=0.8908987 正好是 −2 半音。
交叉淡化(crossfade) 两段音频拼接处淡入淡出,避免「咔」的一声。我们用 60ms。
响度骑手(loudness rider,本机) 自动推音量的做法:按 0.1 秒量响度 → 算增益曲线 → 只调有声段 → 增益限 ±9dB → 0.25 秒柔化。名字借自电台调音台的推子(fader/rider)。专治 SVC 分段造成的一小一大,实测有声段标准差 7.54dB → 3.51dB。

素材与工程习惯

词 解释
干声 / 人声轨 去掉伴奏后的纯人声。我们用 BS-Roformer 分离,CPU 慢(48 分钟音频约 2 小时)。
p0 / p10 后缀 文件命名约定:_p0 是没升调的纯人声,_p10 是升 10 半音的版本。推理时输入已升调就把移调参数填 0,否则叠加。
BOM 文件头部的隐藏标记。PowerShell 5.1 写 UTF-8 会带 BOM,导致程序解析 JSON 崩溃,必须无 BOM 写入。

1. 素材

1.1 时长与内容

  • 说话模型:15–60 分钟干净独白即可有明显效果;我们第一版只有 46 秒就能用。
  • 唱歌模型:需要同一位歌手的连续长音,最好覆盖目标音域。
  • 切片 ≤ 30 秒、去掉纯静音、去掉音乐/掌声/多人对话。

1.2 音域(高音问题的根)

  • 我们说话模型的稳区 170–590Hz,>500Hz 占 15%,>700Hz 仅 1.5%,最高 1263Hz。
  • 唱《月光》升 10–12 半音后冲到 700–800Hz,正好撞硬顶 → 破音/发虚。
  • 公开素材里女高音实音极少:VocalSet long_tones 中位 533Hz、≥700Hz 为 0;SATB 最高 743Hz;B 站《春之声》≥700Hz 稳定段仅 48.9 秒(花腔气声,非实音)。
  • 结论:别指望堆 700Hz+ 素材救破音。真正有效的是「降调 + 换歌 + 调索引/音高参数」。

1.3 清洗(一步都不能省)

固化在 <工作目录>\clean_pipeline.py,每个模型一套 Profile(rvc48k / rvc40k / svc44k / svc32k)。

项 值(svc44k / rvc48k) 说明
采样率 44100 / 48000 模型专属
声道 单声道 训练统一
格式 float32 wav 无损,避免二次编码
降噪 afftdn=nf=-32:tn=1 轻降;重降噪会吃掉气声
高通 highpass=f=70 去低频嗡声
响度 loudnorm=I=-20:TP=-2:LRA=9 统一素材音量,必做
峰值 alimiter=limit=0.94 防削波
静音裁剪 −40dB / 留 0.12s 边距 省算力
非人声剔除 谱质心 / 平坦度 / 能量,三项中两项 见 1.4 的坑
去重 log-mel 余弦 > 0.995 防同一段重复计权
最长 30s 硬切 显存友好
python clean_pipeline.py --model svc44k --in <素材目录> --out <输出目录> --jobs 4
python clean_pipeline.py --model svc44k --in <素材目录> --out <输出目录> --dry   # 只统计不落地

实测:2911 条 → 留 2677(静音 61、噪声 173、重复 0)。

1.4 踩过的坑

  • 用 pyin 判有声帧:fmin=70 + frame_length=1024 时 librosa 会警告 "less than two periods of fmin fit into the frame",正常说话被判无音高,一次砍掉 76% 素材。→ 判有声帧用 RMS 能量 + 频谱门限,不要用低 fmin 的 pyin。
  • 整段统计量当结论:拿 90 秒整段算「实度」会被静音拉低到 0.447,按单条重测中位是 0.92。→ 口径必须写清:单条 / 有声帧 / 整段。
  • 素材没洗就训:SVC 首版「电流感」就是素材底噪被一起学走。
  • 拿错文件:曾把带伴奏的「清唱」当纯人声做对比(与原曲相关系数 0.88),一整套结论报废。→ 对比前先确认输入是 *_p0.wav 这类纯人声。

2. 混音与后期(验证过的固定链)

2.1 人声

highpass=f=95,
equalizer=f=2800:width_type=o:width=2:g=4,
acompressor=threshold=0.12:ratio=3.5
- 2.8kHz 提亮 = 咬字清晰度;超过 +5dB 开始刺。

2.2 伴奏

rubberband=pitch=0.8908987,   # 和人声同步降两半音,否则串调
highpass=f=50,
bass=g=-2:f=80,
volume=0.55

2.3 合轨与母带

amix=inputs=2:normalize=0,alimiter=limit=0.95
再 ebur128 实测整体响度,用固定增益补到 −12 LUFS(volume=XdB,alimiter=limit=0.84:level=disabled)。

禁用动态 loudnorm 做最终母带:它会"一涨一落",整首音量飘。 alimiter 加 level=disabled 时峰值会略高于 limit 标称值,实测 −0.2 dBFS 左右,试听版可接受。

2.4 破音修补

  1. 定位破音(听 + 看频谱),前后各留 0.3s 切出 2–3 秒;
  2. 单独重推(降调或换参数);
  3. 60ms 交叉淡化贴回。

    EQ 加厚、噪声门、只补高频三种「硬盖」全部失败:人机感更重。

2.5 响度骑手(专治 SVC 分段造成的一大一小)

短时 RMS(0.1s 窗 / 0.05s 步)→ 平滑 → 只在有声段对齐到中位响度 → 增益限 ±9dB → 0.25s 柔化。 实测:有声段响度标准差 7.54dB → 3.51dB。脚本 vol_rider.py。


3. 怎么判断「像不像」(客观指标)

指标 含义 怎么算
F0 中位 音高中心,决定「少女/成女」 librosa.pyin / crepe
有声帧占比(实度) 声音实还是虚 有声帧 / 总帧
谱质心 / 尖锐度 明亮度 librosa.feature.spectral_centroid
谱倾斜 低频多 → 厚 log 谱线性拟合斜率
HNR 气声多少 谐噪比
jitter 音高微抖 相邻周期比
attack 锐或柔 能量 10%→90% 时间
>5kHz / >700Hz / >2kHz 占比 高频保留量 STFT 分段能量比

参考锚点(同口径):

对象 F0 中位 实度
卢西娅 EP 351Hz 0.79
Tarokiki 远航星 280Hz 0.745
单依纯 live 294Hz 0.702
我的说话素材 326Hz 0.92(单条口径)
目标区 294–395Hz ≥0.70

数字都要标口径,否则会得出相反结论(见 1.4)。


4. 链接清单

代码 / 模型 - RVC 官方:https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI - Applio(RVC CLI 分支):https://github.com/IAHispano/Applio - so-vits-svc 4.1:https://github.com/svc-develop-team/so-vits-svc - so-vits-svc 预训练(镜像):https://hf-mirror.com/Sucial/so-vits-svc4.1-pretrain_model - ContentVec:https://github.com/auspicious3000/contentvec - RMVPE:https://github.com/Dream-High/RMVPE - CREPE:https://github.com/marl/crepe - Faiss:https://github.com/facebookresearch/faiss - Whisper:https://github.com/openai/whisper

音频处理 - FFmpeg filters:https://ffmpeg.org/ffmpeg-filters.html - Rubber Band:https://breakfastquay.com/rubberband/ - librosa:https://librosa.org/doc/latest/index.html - EBU R128:https://tech.ebu.ch/publications/r128

素材 - VocalSet:https://zenodo.org/record/1193957 - 免费人声站:https://freesound.org


5. 待办(公用部分)

  • [ ] 破音修补做成脚本(切段 → 重推 → 交叉淡化)一键化
  • [ ] 诊断指标做成一条命令的体检报告(f0 / 实度 / 尖叫度 / HNR / 高频占比 / 长音摆动)
  • [ ] 按 5kHz 能量筛「亮素材」子集,验证能否改善发闷