跳到正文
实时
Hugging Face Blog·· 10 天前精选72

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 两个版本,覆盖英语、法语、德语、西班牙语和葡萄牙语。

Why it matters

原文交代了端侧 TTS 的模型规格、开源许可与榜单表现,可据此判断小模型在本地语音场景的可用边界。

正文 · AI 翻译

两周前,我们推出了 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 流式传输基准 上的时间到第一个音频方面位居榜首。

Bar chart of the top 10 models by 95th-percentile time to first audio. Phonon 31m en is first at 28 ms and Phonon 40m en is second at 38 ms, ahead of Pocket TTS at 165 ms. Lower is better.

推理

我们为 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