跳到主要内容

语音克隆 / 声音转换

FreeVC 本地部署:1.4GB 权重就能跑通的 one-shot 声音克隆

一段几秒的参考音就换音色,不要文本标注,也不用为每个目标说话人单独训一个模型。吃显存的从来不是模型本身,是你一次喂进去多长的音频。

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 约 315Mfp32 常驻约 1.4GB;30 秒切片峰值 3GB 以内16kHz 输入 / 16kHz 输出默认款。use_spk=true,目标音色由 17MB 的 GE2E 说话人编码器压成 256 维嵌入(gin_channels=256),换个参考音就换个人,不用重训。
FreeVC-s(freevc-s.pth,490MB)生成器同量级,推理时多走一次后验编码器 enc_q与默认款同量级,约 1.4GB16kHz 输入 / 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.4GB16kHz 内容特征 / 24kHz 输出把 50 帧/秒的 WavLM 帧率乘 480 直接吐 24kHz 波形,segment_size 8640。听感更开阔,但内容侧仍然是 16kHz 提的特征,别当成真正的宽带采集。
freevc-nosr(configs/freevc-nosr.json)训练配方,不是权重文件同 batch 下与默认配方一致,24GB 可跑 batch_size 6416kHz 输入 / 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 —

从开机到第一段换声

先用一条命令确认音色对不对得上,再决定要不要拉原仓库改代码

  1. 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
  2. 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
  3. 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
  4. 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 —

常见问题

FreeVC 本地部署需要多大显存?6GB 的卡够不够?

推理侧常驻权重约 1.4GB(WavLM-Large 1.26GB + 39.3M 参数的生成器 150MB + 17MB 说话人编码器),6GB 的卡确实能跑。但天花板不在权重,在音频长度:WavLM 以 50 帧/秒对整段波形做全注意力,注意力矩阵大约是 16 头 × T² × 4 字节,T = 50 × 秒数。30 秒 144MB,1 分钟 576MB,2 分钟 2.3GB,5 分钟就要 14GB 以上,softmax 的中间量还得再算一份。要么老老实实切片,要么直接上 24GB。NexGPU 的 RTX 3090 24GB 每卡时 $0.193,比很多 16GB 卡还便宜,按秒计费,切不切片这件事就不用纠结了。

FreeVC 和 RVC、so-vits-svc 有什么区别?该选哪个?

路子完全不同。RVC、so-vits-svc 那一路是为每个目标音色单独训一个模型,训完效果扎实,但每换一个人就得再训一次;FreeVC 是 one-shot——模型只训一次,之后给一段参考音就换音色,参考音里的说话人从没在训练集出现过也行(论文的 unseen→unseen MOS 4.06、SMOS 2.83,相似度确实会掉一档)。要批量、要随到随换,FreeVC 省事得多;要单个音色做到极致,专训路线更强。在 NexGPU 上这两条路可以装在同一台机器上直接对比,RTX 3090 $0.193/卡·时起,按秒计费,跑完停机就不再扣钱。

FreeVC 支持中文吗?换出来的中文为什么怪怪的?

官方权重是在 VCTK 的 107 位英语朗读说话人、16kHz 音频上训的,内容编码器 WavLM-Large 的预训练语料同样以英文为主,所以中文能出声、能听懂,但韵律和音色相似度会明显掉一档。想让中文可用,正确做法是拿中文语料按 configs/freevc-nosr.json(或带 SR 增广的 freevc.json)微调——生成器只有 39.3M 参数,微调成本远低于直觉。NexGPU 上 RTX 3090 24GB $0.193/卡·时,PyTorch 预置镜像开机即用,跑四十小时的微调也就 $7.72。

为什么 FreeVC 换完声音,音高听着还是原来那个人?

因为 FreeVC 根本不建模 F0。内容表征直接来自 WavLM 特征加信息瓶颈,基频没有被单独拆出来重设,源说话人的音高轮廓就顺着内容一起漏了过去——仓库 issue #27 里有人在训到 690k 步的模型上明确报过:源是高音女声、目标是男声时,输出音高还是贴着源走。这是架构层面的取舍,不是权重没训好。要跨性别、跨音域稳定转换,得选显式建模 F0 的方案。想把几条路线放在同一批素材上直接听差异,NexGPU 上开一台 3090($0.193/卡·时),一小时之内就有结论。

FreeVC 2023 年之后就不更新了,现在还值得用吗?

代码确实冻结了——最后一次功能性提交是 2023 年 2 月,2025 年初只动过 README。但冻结不等于坏掉:MIT 协议、39.3M 参数、一个 convert.py 就能推理、结构是标准的 VITS 变体,没有任何黑箱。而且它今天有一条被持续维护的发行路径——coqui-tts 0.27.5(支持到 Python 3.14)里的 voice_conversion_models/multilingual/vctk/freevc24,装完就能用,而且镜像的是原版 WavLM 权重。要实时、唱歌、更强的零样本,就去看 Seed-VC、OpenVoice V2、kNN-VC。不管最后选哪个,NexGPU 的 2,000+ 预置镜像里 PyTorch、vLLM、Whisper ASR 环境都是现成的,开机几分钟就能开始比。

从零训练一个 FreeVC 大概要多久、租卡要花多少钱?

论文配方是 batch_size 64、900k 步、单张 RTX 3090、全程 fp32。按仓库 issue #75 里 V100 16GB 的实测(12 小时约 7 万步,约 5,800 步/时)推算,900k 步大约 155 小时。在 NexGPU 上,Tesla V100 32GB $0.188/卡·时 × 155 ≈ $29.1,论文同款 RTX 3090 $0.193 × 155 ≈ $29.9。没有起租时长、没有开机费、不用申请配额,按秒计费,中途停机计算立刻停止扣费。真正要盯的是 SR 增广那接近 900GB 的中间文件——训完记得销毁,存储是按 $0.414/GB·月 一直算的。

同类模型 · 声音克隆 / 声音转换

全部模型部署指南

开始使用 NexGPU

无论你是企业研发团队还是独立开发者,都可以在几分钟内跑起第一个任务。

注册即可浏览全网实时价格,无需绑定支付方式。