音色工程 · 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.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 破音修补¶
- 定位破音(听 + 看频谱),前后各留 0.3s 切出 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 能量筛「亮素材」子集,验证能否改善发闷