Phonon TTS 深度解析:设备端高质量语音模型登顶基准
A Closer Look at Phonon TTS. Launching High-Quality On-Device Speech That Tops the Benchmarks.
Gradium 解析其两周前开放的设备端 TTS 模型 Phonon,给出它在 Hugging Face Open TTS Leaderboard 的评测与离线演示。Phonon 31m 约 65MB 且 Apache 2.0 开源,在德语西班牙语 intelligibility 排名第一,CPU 流式延迟领先。这是 Phonon 首个开源发布,两周下载超 200,000 次。
文章详细列出 Phonon 在 Hugging Face Open TTS Leaderboard 的多语种 intelligibility 排名与 CPU 流式延迟优势,便于评估小体积语音模型端侧落地可行性。
两周前,我们发布了 Phonon,一个可在您自己的设备上运行的小型文本转语音模型。它无需服务器,也无需网络,您输入的内容将保留在您手中。
我们很高兴看到目前的反响。以下是发布背后的故事:我们为何构建 Phonon,它能做什么,随附的演示,以及它在 Hugging Face 开放 TTS 排行榜上的表现。
为什么语音应该驻留在您的设备上
大多数语音 AI 都运行在云端:每一句话都要往返服务器一次。Phonon 则运行在您自己的设备上。您的文本保留在本地,语音功能无需网络即可工作。我们还开放了权重。Phonon 31m 采用 Apache 2.0 许可,您可以免费使用,甚至用于商业产品。其他模型采用 CC BY-NC 许可,因此可免费用于非商业项目。如果您使用这些模型构建商业产品,定价基于您的用户数量,而非生成的语音量。
让高质量的语音在小型设备上运行一直很难。您可以让模型变小,但听起来效果不佳;或者让它听起来很好,但无法适配。我们解决了这两个问题。
我们在四月发布了 Phonon,随后花了六个月时间与合作伙伴和早期用户一起完善它。他们的反馈帮助我们塑造了此次发布。模型变得更小,我们增加了更多语言支持,并通过语音克隆和语音设计支持自定义语音。
Phonon 基于 Pocket TTS 系列,因此使用流匹配(flow matching)来生成音频,这与其它 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 开放 TTS 排行榜上的表现
开放 TTS 排行榜 是 Hugging Face 的一个非常新的项目,我们非常喜欢它。随着 Hugging Face Hub 上拥有超过 9,000 个 TTS 模型,该排行榜为开发者提供了一个集中比较开放模型并并排试听它们的地方。在 23 种语言中,模型根据可懂度(输出的词错误率)、速度(逆实时因子和首个音频时间)以及自然度(英语使用 UTMOS,韩语使用 KOMOS)进行评估。固定音色和声音克隆均会进行评估,后者还包含额外的说话人相似度指标。排行榜还有一个“聆听”标签页,您可以方便地自行比较 TTS 输出,并为您最喜欢的投票。
在可懂度方面,Phonon 在德语和西班牙语中排名第一,并在我们评估的每种语言中都位居前三,与体积最多为其 100 倍的模型并列。
速度是 Phonon 真正大放异彩的地方,因为该模型在CPU 流式基准测试的首个音频时间上位居榜首。
推理
我们专门为 Phonon 构建了一个新的推理框架 ptts。ptts 的目标是在各种设备上获得最佳性能,因此支持超过 10 种后端:CPU(Intel、Arm、WebAssembly)、GPU(CUDA、Vulkan、Metal、WebGPU)和 NPU(Apple Core ML、Snapdragon®)。
Phonon 还从 v5.21 版本起在 🤗 Transformers 中可用,作为其参考 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
