Heidi Labs
Hugging FaceAI 领域最新发展约 10 分钟4,161 字

深入解读 Phonon TTS:发布登顶榜单的高质量端侧语音

本文目录

作者:Olesia Krizhevich、Laurent Mazare、Eric Bezzam、Eustache Le Bihan

发布于 2026 年 11 月 5 日

两周前,我们开放了 Phonon——一个能在你自己的设备上运行的小型文本转语音(text-to-speech,TTS)模型。它不需要服务器,也不需要网络,你输入的内容始终留在你身边。

到目前为止,我们对其反响非常满意。下面是这次发布的故事:我们为什么做 Phonon、它能做什么、随它一同发布的演示,以及它在 Hugging Face 开放 TTS 排行榜(Open TTS Leaderboard)上的表现。

为什么声音应该住在你的设备上#

大多数语音 AI 生活在云端:每一句话都要往返服务器一次。Phonon 则运行在你自己的设备上。你的文本留在本地,声音在没有网络的情况下也能工作。我们还开放了权重。Phonon 31m 采用 Apache 2.0 许可,因此你可以免费使用,甚至用于商业产品。其他模型采用 CC BY-NC 许可,对非商业项目免费。如果你要用这些模型做商业产品,定价基于用户数量,而不是生成的语音量。

让高质量的声音在小设备上运行一直很难。你可以把模型做小,但那样听起来不够好;也可以让它听起来很棒,但那样就装不下。我们同时解决了这两个问题。

我们在四月宣布了 Phonon,并在接下来的六个月里与合作伙伴和早期用户一起迭代。他们的反馈帮助我们塑造了这次发布。模型变得更小,我们增加了更多语言,并通过声音克隆(voice cloning)和声音设计(voice design)支持自定义声音。

Phonon 基于 Pocket TTS 谱系,因此使用流匹配(flow matching)来生成音频,这与其他 TTS 系统所用的建模技术非常不同。正是这一点让我们能把这种质量带到如此小的模型中,但它也在训练时带来了新的挑战。训练最初在数值上并不稳定,需要若干技巧才能在全部五种语言上产出高质量结果。

我们发布了什么#

Phonon 有两种尺寸,分别约为 65 MB 和 75 MB。它们合起来能说英语、法语、德语、西班牙语和葡萄牙语。内置声音超过 100 种,你也可以在 Gradium Studio 中创建自己的声音。Phonon 还能处理大多数其他 TTS 系统常常出错的重要内容,比如电话号码、日期和代码。

它可以在手机、笔记本电脑、单板计算机(single-board computer)和浏览器标签页中运行,所以你现在就能听到它。Phonon 31m 说英语,采用 Apache 2.0 许可,因此你可以自由地在其上构建,包括用于商业产品。Phonon 40m 以非商业许可覆盖全部五种语言。

演示与首批项目#

发布时附带了来自朋友和我们自己团队的演示。在关闭 Wi-Fi 的 Apple Watch 上,Phonon 一步步教你冲咖啡。在没有信号的 iPhone 上,它为你数次数并给你打气。Autonomous 公司一个叫 Lamp 的机器人戴着分院帽,用角色口吻说话。在浏览器中,一个离线恐龙跑酷游戏变成了由 Rex 主持的广播节目。还有一个科幻游戏由玩家自己的机器配音,以及一页页朗读普鲁斯特的作品。

Hugging Face 团队构建了 Transformers 集成,因此开发者从第一天起就能在 Transformers 中使用 Phonon。

开发者也已开始基于它构建。一个 ExecuTorch 转换让 Phonon 在浏览器中利用访客的 GPU 运行,Micdrop 把它带入 Node.js 应用,像 smallest-s2s 这样的 Spaces 也基于它构建。

Phonon 在头两周的下载量超过 20 万次,并且仍在 Hugging Face 上持续走热。

Phonon 在 Hugging Face 开放 TTS 排行榜上的表现#

开放 TTS 排行榜(Open TTS Leaderboard)是 Hugging Face 一个非常新的项目,我们很喜欢它。Hugging Face Hub 上有超过 9,000 个 TTS 模型,这个排行榜为开发者提供了一个集中比较开放模型、并排试听的地方。排行榜覆盖 23 种语言,模型在可懂度(输出的词错误率)、速度(逆实时因子和首音频时间)以及自然度(英语用 UTMOS,韩语用 KOMOS)上接受评估。评估包括固定声音和声音克隆,后者还额外使用说话人相似度指标。排行榜还有一个「试听」(Listen)标签页,方便你自己比较 TTS 输出,并为你最喜欢的投票。

在可懂度上,Phonon 在德语和西班牙语中排名第一,在我们评估的每种语言中都进入前三,而对手模型的规模可达它的 100 倍。

速度是 Phonon 真正闪光的地方:这些模型在 CPU 流式基准的首音频时间上排名第一。

推理#

我们专门为 Phonon 构建了一个新的推理框架 ptts。ptts 的目标是在各种设备上获得最佳性能,因此支持 10 多种后端:CPU(Intel、Arm、WebAssembly)、GPU(CUDA、Vulkan、Metal、WebGPU)以及 NPU(Apple Core ML、Snapdragon®)。

从 v5.21 起,Phonon 也作为其参考 PyTorch 实现出现在 🤗 Transformers 中。ptts 在设备上运行单条流,而 Transformers 面向 GPU 吞吐量:批量生成、全图 torch.compile,例如用于大规模合成语音数据集。作为原生 PyTorch 实现,它是进一步构建的基础——无论是把 Phonon 集成到你自己的技术栈,还是研究模型本身。

它属于 Pocket TTS 谱系,所以我们先把 Pocket TTS 加入 Transformers。Phonon 作为模块化模型叠加其上:约 200 行代码,只描述不同之处。

Phonon 以自回归方式生成音频潜变量(audio latents):每一步输出一个潜变量,并作为下一步的输入反馈回去,训练损失也基于它们计算。潜变量既是模型的输入、输出也是目标,就像文本 token 对语言模型那样,因此把音频映射到潜变量的编解码器(codec)扮演了分词器(tokenizer)的角色。Transformers 正是这样提供的:一个音频分词器,与文本分词器一同由处理器(processor)持有:

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():,}") # 30,788,354
print(f"{processor.audio_tokenizer.num_parameters():,}") # 10,305,313

声音不是一段录音,而是一个说话人潜变量张量。Phonon 从不直接用其音频分词器编码音频——该分词器只提供解码器(decoder-only)——声音是预先计算好的: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 # (num_frames, 512)

提示布局(声音位置、文本,然后是一个开启音频的 token)作为聊天模板随检查点一起发布,就像 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)
# prompt: <|audio_prompt|> × num_frames, "Hello from Phonon.", <|audio_bos|>

generate 返回潜变量,处理器将其解码为音频:

outputs = model.generate(**inputs) # audio_latents: (batch_size, num_frames, 32)
audio = processor.decode(outputs.audio_latents, outputs.audio_latents_mask)
processor.save_audio(audio, "phonon.wav")

更多内容请参阅 🤗 文档!

下一步#

Phonon 可以用任何声音说话。在说话人同意的前提下,用一段简短录音克隆一个声音,或在 Gradium Studio 中用纯文本描述一个新声音。然后下载声音文件,加载到 Phonon 中,它就能完全在设备上运行。

我们还会与设计合作伙伴一起训练定制的 Phonon 模型。如果你的内存预算紧张,我们可以把模型做得更小。如果你需要韩语、阿拉伯语或日语,我们也可以为此训练。如果你的产品有自己的一套词汇,我们可以基于它做微调。联系我们,告诉我们你的需求。

感谢 Hugging Face 团队,也感谢在头两周试用 Phonon 的每一个人。

Phonon 是我们的首个开放发布。试用它,并告诉我们你构建了什么。