FreeVC 出自论文《FreeVC: Towards High-Quality Text-Free One-Shot Voice Conversion》(arXiv:2210.15418,Jingyi Li / Weiping Tu / Li Xiao),代码在 github.com/OlaWod/FreeVC,MIT 协议。做法是把 VITS 的端到端框架直接搬来做波形重建,内容信息由 WavLM-Large 提取后再套一层信息瓶颈把音色挤出去,再用 spectrogram-resize——沿梅尔频率轴缩放,等价于共振峰扰动——做增广,进一步洗干净内容表征。论文报的 MOS 是 3.99 / 4.06 / 4.06(seen→seen、unseen→seen、unseen→unseen),说话人相似度 SMOS 3.80 / 3.77 / 2.83,把同期的 VQMIVC(MOS 2.31)和 YourTTS(3.46)都甩在了后面。
从部署角度看,FreeVC 小得不像话。把官方 freevc.pth 拆开数一遍:生成器一共 39,339,712 个参数,fp32 权重 150MB,其中解码器 14.5M、后验编码器 8.8M、flow 8.7M、先验编码器 7.3M。checkpoint 文件之所以有 473MB,是因为里面连 Adam 的两份动量状态一起存下来了。真正的大头是内容编码器 WavLM-Large——权重文件 1.26GB、约 3.15 亿参数。三样东西加起来(WavLM 1.26GB + 生成器 150MB + 17MB 的 GE2E 说话人编码器)约 1.4GB,一张 24GB 的卡装完它们之后,剩下 22GB 全是留给音频长度的。
有件事必须说清楚:FreeVC 的代码从 2023 年 2 月之后就没再动过,2025 年初只被摸过两次 README。它没有 v2、没有改名,官方一共就三份权重:freevc.pth、freevc-s.pth、freevc-24.pth。今天还在被维护的安装路径是 coqui-tts(PyPI 0.27.5,Python 3.10–3.14),里面的 voice_conversion_models/multilingual/vctk/freevc24 就是它。要实时变声、唱歌转换或者更强的中文零样本,Seed-VC(arXiv:2411.09943)、OpenVoice V2、kNN-VC 都更合适;但如果你要的是一个 MIT 协议、结构透明、能在一张卡上从零训完、还能拆开随便改的语音转换基线,FreeVC 到今天依然是最省事的那一个。
01 —
三份官方权重,一个还在维护的发行版
FreeVC 没有版本迭代,只有变体——差别全在这张表里
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| FreeVC(freevc.pth,473MB) | 生成器 39.3M + WavLM-Large 约 315M | fp32 常驻约 1.4GB;30 秒切片峰值 3GB 以内 | 16kHz 输入 / 16kHz 输出 | 默认款。use_spk=true,目标音色由 17MB 的 GE2E 说话人编码器压成 256 维嵌入(gin_channels=256),换个参考音就换个人,不用重训。 |
| FreeVC-s(freevc-s.pth,490MB) | 生成器同量级,推理时多走一次后验编码器 enc_q | 与默认款同量级,约 1.4GB | 16kHz 输入 / 16kHz 输出 | use_spk=false,音色直接从目标音频的 mel 里取,不依赖外部说话人编码器。注意 convert.py 会对参考音做 librosa.effects.trim(top_db=20) 而训练用的 data_utils.py 不做,训练与推理存在这道口径差(issue #96)。 |
| FreeVC-24(freevc-24.pth) | 结构同款,解码器 upsample_rates 改成 [10,6,4,2],合计 480 倍 | 与 16kHz 款相同,约 1.4GB | 16kHz 内容特征 / 24kHz 输出 | 把 50 帧/秒的 WavLM 帧率乘 480 直接吐 24kHz 波形,segment_size 8640。听感更开阔,但内容侧仍然是 16kHz 提的特征,别当成真正的宽带采集。 |
| freevc-nosr(configs/freevc-nosr.json) | 训练配方,不是权重文件 | 同 batch 下与默认配方一致,24GB 可跑 batch_size 64 | 16kHz 输入 / 16kHz 输出 | 关掉 spectrogram-resize 增广的训练配置。省掉预处理阶段接近 900GB 的中间文件,代价是内容特征里会残留更多源说话人音色。 |
| coqui-tts freevc24(voice_conversion_models/multilingual/vctk/freevc24) | 打包后 model.pth 1.33GiB,WavLM 一起塞进去了 | 加载后约 1.4GB 权重常驻 | 16kHz 输入 / 24kHz 输出 | 下载一个 854MB 的 zip,一条命令就能转。关键是它镜像的是原版 WavLM-Large.pt,而不是 HuggingFace 上那份权重略有出入的 microsoft/wavlm-large——作者本人在 Space 说明里点过名,后者会让效果掉一点。 |
02 —
该租哪张卡
FreeVC 的配置里 fp16_run 默认是 false,训练推理全程 fp32——挑卡看的是单精度吞吐和显存余量,不是 Tensor Core
试音、批量转换(片段切到 30 秒以内)
RTX 3090 24GB$0.193/卡·时
1.4GB 权重装完还剩 22GB 全给注意力用,而且这是站内最便宜的 24GB 卡,比 16GB 的 Tesla T4($0.298)还省三成。
照论文配方从零训练:batch_size 64、900k 步
RTX 3090 24GB$0.193/卡·时
论文本身就是在单张 3090 上跑完的,configs/freevc.json 一个字都不用改,segment_size 8960、max_speclen 128 全部照搬。
想把 900k 步的墙钟时间压下来
RTX 4090 24GB$0.540/卡·时
FreeVC 不开 AMP,训练全是 fp32,4090 的单精度吞吐比 3090 高出一大截而显存同样是 24GB,配方原样搬过来就行。
SR 增广预处理分片(README 里把 68–92 切成六段并行跑)
RTX 3090 24GB × 4(单节点)$0.193/卡·时 × 4 = $0.772/时
preprocess_sr.py 本来就是按 CUDA_VISIBLE_DEVICES 分片写的,单节点最多 14 张卡,六个区间一次铺开,预处理从一整天缩到几小时。
03 —
从开机到第一段换声
先用一条命令确认音色对不对得上,再决定要不要拉原仓库改代码
- 01
开一台 PyTorch 实例,用 coqui-tts 走最短路径
不想碰 2023 年那套依赖的话,这是最快的验证方式:coqui-tts 把 FreeVC-24 和原版 WavLM-Large.pt 一起打好包了,首次运行会下一个 854MB 的 zip,解出 1.33GiB 的 model.pth。参考音一定要先剪掉首尾静音——作者明确说过,参考音里静音太多会严重拉低音色相似度。
pip install coqui-tts && tts --model_name "voice_conversion_models/multilingual/vctk/freevc24" --source_wav src.wav --target_wav tgt.wav --out_path out.wav - 02
要改代码就拉原仓库,把三份权重放对目录
FreeVC 的路径是硬编码的:WavLM-Large.pt 放 wavlm/,freevc.pth 放 checkpoints/,17MB 的 GE2E 说话人编码器放 speaker_encoder/ckpt/pretrained_bak_5805000.pt。requirements.txt 千万别照抄——里面 torch==1.10.0 配 torchvision==0.9.0 本身就是一对不兼容的钉子,numpy 还钉在 1.21.6。直接用镜像里的新版 torch,再补几个音频库就行,webrtcvad 换成有预编译轮子的 webrtcvad-wheels。
git clone https://github.com/OlaWod/FreeVC.git && cd FreeVC && mkdir -p wavlm checkpoints && wget -O wavlm/WavLM-Large.pt https://github.com/coqui-ai/TTS/releases/download/v0.13.0_models/WavLM-Large.pt && pip install librosa scipy tqdm webrtcvad-wheels - 03
打上 torch.load 的补丁
PyTorch 2.6 起 torch.load 的 weights_only 默认翻成了 True,这是官方明说的破坏性变更;而 WavLM-Large.pt 和 freevc.pth 里都存了非张量对象(前者带 cfg,后者带 optimizer 状态),不改直接跑会抛 UnpicklingError。原仓库的 utils.get_cmodel() 和 utils.load_checkpoint() 都没带这个参数,最省事的做法是在入口文件顶上把 torch.load 包一层。
sed -i '1i import torch, functools; torch.load = functools.partial(torch.load, weights_only=False)' convert.py - 04
写 convert.txt,跑批量转换
convert.py 读的是一行一条的「标题|源音频|参考音频」三段式清单,不是命令行参数——这一步卡住的人不少。另外 WavLM 会对整段波形做全注意力,显存随时长平方增长,长录音一定先切到 30 秒以内再进队列。转完直接停机,计算立刻停止计费。
echo "demo01|wavs/src.wav|wavs/tgt.wav" > convert.txt && CUDA_VISIBLE_DEVICES=0 python convert.py --hpfile configs/freevc.json --ptfile checkpoints/freevc.pth --txtpath convert.txt --outdir outputs/freevc
把账算给你看
先说推理。整套权重 1.4GB,一张 RTX 3090 24GB 每卡时 $0.193:开机、装环境、下权重、转一批音频,一小时足够,就是 $0.193;按秒计费,实际用了 41 分钟就只扣 41 分钟,$0.132。出网几乎不要钱——16kHz 单声道 16-bit 每秒 32KB,1,000 条 10 秒的成品约 320MB,按 $0.0081/GB 是 $0.0026。 再说从零复现论文。仓库 issue #75 里有人给了实测锚点:Tesla V100-SXM2-16GB 上跑 VCTK,12 小时约 7 万步,也就是约 5,800 步/时。论文配方是 900k 步,900,000 ÷ 5,800 ≈ 155 小时。挂在 Tesla V100 32GB($0.188/卡·时)上是 155 × 0.188 ≈ $29.14;挂在论文同款 RTX 3090($0.193/卡·时)上是 155 × 0.193 ≈ $29.92,而且 3090 的单精度更快,实际时长还会更短。不到三十美元跑完一个论文级的语音转换模型,这是 FreeVC 最被低估的地方。 真正会咬人的是存储,不是算力。SR 增广每条音频要写 25 份副本(i 从 68 到 92):重采样后的 wav 每秒 32KB,WavLM 特征是 1024 维 × 50 帧/秒 × 4 字节 = 每秒 200KB,合计约 232KB/秒 × 25 ≈ 每秒音频 5.8MB。VCTK 约 44 小时(158,400 秒,去静音后更少)就是接近 900GB 的中间文件。按 $0.414/GB·月,原封不动放一个月是三百多美元。所以:训完立刻删掉 dataset/sr,或者只跑 68–92 里的一两个区间,或者干脆改用 configs/freevc-nosr.json。计算停机就不再计费,存储不销毁会一直计费——这两件事在 FreeVC 上的差距是两个数量级。
04 —
