Phonon TTS 端侧语音模型发布:31m 与 40m 两版,支持五语并登顶 Open TTS 榜单
A Closer Look at Phonon TTS. Launching High-Quality On-Device Speech That Tops the Benchmarks.
Phonon 是可在本地设备运行的小型 TTS 模型,无需服务器和网络,发布两周下载量超过 20 万次。模型分约 65 MB 和 75 MB 两版,覆盖英语、法语、德语、西班牙语和葡萄牙语,内置 100 多个音色并支持声音克隆与声音设计;Phonon 31m 采用 Apache 2.0 许可,Phonon 40m 为 CC BY-NC 非商用许可。
原文交代了端侧 TTS 的模型规格、开源许可和榜单表现,可据此判断小模型在本地语音场景的可用边界。
两周前,我们开放了 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 在发布的前两周下载量超过 200,000 次,并且仍在 Hugging Face 上保持热度。
Phonon 在 Hugging Face Open TTS Leaderboard 上的表现
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 也可在 🤗 Transformers 中使用,作为其参考 PyTorch 实现。ptts 在设备上运行单条流,而 Transformers 面向 GPU 吞吐量:批量生成、全图 torch.compile,例如用于大规模合成语音数据集。作为原生 PyTorch 实现,它是可供构建的基础,无论是将 Phonon 集成到你自己的技术栈中,还是研究模型本身。
它属于 Pocket TTS 系列,因此我们先将 Pocket TTS 添加到 Transformers。Phonon 作为模块化模型构建在其上:约 200 行代码仅描述差异部分。
Phonon 以自回归方式生成音频潜变量:每一步输出一个潜变量,并将其作为下一步输入反馈回去,训练损失也在这些潜变量上计算。潜变量是模型的输入、输出和目标,就像文本 token 之于语言模型,因此将音频映射到潜变量的编解码器扮演了分词器的角色。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)
提示布局(声音位置、文本,然后是一个开启音频的 token)随检查点一起作为聊天模板提供,就像 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
