深入瞭解 Phonon TTS:推出高質素裝置端語音生成,基準測試表現領先
A Closer Look at Phonon TTS. Launching High-Quality On-Device Speech That Tops the Benchmarks.
Phonon TTS 推出兩款可在裝置上離線運行的文字轉語音模型,合計支援五種語言。兩款模型約為 65 MB 和 75 MB;Phonon 31m 採 Apache 2.0,Phonon 40m 涵蓋五種語言並採非商業授權。
文章同時交代 Phonon 的離線運行方式、授權與多語言支援,並對照 Open TTS Leaderboard 的可理解度及速度表現,呈現小型語音模型的部署特點。
兩星期前,我們開放了 Phonon,這是一款可在你自己的裝置上運行的小型文字轉語音模型。它不需要伺服器或網絡連線,而你輸入的內容會留在自己的裝置上。
到目前為止,我們對大家的反應非常滿意。以下是 Phonon 推出的故事:我們為甚麼開發 Phonon、它能做甚麼、隨產品推出的示範,以及它在 Hugging Face 的 Open TTS Leaderboard 上的表現。
為甚麼語音應該留在你的裝置上
大部分語音 AI 都在雲端運行:每句説話都要往返伺服器。Phonon 則在你自己的裝置上運行。你的文字會留在裝置上,語音功能不連接網絡也能運作。我們亦已開放模型權重。Phonon 31m 採用 Apache 2.0 授權,因此可以免費使用,包括用於商業產品。其他模型則採用 CC BY-NC 授權,可免費用於非商業項目。如果你想用它們開發商業產品,收費會按用戶數量計算,而非按生成的語音數量計算。
一直以來,要在小型裝置上運行優質語音都很困難。你可以縮小模型,但語音效果就不理想;也可以讓語音效果出色,但模型就無法放進裝置。我們同時解決了這兩個問題。
我們在 4 月公佈 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 上,它會計算你的訓練次數,並鼓勵你繼續。一個名為 Lamp、由 Autonomous 製作的機械人戴上分院帽,並以角色口吻説話。在瀏覽器中,離線恐龍跑酷遊戲變成了由 Rex 主持的電台節目。示範還包括一款在玩家自己的裝置上生成語音的科幻遊戲,以及逐頁朗讀普魯斯特作品。
Hugging Face 團隊建立了 Transformers 整合,讓開發者從第一天起就能在 Transformers 中使用 Phonon。
開發者也開始以 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)。固定聲線和聲音複製均會接受評估,後者另設説話者相似度指標。排行榜亦設有「聆聽」分頁,方便你自行比較 TTS 輸出,並為最喜歡的模型投票。
在可理解度方面,Phonon 在德語和西班牙語中排名第一,在我們評估的每種語言中均名列前三,與規模大最多 100 倍的模型並列。
速度是 Phonon 真正突出的地方:在首個音訊輸出時間方面,這些模型在CPU 串流基準測試中名列前茅。
推理
我們專為 Phonon 建立了全新的推理框架 ptts。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 整合至你自己的技術堆疊,還是研究模型本身。
Phonon 屬於 Pocket TTS 系列,因此我們先將 Pocket TTS 加入 Transformers。Phonon 則在此基礎上成為模組化模型:只需約200 行描述兩者的差異。
Phonon 以自回歸方式生成音訊潛在表示:每個步驟都會輸出一個潛在表示,並將其回饋作為下一步的輸入,而訓練損失則根據這些表示計算。潛在表示是模型的輸入、輸出和目標,正如文字 token 對語言模型的作用一樣,因此將音訊映射至潛在表示的編解碼器扮演 tokenizer 的角色。Transformers 以此形式隨附它:作為音訊 tokenizer,由處理器與文字 tokenizer 一同管理:
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 不會直接使用其音訊 tokenizer 編碼音訊;該 tokenizer 隨附時只有解碼器,而聲音則是預先計算好的: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
