GitHub 趋势 · 第 58 期
README 写 646 种语言,最短的那门只喂了 72 秒
#语音克隆#本地部署#开源许可#TTS
先给判断:这是目前最值得自己动手跑一遍的开源语音克隆项目。646 种语言、58.1 万小时训练语料、Apache-2.0、3 到 10 秒参考音频就能克隆一个声音,还顺手做了 13 个非语言标记([laughter] 这类)和内建的中文拼音纠音。
但有三件事官方没放在显眼处:646 种语言里的支持,指的是能出声,不是能用;官方给出的性能基准表是在单张 H100 上测的,找不到一条 Mac 或消费级显卡的数字;而决定你能不能拿它做产品的权重许可,它的 README 里一个字都没写。
两个老问题,它绕开了
云端的语音合成有两个老毛病:按字符计费,声音留在别人的服务器上;想克隆自己的声音,先签一叠授权。自己搭一套又常卡在显存和稳定性上——第一次跑通容易,连着生成两百条不出废片难。
OmniVoice 走的是中间那条路:代码在 GitHub、权重在 HuggingFace、推理在你自己的机器上跑,包在 PyPI 上一个 pip install 装好,参考音频只要 3 到 10 秒。
它是什么:next-gen Kaldi 团队的新 TTS
仓库 k2-fsa/OmniVoice 出自 k2-fsa 组织,也就是维护 sherpa-onnx(15k star,Apache-2.0)、icefall(1.5k star)、k2 的那批人——做离线语音基建的老团队。LICENSE 文件末尾的版权方写的是小米(Xiaomi Corp.)。
它也不是这个团队的第一个 TTS。上一个是 ZipVoice,路线是 flow matching,仓库最后更新停在 2025 年 12 月;OmniVoice 换成了 diffusion language model 风格的架构,2026 年 3 月 31 日建仓,最新提交 9 月 7 日,最新版本 0.2.1(7 月 16 日发布)。
有个数字值得注意:仓库本体只有 1,187 KB。模型权重不在仓库里,首次运行才从 HuggingFace 下载。所以别指望拷一份代码回去就能断网跑起来——离线部署要先把权重落地,这一步在文档里是一句话带过的。
成熟度也得摆在明面上:版本号还在 0.2.1,未关闭 issue 61 个,从建仓到现在不满六个月。这类还在 0.x 的项目接口随时可能变,别把生产 pipeline 直接焊死在当前这一版 API 上。
官方标出来的能力
| 项目 | 官方口径 |
|---|---|
| 语言覆盖 | 646 种(README 写 over 600,语言表逐条列到 646) |
| 训练语料 | 581k 小时 |
| 推理速度 | RTF 低至 0.025,官方称 40 倍实时 |
| 参考音频 | 3 到 10 秒 |
| 输出格式 | 24 kHz |
| 三种模式 | Voice Cloning / Voice Design / Auto Voice |
| 细粒度控制 | 13 个非语言标记([laughter]、[sigh] 等)+ 中文拼音与英文音素纠音 |
| 加速 | FlashInfer,官方正文写约 2 到 2.9 倍,自己表里最大 2.6 倍 |
| 硬件 | NVIDIA CUDA、Apple Silicon(MPS)、Intel Arc(XPU) |
| 许可 | Apache-2.0,版权方 Xiaomi Corp. |
三种模式的差别值得说清楚,因为它们的成熟度完全不同:
- ▪Voice Cloning:给参考音频,可以只给音频不给转写,模型会调 Whisper 自动转写出参考文本
- ▪Voice Design:不给参考音频,用属性描述声音(性别、年龄、音高、口音、中文方言),但官方明说它只在中英数据上训过,其他语言会不稳定
- ▪Auto Voice:什么都不给,模型自己挑一个声音
一、646 种语言里,一半语料只给了两种
官方语言表给每条语言标了训练时长。排第一的英语 206,061.1 小时,第二的中文 111,343.3 小时,两者合计约 31.7 万小时,占 581k 总语料的 54.6%。
另一端在第 352 行:Macedo-Romanian,训练语料 0.02 小时,合 72 秒。第 217 行的 Haitian 是 0.04 小时,Votic 是 0.1 小时。
所以 646 这个数字的含义是:语言表里有 646 行,而不是 646 种语言都到了可用语料量。真要拿它覆盖某门小语种,先去仓库的 docs/languages.md 里查那一行写了多少小时——低于 1 小时的那些,模型大概只能给你一个音色,给不了可用的发音。
二、40 倍实时,是 H100 上的批量数字
README 头条写的是 RTF 低至 0.025,也就是 40 倍实时。它自己给出的那张基准表长这样:seed-tts 中文测试集、2020 条样本、3.3 小时音频、语音克隆任务、单张 H100、fp16、32 步扩散:
| 批量 | 基线 RTF | FlashInfer RTF | 加速 |
|---|---|---|---|
| 1 | 0.0899 | 0.0430 | 2.1x |
| 1 + CUDA graph | — | 0.0367 | 2.4x |
| 2 | 0.0480 | 0.0245 | 2.0x |
| 4 | 0.0331 | 0.0152 | 2.2x |
| 8 | 0.0298 | 0.0115 | 2.6x |
把两件事对着看就清楚了。这张表里单流、不加 FlashInfer 的基线是 0.0899,也就是大约 11 倍实时,不是 40 倍;40 倍对应的是批量 2 加 FlashInfer 那一行的 0.0245,最快的一格是批量 8 加 FlashInfer 的 0.0115,约 87 倍。头条那个数字并没有标明它对应哪一行。
更实际的问题是:这张表里没有一条消费级显卡或 Apple Silicon 的数字。README 说支持 MPS 和 Intel Arc,也写了在 Arc A310(4GB)与 Arc Pro B50(16GB)上测过,但那两条路径的推理速度一个数都没给。
我们本机在 Mac 上跑另一个本地语音模型,实测 RTF 在 3.25 左右——不同的模型、不同的机器,不能直接比,但数量级差在这里摆着。如果你的目标是本地实时对话级的语音,先去把这台机器上的 RTF 实测出来再谈架构,别拿 H100 的批量数字做预算。
三、代码是 Apache-2.0,但 README 没有 License 章节
仓库根目录有 LICENSE 文件,是完整的标准 Apache-2.0 全文,没有附加条款、没有非商用限制、没有品牌保留条款,附录里的版权方是小米(Xiaomi Corp.)。这一层是干净的。
但 README 通篇没有 License 章节,只在文末留了一段免责声明,禁止未授权的语音克隆、声音冒充、欺诈和其他非法用途,并写明开发者不为滥用承担责任。
真正要留意的分层在这里:仓库里开源的是代码,而模型权重单独放在 HuggingFace 上、首次运行自动下载。代码的许可与权重的许可可以是两份不同的文件——README 连代码那一半都没提,那是根目录的 LICENSE 文件写的;权重那一半得去模型卡上看。另外注意,文末这段免责声明是伦理约束,它不是许可证。
上手:三步,macOS 上多一个坑
官方给的是 pip 和 uv 两条路。下面的命令照抄 README 原文。
# 1. 装 PyTorch(NVIDIA GPU 按自己的 CUDA 版本换,示例是 cu128) pip install torch==2.8.0+cu128 torchaudio==2.8.0+cu128 --extra-index-url https://download.pytorch.org/whl/cu128 # Apple Silicon 用这条 pip install torch==2.8.0 torchaudio==2.8.0
# 2. 装 OmniVoice(三选一) pip install omnivoice pip install git+https://github.com/k2-fsa/OmniVoice.git git clone https://github.com/k2-fsa/OmniVoice.git cd OmniVoice pip install -e .
# 3. 国内下载权重先走镜像,再起一个本地 Web UI export HF_ENDPOINT="https://hf-mirror.com" omnivoice-demo --ip 0.0.0.0 --port 8001
不想写代码的话,第三步起完 UI 就能在浏览器里试克隆。要用 API 的话,核心就这几行:
from omnivoice import OmniVoice
import soundfile as sf
import torch
model = OmniVoice.from_pretrained(
"k2-fsa/OmniVoice",
device_map="cuda:0",
dtype=torch.float16
)
# Apple Silicon users: use device_map="mps" instead
# Intel Arc GPU users: use device_map="xpu" instead
audio = model.generate(
text="Hello, this is a test of zero-shot voice cloning.",
ref_audio="ref.wav",
ref_text="Transcription of the reference audio.",
) # a list of np.ndarray, shape (T,), at 24 kHz
sf.write("out.wav", audio[0], 24000)
批量跑任务用命令行,把克隆好的声音存下来复用也是两行:
omnivoice-infer \
--model k2-fsa/OmniVoice \
--text "This is a test for text to speech." \
--ref_audio ref.wav \
--ref_text "Transcription of the reference audio." \
--output hello.wav
prompt = model.create_voice_clone_prompt(
ref_audio="ref.wav", ref_text="Transcription of the reference audio."
)
prompt.save("my_voice.pt")
# later, in a new session
from omnivoice import VoiceClonePrompt
prompt = VoiceClonePrompt.load("my_voice.pt")
audio = model.generate(text="Hello again!", voice_clone_prompt=prompt)
下面几条是官方文档里散落的注意事项,装之前先看一眼能省时间:
- ▪参考音频 3 到 10 秒最合适,更长会更慢,克隆质量还可能下降
- ▪跨语言克隆会带上参考音频那种语言的口音,要标准发音就用同语种参考音频
- ▪阿拉伯数字要先归一化成单词,中文路径要额外装 pip install "omnivoice[tn]"
- ▪macOS 上 pynini 没有 wheel,先执行 conda install -c conda-forge pynini
- ▪要求 Python 3.10 以上;uv 路线把 torch 钉在 2.8.0
- ▪pyproject 里定义了 4 个命令行入口(含 omnivoice-merge-lora 合并 LoRA 权重),README 的表格只列了 3 个
- ▪硬依赖里有 transformers>=5.3.0,gradio、librosa、webdataset 也都是必装项,塞进一个已经在跑别的项目的环境容易撞版本
想自己微调的话,pyproject 里留了 LoRA 这组可选依赖(peft 0.20 以上),训练与评估的完整流程放在 examples/ 目录里。这里有一条值得单独记住的更新:0.2.1 修掉了一个会让训练悄悄变慢的 bug——flex_attention 之前不遵守 autocast,注意力会掉回 fp32,训练慢大约 4 倍。要微调就用 0.2.1 之后的版本。
我的判断
适合谁:想在本地跑语音克隆、又不想按字符给云服务交钱的团队;需要覆盖小语种的产品(前提是先去语言表里查那门语言有多少小时语料);做有声书、批量配音、给已有素材补旁白的人——24 kHz 输出加批量推理 CLI 就是给这种活儿准备的。
不适合谁:现在就要求本地实时对话级语音的,因为官方没给消费级显卡和 Mac 的任何数字;只想调一个不用装环境的 API 的;以及要做非中英语种 voice design 的——官方自己承认那个模式只在中英数据上训过,低资源语言会不稳定。
三个坑,按严重程度排:第一,权重许可要自己去 HuggingFace 模型卡上确认,代码的 Apache-2.0 不覆盖权重;第二,646 种语言里有大量语料不到 1 小时的语种,别把它当小语种全覆盖的方案;第三,语音克隆的伦理红线,官方免责声明写得很清楚——未授权克隆、声音冒充、诈骗都属于禁止用途,这不是建议,是动手之前就得想明白的事。
数据来源与核实说明
项目地址:github.com/k2-fsa/OmniVoice
star:12,327(GitHub API,抓取 2026-09-12);Trending 页同期快照 12,363,当日新增 572
fork 1,900 / 源码体积 1,187 KB / 未关闭 issue 61 / 建仓 2026-03-31 / 最新提交 2026-09-07
最新版本 0.2.1,2026-07-16 发布,release 未附带任何二进制资产
许可:Apache-2.0(LICENSE 为标准全文,无附加条款;附录版权方为 Xiaomi Corp);README 无 License 章节,仅有禁止未授权克隆的免责声明
语言数与语料时长取自仓库 docs/languages.md(Self-reported: 646 languages, 581k hours)
性能数字取自 README 的 FlashInfer 基准表(单张 H100 / fp16 / 32 步扩散 / 中文语音克隆)
权重模型卡 huggingface.co/k2-fsa/OmniVoice 本轮抓取失败,未纳入核实范围,相关结论一律未写入正文
本期经全语言日榜 16 项、周榜 23 项、月榜 23 项去重后无新面孔,改从分语言榜(Python 日榜)选题
数据来源:GitHub Trending 官方页面与 GitHub REST API · 抓取时间:2026-09-12 11:2x
这期的项目是从 Python 日榜上捞到的。全语言三榜这一轮已经没有我们没写过的新面孔,所以翻了一层语言榜,在那里撞见这个当日新增 572 的项目。
如果你正在纠结本地语音这条线怎么选,评论区说说你的场景:什么语种、要不要批量、机器是什么。下期可以把它和同一条线上的另外几个开源方案做一次横向实测。
#语音克隆#本地部署#开源许可
GitHub 趋势 · 第 58 期