Hugging Face 发布 Phonon 端侧文本转语音模型,登顶 Open TTS Leaderboard 多项指标
A Closer Look at Phonon TTS. Launching High-Quality On-Device Speech That Tops the Benchmarks.
Phonon 团队在 Hugging Face 博客回顾其端侧 TTS 模型 Phonon 的发布:模型体积约 65 MB 和 75 MB,支持英语、法语、德语、西班牙语和葡萄牙语,超过 100 个内置声音,支持通过 voice cloning 和 voice design 自定义声音,可在手机、笔记本、单板机和浏览器中离线运行。
作者回顾了 Phonon 端侧 TTS 的发布过程与榜单表现,读者可以了解小体积模型如何在可懂度和 CPU 流式速度上与更大模型比较。
两周前,我们开放了 Phonon——一个可在你自己设备上运行的小型文本转语音模型。它不需要服务器,也不需要网络,你输入的内容只留在你手中。
到目前为止的反响让我们非常满意。以下是这次发布背后的故事:我们为什么构建 Phonon,它能做什么,随它一同推出的演示,以及它在 Hugging Face Open TTS Leaderboard 上的表现。
为什么语音应该运行在你的设备上
大多数语音 AI 都在云端运行:每句话都要在服务器之间往返一次。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 上,它为你数次数、陪你坚持锻炼。一个来自 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 排行榜 是 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 以自回归方式生成音频潜变量:每一步输出一个潜变量,该潜变量又作为下一步的输入,训练损失也在这些潜变量上计算。潜变量既是模型的输入、输出也是目标,就像文本 token 之于语言模型,因此将音频映射为潜变量的编解码器扮演着分词器的角色。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 从不直接用它的音频分词器(只随附解码器)编码音频,声音都是预先计算好的: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 中的其他多模态模型一样。你只需编写一段标准对话,用一个空的 audio 项表示声音位置,代码在不同检查点之间保持一致。processor 随后将声音占位符扩展为每帧一个位置,对文本进行归一化和分词,并对输入进行批处理:
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 返回潜变量,再由 processor 将其解码为音频:
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
