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.

三种模式的差别值得说清楚,因为它们的成熟度完全不同:

一、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 步扩散:

批量基线 RTFFlashInfer RTF加速
10.08990.04302.1x
1 + CUDA graph0.03672.4x
20.04800.02452.0x
40.03310.01522.2x
80.02980.01152.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)

下面几条是官方文档里散落的注意事项,装之前先看一眼能省时间:

想自己微调的话,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 期