收藏
1
0
分享
举报
·15 小时前发布·188次阅读

zixi-51M:这个模型只听过一个人却能替他开口

推荐独立开发商业增长付费用户

这个模型只听过一个人,却能替他开口

很多 TTS 模型说的是「平均」的声音,这个模型只学了一个人。

zixi-51M 项目海报


先说结论

前几天在 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。

Hugging Face 上的 zixi-51m 模型页

注意,这次公开的是推理用的权重,训练数据没有公开。对开发者来说,这意味着你能直接用,但不能照着数据集复现一个一模一样的模型。

第三步,跑一句话

在项目目录里新建一个 run.py,代码就这么几行。

然后运行。

跑完,目录里会多出一个 hello.wav,就是生成的语音,采样率 44.1kHz,单声道。第一次运行会从 Hugging Face 下载大约 206 MB 的权重,之后就直接用本地缓存了。

它不需要 API Key,不需要显卡,也不需要等云端返回。文本留在本地,这对很多人来说就够了。需要注意的是,它只支持中文,别拿英文去试。

星图里 zixi-51M 的开发者入口

它为什么小得有意思

我看它的 README 时,印象最深的是它怎么「减」。

很多语音合成模型要么调云端 API,要么得配一张不便宜的显卡。zixi-51M 把参数压到 5100 万上下,CPU 也能跑。对个人开发者来说,这意味着你想做一个本地朗读工具,可以不用先找云服务。

它还把 BERT 整个拿掉了。文本那一侧只保留音素和声调的嵌入。原版 MeloTTS 支持多种语言,要为不同语言做切换。zixi-51M 把这些全砍了,符号表 77 个,声调 6 个,整套结构只服务中文。

砍掉之后,模型只做一件事,把中文念好。

只有一个人的声音

这是我觉得最有意思的一点。

很多合成声音是多个说话人混合出来的平均值,听起来标准,但缺少个性。zixi-51M 只用了一个真人的声音训练,说话人标识就是 zixi。

作者的说法是,这样输出会保留这个人的音色、节奏和气口。具体效果如何,别听我说,去听听项目里的示例音频,再用你自己的耳朵判断。

想训练自己的声音?

仓库里有完整的训练代码,包括预处理和训练脚本。数据格式是「音频路径|说话人|语言|文本」,音频要求是 44.1kHz、单声道 wav。

如果你想用它微调自己的声音,把配置指向你自己的说话人目录就行。不过有一条要先想清楚,用别人的声音训练,一定要先拿到对方的明确授权。

写在最后

这个项目让我想到一件事。模型不一定要越来越大,有时候,一个足够小、只做一件事的东西,反而更有用。

如果你正在找一个能在本地跑的中文语音合成模型,这个项目值得你去看一看。

讨论 (0)

0/250

    目录

    关于作者

    心得体会

    AI产品运营 / 文科生AI独立开发者 / AI Agent应用落地/AI native&bulider ex百度(秒哒AI产品运营)

    Solo 独立开发者社区support@solo.xin
    关于社区SOLO.cc隐私政策用户协议商务合作友情链接订阅更新(RSS)投稿赞助

    © 2023 SOLO · 为独立开发者而生