两周前,Phonon 文本转语音模型正式发布。该模型无需服务器和网络连接即可运行,确保用户输入的数据完全保留在本地设备中。

以下是 Phonon 发布背后的故事,包括其开发初衷、功能特性、演示案例以及在 Hugging Face 开放 TTS 排行榜上的表现。
为什么声音应该活在您的设备上
大多数语音 AI 依赖云端处理,每句话都需要在服务器之间传输。Phonon 则选择在用户自有设备上运行,不仅保护了短信隐私,还能在无网络环境下工作。此外,该模型开源且允许免费用于商业产品,区别于许多仅支持非商业用途的 CC BY-NC 许可证模型。其定价策略基于用户数量,而非生成的语音量。
在小设备上实现高质量语音生成一直是个挑战:缩小模型往往牺牲音质,而提升音质则导致模型过大无法适配。团队在这两方面进行了平衡优化。
Phonon 于四月份首次公布,随后六个月期间,团队与合作伙伴及早期用户共同开发,根据反馈增加了更多语言支持,并通过语音克隆和语音设计功能实现了定制语音。
Phonon 基于 Pocket TTS 谱系,采用流量匹配(flow matching)技术生成音频,这与其他 TTS 系统的建模技术截然不同。这种架构使得小模型也能达到高音质,但也带来了训练挑战。初期训练存在不稳定性,团队通过多种技巧最终在所有五种语言上获得了高质量结果。
发布内容与技术规格
Phonon 提供两种尺寸版本,分别约为 65 MB 和 75 MB。这两个版本共同支持英语、法语、德语、西班牙语和葡萄牙语。用户可在 Gradium Studio 中创建自定义声音,处理电话号码、日期和代码等特定格式。
该模型兼容手机、笔记本电脑、单板电脑以及浏览器标签页。在非商业许可证下,Phonon 40m 版本涵盖所有五种语言,且可免费用于商业产品。
演示与首批项目
发布时展示了来自合作伙伴及内部团队的多个演示案例:
- 在没有 Wi-Fi 的 Apple Watch 上,Phonon 逐步介绍咖啡知识。
- 在无信号的 iPhone 上,它统计重复次数以辅助健身。
- Autonomous 公司的机器人 Lamp 戴着分类帽进行角色扮演。
- 在浏览器中,离线恐龙跑酷游戏变身由 Rex 主持的广播节目。
- 一款科幻游戏在玩家本地机器上发声,普鲁斯特作品被大声朗读。
Hugging Face 团队构建了 Transformers 集成,开发者从第一天起即可在 Transformers 中使用 Phonon。
开发者社区也迅速跟进:ExecuTorch 转换使 Phonon 能在浏览器访客 GPU 上运行;Micdrop 将其引入 Node.js 应用;Spaces 平台上的最小-s2s 等应用也基于此构建。
上线头两周内,Phonon 下载量超过 200,000 次,目前仍在 Hugging Face 热门趋势榜上。
Hugging Face 开放 TTS 排行榜表现
Hugging Face 推出的 Open TTS Leaderboard 是一个新项目,旨在为开发者提供集中比较开源模型并试听对比的平台。目前 Hub 上已有超过 9,000 个 TTS 模型。评测涵盖 23 种语言,主要指标包括可懂度(词错误率)、速度(实时因子倒数及首音频生成时间)和自然度(英语使用 UTMOS,韩语使用 KOMOS)。固定音色与声音克隆均纳入评测,后者额外考察说话人相似度。排行榜设有“Listen”标签页供用户自行对比和投票。
在可理解性方面,Phonon 在德语和西班牙语中排名第一。
速度是 Phonon 的优势领域,其模型在首音频生成时间(Time to First Audio)上超越了 CPU 流量基准。
推断框架与技术实现
团队开发了专为 Phonon 设计的新型推断框架 ptts,旨在在各种设备上获得最佳性能。ptts 支持超过 10 个后端,包括 CPU (Intel, Arm, WebAssembly)、GPU (CUDA, Vulkan, Metal, WebGPU) 和 NPU (Apple Core ML, Snapdragon®)。
从 v5.21 版本开始,Phonon 也可在 Transformers 中使用,作为其参考 PyTorch 实现。ptts 侧重于设备端单一流运行,而 Transformers 针对 GPU 吞吐量优化,支持批量生成和全图 torch.compile,适用于大规模合成语音数据集。作为原生 PyTorch 实现,它是集成到自有堆栈或研究模型的基础。
由于属于 Pocket TTS 谱系,Pocket TTS 首先被添加到 Transformers 中。Phonon 作为一个模块化模型位于其上,约 200 行代码描述了差异部分。
Phonon 以自回归方式生成音频潜变量:每个步骤输出一个潜变量,作为下一个输入,并计算训练损失。隐藏状态是模型的输入、输出和目标,类似于语言模型中的文本令牌。编解码器将音频映射到隐藏状态中,起到代币化器的作用。转换器将其发送为音频标记器,旁边配有文字标记器:
from transformers import AutoProcessor, GradiumPhononTTSForConditionalGeneration
model_id = "gradium/phonon-31m-en"
processor = AutoProcessor.from_pretrained(model_id, device_map="auto")
model = GradiumPhononTTSForConditionalGeneration.from_pretrained(model_id, device_map="auto")
print(f"{model.num_parameters():,}")
print(f"{processor.audio_tokenizer.num_parameters():,}")
声音并非录音,而是发言者潜变量的张量。Phonon 不通过音频编码器直接编码音频,只提供解码器,声音预先计算存储在 gradium/phonon-voices 中:
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
path = hf_hub_download("gradium/phonon-voices", "voices/LMDIYE0Oa377Qh6Z.safetensors")
voice = load_file(path)["speaker_wavs"][0].T
提示布局(语音位置、文本、然后打开音频的代币)与检查点一起作为聊天模板,类似于 Transformers 中的其他多模态模式。编写标准对话,用空音频项传达声音,代码在检查站保持不变。处理器扩展语音占位符,规范化和标记化文本,并分批输入:
conversation = [
{"role": "user", "content": [{"type": "audio"}, {"type": "text", "text": "Hello from Phonon."}]}
]
inputs = processor.apply_chat_template(
conversation,
tokenize=True,
return_dict=True,
add_generation_prompt=True,
processor_kwargs={"audio_prompt_latents": [voice]},
).to(model.device)
产生隐藏的返回值,处理器将其解码为音频:
outputs = model.generate(**inputs)
audio = processor.decode(outputs.audio_latents, outputs.audio_latents_mask)
processor.save_audio(audio, "phonon.wav")
未来规划
Phonon 可以用任何声音说话。在发言人同意下,可从短片录音中复制声音,或在 Gradium Studio 中用纯文本描述新声音。下载语音文件后加载到 Phonon 中,即可在设备上完全运行。
团队还与设计合作伙伴合作培训定制的 Phonon 模型。如果内存预算紧张,可以缩小模型;如果需要韩语、阿拉伯语或日语,也可以提供培训;如果产品有特定词汇,可以进行微调。





