OpenVoice 由 MIT 的 Qin Zengyi、清华的 Zhao Wenliang 与 Yu Xumin,以及 MyShell 的 Sun Xin 共同发布,论文是 arXiv:2312.01479《OpenVoice: Versatile Instant Voice Cloning》,代码在 github.com/myshell-ai/OpenVoice,3.7 万 star,V1 与 V2 均为 MIT 授权,商用研究都免费。它的架构和后来那批 LLM 式 TTS 完全不同:文本先交给一个基座 TTS 说出来,再由一个独立的「音色转换器」(tone color converter)把这段音频的音色换成参考说话人的。这个拆分决定了它的一切优点和一切局限——转换器是前馈的流式模型,没有自回归 token 逐个吐字的过程,延迟稳定、可预测;但它也只负责音色,口音、情绪、节奏全部由基座决定。
数字上它小得离谱。V2 的转换器 checkpoint.pth 是 131,320,490 字节(约 125MiB),配置里写着 22050Hz 采样率、hop 256、隐藏维 192、6 层、gin_channels 256、HiFi-GAN 上采样 [8,8,2,2],典型的 VITS 血统。V2 的基座换成了 MeloTTS,每个语种一个 fp32 checkpoint,中文那份是 207,770,124 字节,英文 v3 是 207,602,918 字节。也就是说「中文克隆」这条最常见的链路,权重合计约 340MB。仓库 issue #48 里有人实测初始化时占用约 3GiB 内存、约 1GiB 显存。这意味着一件事:给 OpenVoice 租 H100 是纯粹的浪费,真正该问的问题不是「够不够跑」,而是「一张卡能塞几个并发 worker」。
同时也要把话说透:OpenVoice 仓库最后一次代码推送停在 2025 年 4 月 19 日,V2 的权重包仍是 2024 年 4 月发布的 checkpoints_v2_0417.zip,没有 V3。MyShell 的 HuggingFace 组织里,OpenVoiceV2 之后只有 DreamVoice 和 ShellAgent。这条线基本定型了。它带来的最大实际后果是依赖被冻结在 2023 年——requirements.txt 里写着 numpy==1.22.0、librosa==0.9.1、gradio==3.48.0、faster-whisper==0.9.0,官方环境是 Python 3.9,在今天的 NumPy 2.x 环境下装不上是常态。如果你要的是更强的韵律和情感表现,Apache-2.0 的 CosyVoice(2.2 万 star,仍在活跃更新)是另一条路;如果你要的是「便宜、可控、延迟稳定、批量跑几万条」,OpenVoice 到今天依然是性价比最高的选择之一。
01 —
版本与权重:到底要下载哪些文件
V2 不是一个模型,而是 MeloTTS 基座 + 音色转换器 + 音色嵌入三件套
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| OpenVoice V2 音色转换器(checkpoints_v2_0417) | converter/checkpoint.pth = 131,320,490 B(约 125MiB,fp32) | 权重常驻约 0.13GB;含 CUDA 上下文与激活实际约 1GB | 输出 22.05kHz 单声道,zero_g=true,6 层 / 隐藏维 192 / gin 256 | 整条链路的核心,只换音色不改内容,V1 与 V2 的转换器体积几乎一样但权重不同,不要混用 |
| MeloTTS 基座(EN / ES / FR / ZH / JP / KR) | 每语种约 208MB fp32,中文 207,770,124 B,英文 v3 207,602,918 B | 单语种权重约 0.21GB;六语种全部常驻约 1.25GB | 中文基座原生支持中英混读,官方 demo 文本就是「在这次 vacation 中……」 | V2 的发音、口音、语速、断句全部来自这里,OpenVoice 本身一个字都不负责 |
| V2 源音色嵌入 base_speakers/ses(11 个) | 每个约 1.7KB 的 .pth,实质是 256 维 gin 向量 | 可忽略 | en-newest / en-us / en-br / en-au / en-india / en-default / es / fr / zh / jp / kr | 必须和你选的 MeloTTS speaker_id 对上,选错会让转换结果音色发飘、机械感明显 |
| OpenVoice V1(checkpoints_1226) | EN / ZH 基座各 160,467,309 B,转换器 131,327,338 B,HF 仓库合计 452MB | issue #48 实测初始化 BaseSpeakerTTS 约 1GiB 显存 + 3GiB 内存 | 原生基座只有英文和中文 | 唯一保留情感风格标签(whispering / cheerful / sad 等)的版本,V2 把这套风格控制拿掉了,需要情绪就得留在 V1 |
| 目标音色嵌入 target_se | se_extractor.get_se() 的产物,256 维张量 | 可忽略 | 参考音频要求:干净、单人、够长、无长段静音 | 提取一次存成 .pth 反复用,不要每次合成都重跑 VAD 切分,那才是真正的时间开销 |
02 —
该租哪张卡:按并发数选,不是按显存选
权重不到 350MB,瓶颈从来不是显存容量,而是每个 worker 进程各自的 CUDA 上下文和单卡吞吐
第一次跑通:装环境、下权重、提一个人的音色试合成
Tesla V100 32GB$0.188/卡·时
全网最便宜的一档,32GB 对这条链路是碾压性富裕,Volta 又被所有 PyTorch 版本稳定支持,正适合折腾那份 Python 3.9 的老依赖。
日常开发:Gradio 交互调参、反复换参考音频对比效果
RTX 3090 24GB$0.193/卡·时
Ampere 架构对新版 CUDA 和 torch 兼容性最省心,价格只比 V100 贵半分钱,改一行代码重启一次进程的开发节奏下最划算。
生产 API:几十路并发实时合成,要低且稳的首包延迟
RTX 4090 24GB$0.540/卡·时
转换器是前馈的,单请求算力需求极低,4090 的高频单卡吞吐能把并发数拉满,24GB 足够塞十几个常驻 worker 进程。
六语种全量常驻 + 大批量离线配音流水线
RTX A6000 48GB$0.817/卡·时
六个 MeloTTS 基座加转换器权重约 1.38GB,真正吃显存的是每个 worker 各自约 0.3–0.5GB 的 CUDA 上下文,48GB 能把进程数堆到显存不再是限制。
03 —
四步在 NexGPU 上把 OpenVoice V2 跑起来
从空实例到出第一条克隆音频,卡在哪一步的人最多都标出来了
- 01
开实例,建 Python 3.9 环境
选 NexGPU 的 PyTorch 预置镜像开机,SSH 进去。务必按官方要求建 Python 3.9 环境——requirements.txt 里钉死了 numpy==1.22.0 和 librosa==0.9.1,在 Python 3.11 + NumPy 2.x 上直接编译失败,这是最高频的第一道坎。
conda create -n openvoice python=3.9 -y && conda activate openvoice && git clone https://github.com/myshell-ai/OpenVoice.git && cd OpenVoice && pip install -e . - 02
装 MeloTTS,下 V2 权重
V2 的基座是独立仓库,必须单独装,日文还要额外拉 unidic 词典。权重包 checkpoints_v2_0417.zip 解压出 converter/ 和 base_speakers/ses/ 两个目录。如果 Silero VAD 拉不下来,手动把 zip 放到 ~/.cache/torch/hub/snakers4_silero-vad_master 即可绕过。
pip install git+https://github.com/myshell-ai/MeloTTS.git && python -m unidic download && wget https://myshell-public-repo-host.s3.amazonaws.com/openvoice/checkpoints_v2_0417.zip && unzip checkpoints_v2_0417.zip - 03
从参考音频提目标音色
加载转换器后调用 se_extractor.get_se(),vad=True 会用 Silero 做静音切分。参考音频必须干净、单人、够长、没有大段空白。注意它会把中间产物缓存到 processed/ 目录——换了内容但文件名没变的话,一定要先删掉这个目录,否则你听到的还是上一版。
target_se, audio_name = se_extractor.get_se('resources/example_reference.mp3', tone_color_converter, vad=True) - 04
MeloTTS 合成 → 转换器换音色
先用 MeloTTS 把文本读成 tmp.wav,再把源音色向量(base_speakers/ses 里对应的那个)和目标音色向量一起喂给 convert()。注意 message 参数:官方 demo 默认写 "@MyShell",它会通过 wavmark 在输出里嵌一段水印,自建服务前先想清楚这个参数要不要改。
tone_color_converter.convert(audio_src_path=src_path, src_se=source_se, tgt_se=target_se, output_path=save_path, message="@MyShell")
算一笔真账:一万条中文配音要花多少钱
第一次跑通选 Tesla V100 32GB($0.188/卡·时):建环境加装 MeloTTS 约 20 分钟,下载 131MB 转换器 + 208MB 中文基座不到 1 分钟,再花半小时提音色试效果,一小时封顶,账单 1 × $0.188 = $0.188。批量阶段换 RTX 4090($0.540/卡·时)。假设一万条平均 12 秒的中文短句,合计 120,000 秒 ≈ 33.3 小时音频;按你自己实测的 8 倍实时算(前馈转换器通常还更快,以你那套依赖为准),需要 33.3 ÷ 8 ≈ 4.17 小时 GPU:4.17 × $0.540 = $2.25。输出是 22.05kHz 16bit 单声道,每秒 44,100 字节,120,000 秒 = 约 5.3GB wav;连同 0.6GB 权重合计 5.9GB,按存储中位价 $0.414/GB·月 是 $2.44/月,把 5.3GB 拉回本地按出网中位价 $0.0081/GB 是 $0.043。算力加出网 = $0.188 + $2.25 + $0.04 ≈ $2.48;跑完当天就把卷销毁,存储那部分几乎不产生费用。计算按秒计费、按小时定价,实例一停算力就停止计费——只有存储会一直算到你销毁它为止,没有起租时长,没有开通费,也不用申请配额。
04 —
