跳到正文
Hugging Face Blog·· 1 天前精選AI 評分65

深入瞭解 Phonon TTS:推出高質素裝置端語音生成,基準測試表現領先

A Closer Look at Phonon TTS. Launching High-Quality On-Device Speech That Tops the Benchmarks.

AI 導讀

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 串流基準測試中名列前茅。

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。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