Phonon TTS 发布端侧语音模型,登顶 Hugging Face 开放 TTS 榜单多项指标
A Closer Look at Phonon TTS. Launching High-Quality On-Device Speech That Tops the Benchmarks.
Phonon 发布可在本地设备运行的小型 TTS 模型,无需服务器和网络,提供约 65 MB 和 75 MB 两个版本,覆盖英语、法语、德语、西班牙语和葡萄牙语。
原文交代了端侧 TTS 的模型规格、开源许可与榜单表现,可据此判断小模型在本地语音场景的可用边界。
两周前,我们推出了 Phonon,这是我们可以在您自己的设备上运行的轻量级文本转语音模型。它不需要服务器和网络,您输入的内容将保留在您身边。
到目前为止,我们非常满意反响。以下是发布的故事:我们为什么构建了 Phonon,它能做什么,随附的演示以及它在 Hugging Face 的 Open TTS 排行榜上的表现。
为什么语音应该存在于您的设备上
大多数语音人工智能都存在于云端:每一句话都会往返服务器。Phonon 则在您自己的设备上运行。您的文本保留在那里,语音可以在没有网络的情况下工作。我们还开放了权重。Phonon 31m 是 Apache 2.0 许可,因此您可以在商业产品中免费使用它。其他模型是 CC BY-NC 许可,因此它们对非商业项目免费。如果您使用这些模型构建商业产品,定价基于您的用户数量,而不是您生成的语音量。
在小型设备上获得良好的语音一直很困难。您可以缩小模型,但那样声音不会很好。或者您可以使其声音很好,但那样它就放不下了。我们解决了这两个问题。
我们在四月宣布了 Phonon,并在接下来的六个月里与合作伙伴和早期用户一起开发它。他们的反馈帮助我们塑造了这次发布。模型变得更小,我们添加了更多语言,并通过语音克隆和语音设计支持自定义语音。
Phonon 基于 Pocket TTS 家族,因此它使用流匹配来生成音频,这与其他 TTS 系统使用的建模技术非常不同。这就是我们能够将这种级别的质量带到如此小的模型中的原因,但这在训练模型时创造了新的挑战。训练最初在数值上是不稳定的,并且需要一些技巧才能在五种语言上生成高质量的结果。
我们发布了什么
Phonon 有两种大小,大约 65 MB 和 75 MB。它们一起说英语、法语、德语、西班牙语和葡萄牙语。有 100 多个内置语音,您可以在 Gradium Studio 中创建自己的语音。Phonon 还处理大多数其他 TTS 系统经常出错的重要事情,比如电话号码、日期和代码。
它可以在手机、笔记本电脑、单板计算机和浏览器标签页中运行,因此您可以 现在就听到它。Phonon 31m 说英语,是 Apache 2.0 许可,因此您可以自由地在其上构建,包括用于商业产品。Phonon 40m 在非商业许可下涵盖所有五种语言。
演示和第一个项目
发布 配备了来自朋友和我们自己的团队的演示。在 Wi-Fi 关闭的 Apple Watch 上,Phonon 会逐步引导您冲泡咖啡。在没有信号的 iPhone 上,它会数您的重复次数并让您保持动力。一个名为 Lamp 的机器人,来自 Autonomous,戴着一顶分类帽并以角色身份说话。在浏览器中,一个离线的恐龙跑酷游戏变成了由 Rex 主持的广播节目。还有一个科幻游戏在玩家的自己的机器上发声,以及普鲁斯特逐页朗读。
Hugging Face 团队构建了 Transformers 集成,以便开发人员从一开始就能使用 Phonon 在 Transformers 中。
开发人员也开始在其上构建。一个 ExecuTorch 转换 在浏览器的访客 GPU 上运行 Phonon,Micdrop 将其带到 Node.js 应用程序中,而像 smallest-s2s 这样的 Spaces 则在其上构建。
Phonon 在其前两周下载量超过 200,000 次,并且目前在 Hugging Face 上仍然很受欢迎。
Phonon 在 Hugging Face Open TTS 排行榜上的表现
来自 Hugging Face 的 Open TTS 排行榜 是一个非常新的项目,我们非常喜欢它。在 Hugging Face Hub 上有超过 9,000 个 TTS 模型,排行榜为开发者提供了一个可以比较开放模型并并排听它们的地方。在 23 种语言中,模型在 清晰度 (输出词错误率)、速度 (逆实时因子和时间到第一个音频) 和 自然度 (英语的 UTMOS 和韩语的 KOMOS) 上进行评估。固定声音和声音克隆被评估,后者有一个额外的说话人相似性指标。排行榜还有一个听一听标签页,你可以方便地自己比较 TTS 输出并为最喜欢的那几个投票。
在清晰度方面,Phonon 在 德语 和 西班牙语 中排名第一,并且在我们在每种语言中评估的排名前三,紧随其后的是大小最多为其 100 倍的模型。
速度是我们看到 Phonon 真正发光的地方,因为模型在 CPU 流式传输基准 上的时间到第一个音频方面位居榜首。
推理
我们为 Phonon 构建了一个新的推理框架,ptts,专门用于 Phonon。ptts 的目标是在各种设备上获得最佳性能,因此它支持超过 10 个后端:CPU (Intel, Arm, WebAssembly)、GPU (CUDA, Vulkan, Metal, WebGPU) 和 NPU (Apple Core ML, Snapdragon®)。
Phonon 也可以在 🤗 Transformers 中使用,从 v5.21 开始,作为其参考 PyTorch 实现。ptts 在设备上运行单个流,Transformers 针对的是 GPU 吞吐量:批量生成、全图 torch.compile,例如,用于大规模合成语音数据集。作为原生 PyTorch,它是构建的基础,无论是将 Phonon 集成到您自己的堆栈中,还是研究模型本身。
它属于 Pocket TTS 系列,因此我们首先将 Pocket TTS 添加到 Transformers 中。Phonon 位于顶层,作为一个 模块化 模型:大约 200 行 代码仅描述了不同的部分。
Phonon 以自回归方式生成音频潜空间:每一步输出一个潜空间,该潜空间被反馈作为下一个输入,并在其中计算训练损失。潜空间是模型的输入、输出和目标,就像文本标记对语言模型一样,因此编解码器将音频映射到潜空间的作用就像一个标记器。Transformers 将其作为这样提供:一个 音频标记器,由处理器与文本标记器一起持有:
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 从不直接使用其音频标记器对其音频进行编码,该标记器仅提供解码器,并且声音是预先计算的: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)
提示布局(声音位置、文本,然后是一个打开音频的标记)作为聊天模板与检查点一起提供,就像 Transformers 中的其他多模态模型一样。您编写一个标准的对话,在声音的位置放置一个空的 audio 项,并且您的代码在不同的检查点之间保持不变。然后处理器将声音占位符扩展为每个帧的位置,归一化并标记化文本,并将输入批处理:
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 是我们的首次公开发布。 试用它 并告诉我们你构建了什么。
来源: Hugging Face Blog · huggingface.co
