112MB的语音模型,在4个CPU线程上跑到实时20倍
Silencio-2 是一个 18M 参数的 TTS 模型,微调自 Kyutai 的 Pocket TTS 18M。做法很直接:把标签写进文本里。写进笑,模型就笑;写进耳语,声音就压低。权重和代码放在 Hugging Face 上,没有付费层级,也没有 API 挡在前面。
体量上,语音部分 18.2M 参数,加上声音克隆需要的编码器是 27.9M,磁盘占 112MB。在 Apple M4 上用 4 个 CPU 线程、不开 GPU,速度约是实时的 20 倍。输出 24kHz,支持流式生成,能从一段短音频克隆声音。只支持英文。
标签写进文本
声音标签五种:笑、叹气、喘气、咳嗽、清嗓子。情绪标签六种:开心、悲伤、愤怒、恐惧、惊讶、耳语。全部写在句子里,表现力在生成这一步就处理掉了,不用回头再叠一层音效。
训练规模不大。2 块 T4,约 50 小时音频、27k 个片段,最后一次训练跑了大约 6 小时。
训练过程里的三个坑
最值得记的一条是数据过滤。作者一开始用 AudioSet 标签器筛数据,跑完按标签数行数,笑、咳嗽、清嗓子三类全是零。过滤器把这些标签静默删掉了。不数这一遍,模型就会学不会这几种声音,而且没人知道为什么。
最终版本干脆去掉过滤,改用手工听过确认的数据。
第二个问题是提示泄漏。声音提示如果取自一段带情绪录音的开头,模型会照抄提示里的情绪。文本里写的标签,它反而不理。所以带标签的样本里,有一半改用同一声音的中性片段当提示。
第三个问题出在长文本。Pocket TTS 会把长文本切块,写在开头的标签只覆盖第一块。推理包的处理方式是在每个块上重复这个标签。
耳语是最不稳定的标签,效果取决于具体句子和声音。真实耳语比正常说话安静约 10 倍,所以 generate() 默认会把它的电平抬上去。
准确率上,作者没有在这个 checkpoint 上跑 WER 基准。他提到一个没发布的后续训练阶段:300 个 LibriSpeech 项目上 WER 是 1.9%。基础版 Pocket TTS 是 1.5%。按这个差距,表现力换来的是一点准确性代价。
跑起来和许可
目前没有 pip 包。要跑得克隆仓库、装 requirements.txt。权重许可 CC-BY-4.0,继承自 Pocket TTS;核心推理代码是 MIT。
声音克隆只要一小段音频,门槛确实低。
社区反应两种声音都有。一位用户说自己已经在功耗低于 1W 的微控制器上跑过 phonon 和 Kyutai Pocket TTS。他觉得效果不错。另一位说,没有 audio.cpp 支持的话,不会在这个项目上花太多时间。两条都是用户评论,不是作者给出的硬件指标。
作者把功劳归给 Kyutai 的 Pocket TTS 和它开源的训练代码。
目前放出来的就是英文、本地、标签写在文本里的这一版。20 倍实时是在 M4 的 4 个 CPU 线程上测的,别的硬件上没有数字。
关键事实
- Silencio-2是一个18M参数的TTS模型,支持文本内标签控制情绪和声音效果。
- 模型权重和代码在Hugging Face上免费开放,无付费层级或API。
- 模型大小:18.2M参数(语音),27.9M(含编码器),磁盘占用112MB。
- 在Apple M4上使用4个CPU线程,无GPU,速度约为实时20倍。
- 支持24kHz采样率、流式生成、从短片段进行声音克隆,仅支持英文。
- 支持的声音标签:笑、叹气、喘气、咳嗽、清嗓子。
- 支持的情绪标签:开心、悲伤、愤怒、恐惧、惊讶、耳语。
- 训练数据:约50小时音频,27k个片段,最终运行约6小时,使用2块T4 GPU。