这个模型只听过一个人,却能替他开口
很多 TTS 模型说的是「平均」的声音,这个模型只学了一个人。
![]()
先说结论
前几天在 GitHub 上刷到一个小项目,叫 zixi-51M,项目地址是 https://github.com/lizixi-0x2F/zixi-51M 。它是一个只说中文的语音合成模型,参数量 5143 万,MIT 协议开源。
我第一眼看它,觉得它很「不合群」。现在大家都在卷参数,它偏偏往小了做,还只为一个人的声音服务。
作者自述,我为什么做 zixi-51M
最开始做 zixi-51M,其实是因为我对目前语音合成模型的发展方向有一些疑问。
现在很多语音模型的参数规模已经到了几十亿甚至更高的量级,效果当然越来越好,但与此同时,推理成本、硬件门槛也在不断增加。尤其是在本地部署场景下,CPU 端的测试、优化和实际使用体验,我认为还没有得到足够的重视。另一方面,很多模型首先考虑的是多语言覆盖,中文只是其中一种支持的语言,而不是整个系统设计的出发点。
所以我想做一件相对简单的事情,能不能用尽可能小的模型,在普通人的电脑上,合成足够真实、足够自然的中文语音?
这就是 zixi-51M 的出发点。它是一个约 5100 万参数的中文专用 TTS 模型,基于 VITS2 技术路线开发。我希望它能够服务于那些没有昂贵 GPU、没有云服务预算,但仍然希望在本地使用语音合成技术的人,包括个人开发者、独立创作者、小团队,以及希望在自己设备上部署中文语音能力的开源爱好者。
对于我而言,本地部署不仅仅意味着降低成本,也意味着用户可以真正控制自己的工具。不需要调用付费 API,不需要为了合成一句话而把文本发送到云端。尤其对独立开发者来说,这一点非常重要。
在技术实现上,我采取了比较激进的简化策略。
首先是彻底移除 BERT。我不认为一个面向单一语言、单一音色的 TTS 模型,一定需要保留庞大的预训练语言表征模块。zixi-51M 使用更精简的音素和声调 Embedding 来完成文本侧的输入表征,尽可能减少不必要的模型复杂度。
但我并没有选择完全从零开始训练。相反,我保留并迁移了上游预训练模型中有价值的参数,尤其是已有的音素、声调及说话人表征,作为训练的起点。
我的思路不是为了小而盲目地删除参数,而是尽量保留已经被预训练验证过的有效能力,同时移除当前任务不再需要的部分。
这是一种很实用的工程策略。对于计算资源有限的开发者来说,重新训练所有东西往往并不经济。真正值得研究的是,一个预训练模型里,究竟哪些部分必须保留,哪些部分可以被替换,哪些部分实际上并不是完成目标任务所必需的?
另一个我非常在意的问题是数据。
我自己首先是一名文学写作者,长期进行中文小说创作,积累了几十万字的原创文学文本。这样的经历给了我一个很特殊的条件,我可以利用自己的文本和声音,围绕真实的中文表达来构建语音数据。
相比完全依赖现成的通用数据集,我更希望探索小团队如何利用手头已有的资源建立自己的训练数据。包括自己写文本、自己朗读、制作配对语音,以及通过已有的语音技术扩充数据。
这件事可能对很多缺乏数据资源的个人开发者和小团队有启发。我们经常讨论模型缺少参数、缺少计算资源,但实际上,很多项目最早遇到的问题是缺少数据,而且是不知道该怎样获得适合自己任务的数据。我的想法是,数据并不一定只能从大型数据集中获得,它也可以被有意识地创作出来。
当然,自己制作数据不意味着数据质量可以不受约束。尤其是涉及合成语音扩充时,必须注意音色一致性、语音自然度以及合成数据本身可能带来的偏差。但至少对于资源有限的开发者而言,这提供了另一条值得尝试的路线。
在语音合成的审美上,我坚持的是两个字,拟真。
我不希望模型仅仅做到发音正确、语句流畅。我更在意它能不能保留一个真实说话者的特点,包括音色、节奏、呼吸感,以及一些非常细微的发声细节。
比如齿音、鼻音、胸腔共鸣所形成的音色特征。这些东西在传统的语音合成评价里未必总是最显眼的指标,但它们恰恰是我们辨认一个人声音的重要依据。
一个人说话并不总是绝对标准、绝对平滑的。真实声音存在细微的不规则性,而这些不规则性有时候才是声音最具有辨识度的部分。
所以 zixi-51M 并不追求成为一个包罗万象的通用语音模型。它首先想解决的是一个更加具体的问题,能不能用一个很小的模型,尽可能真实地保留一个人的声音?
至于后续发展,我希望继续保持开源。
当前项目已经公开了推理代码、训练流程及模型权重,后续我也希望逐步完善 CPU 端的性能测试、推理优化、部署体验和技术文档,让普通开发者能够更方便地使用、复现和改造它。
我也欢迎它与其他开源项目组合。例如本地大语言模型、离线语音助手、阅读软件、无障碍工具,以及其他需要中文语音输出能力的应用。
我不认为每个项目都需要独立构建一套庞大的技术生态。有时候,一个足够小、足够明确、能够与其他项目协同工作的组件,反而更有价值。
当然,我不会把 5100 万参数当作最终目标,更不会认为参数越少就一定越好。模型规模、音质、推理速度和设备兼容性之间始终存在取舍。我希望后续通过更充分的实验,继续探索它们之间的平衡。
我始终认为,人工智能的发展不应该只有一条不断扩大参数规模的道路。
真正的智慧,不光在于把模型做广、做大,也在于把模型做小、做得普惠。
如果一个普通开发者不需要昂贵的计算设备,不需要持续支付云服务费用,就能够在自己的电脑上运行一个中文原生、具有真实个人音色的语音模型,那么我认为这件事是有意义的。
zixi-51M 当然不是一个完美的模型,它还有很多值得继续改进的地方。但这恰恰是我把它开源的原因。
我希望它不仅仅是一个已经训练好的语音模型,也能够成为其他开发者继续研究、修改和实验的起点。
毕竟,技术进步不应该只是让最强大的机器变得更强大。它也应该让更多普通人的机器,能够做到过去做不到的事情。
李籽溪 · zixi-51M 开发者
开发者视角,我怎么把它跑起来
先说我自己的习惯。拿到一个语音模型,我不关心论文写得多漂亮,先看它能不能在我的机器上跑通。项目地址放在这里。https://github.com/lizixi-0x2F/zixi-51M 。
第一步,装环境
项目用 uv 管理依赖,Python 要求 3.11。命令很短。
最后那一行是用来下载权重的,装上就行。
这里有个小坑。项目里的 monotonic_align 会通过 numba 即时编译,所以你的 Python 版本要被 numba 支持,3.10 以上就行,但目前还不支持 3.14。如果安装时卡在编译那一步,先检查一下版本。
第二步,拿权重
权重放在 Hugging Face 上,仓库名是 NoesisLab/zixi-51m。
![]()
注意,这次公开的是推理用的权重,训练数据没有公开。对开发者来说,这意味着你能直接用,但不能照着数据集复现一个一模一样的模型。
第三步,跑一句话
在项目目录里新建一个 run.py,代码就这么几行。
然后运行。
跑完,目录里会多出一个 hello.wav,就是生成的语音,采样率 44.1kHz,单声道。第一次运行会从 Hugging Face 下载大约 206 MB 的权重,之后就直接用本地缓存了。
它不需要 API Key,不需要显卡,也不需要等云端返回。文本留在本地,这对很多人来说就够了。需要注意的是,它只支持中文,别拿英文去试。
![]()
它为什么小得有意思
我看它的 README 时,印象最深的是它怎么「减」。
很多语音合成模型要么调云端 API,要么得配一张不便宜的显卡。zixi-51M 把参数压到 5100 万上下,CPU 也能跑。对个人开发者来说,这意味着你想做一个本地朗读工具,可以不用先找云服务。
它还把 BERT 整个拿掉了。文本那一侧只保留音素和声调的嵌入。原版 MeloTTS 支持多种语言,要为不同语言做切换。zixi-51M 把这些全砍了,符号表 77 个,声调 6 个,整套结构只服务中文。
砍掉之后,模型只做一件事,把中文念好。
只有一个人的声音
这是我觉得最有意思的一点。
很多合成声音是多个说话人混合出来的平均值,听起来标准,但缺少个性。zixi-51M 只用了一个真人的声音训练,说话人标识就是 zixi。
作者的说法是,这样输出会保留这个人的音色、节奏和气口。具体效果如何,别听我说,去听听项目里的示例音频,再用你自己的耳朵判断。
想训练自己的声音?
仓库里有完整的训练代码,包括预处理和训练脚本。数据格式是「音频路径|说话人|语言|文本」,音频要求是 44.1kHz、单声道 wav。
如果你想用它微调自己的声音,把配置指向你自己的说话人目录就行。不过有一条要先想清楚,用别人的声音训练,一定要先拿到对方的明确授权。
写在最后
这个项目让我想到一件事。模型不一定要越来越大,有时候,一个足够小、只做一件事的东西,反而更有用。
如果你正在找一个能在本地跑的中文语音合成模型,这个项目值得你去看一看。