0.1B 的語音模型憑什麼用四核 CPU 就能即時開口?拆開 MOSS-TTS-Nano 的兩層設計
先別管它能拿來做什麼。先看一件事:當你打一句「歡迎使用語音合成系統」給它,按下 enter 到聽見聲音之間,這台筆電的 CPU 到底做了哪些動作?
這個問題比「它有什麼功能」有用得多。因為 MOSS-TTS-Nano 最反常的地方,不在功能表上——Bark、XTTS、ChatTTS 那些大模型能做的它大多也能做。它反常的地方在於:別人要插一張 GPU 才跑得動的事,它一台四核心筆電、不開顯卡就能即時做完。0.1B 參數,復旦 NLP 實驗室和 MOSI.AI 一起開源出來的。
要看懂這件事不是魔法,得把那條從文字到聲波的路徑攤開來走一遍。
第一個直覺陷阱:聲音不是「一長串數字」
很多人對 TTS 的第一印象是:模型吐出一條 48kHz 的波形,意思是每秒鐘要生成四萬八千個取樣點。那如果模型得一個點一個點地生,0.1B 的小腦袋怎麼可能跟得上即時?
關鍵就卡在這裡:模型根本不是在生波形。
打個比方。你要傳一張照片給朋友,不會把每一個像素的 RGB 值一個一個唸給他聽——你會先壓成一張 JPEG,他那端再解開。聲音也一樣。MOSS-TTS-Nano 把整條 pipeline 拆成兩塊,第一塊就是專門幹「壓縮與還原」這件事的元件:Audio Tokenizer,大約 20M 參數。
它做的事,是把 48kHz 的連續聲波,壓成一條 12.5Hz 的 token 流。注意這兩個數字的落差——原本每秒四萬八千個取樣點,壓完之後每秒只剩 12.5 個 token。你可以把它想成「音訊版的 BPE」:文字的 tokenizer 把一長串字元切成有限的詞片,這個則把連續的聲波切成離散的聲音碼。中間用的是 RVQ(殘差向量量化)16 層 codebook,能在 0.125kbps 到 2kbps 之間調位元率。
壓縮比一拉開,後面那塊負責「生成」的模型,工作量就完全不一樣了。它不用面對每秒四萬八千個點,只要面對每秒十幾個 token。這是整件事能在 CPU 上跑的第一個支點。
第二塊:一個只生成「聲音碼」的小型 GPT
第二塊元件是一個約 100M 參數、基於 GPT-2 架構的小型 LLM。它做的事,跟 ChatGPT 寫文章在數學上是同一回事——自回歸,一個一個往下吐 token,每吐一個就回頭看前面所有的,再決定下一個。差別只在於:ChatGPT 吐的是文字 token,它吐的是上面那條 12.5Hz 的聲音 token。
這裡有個容易忽略的設計:它內部是雙層 Transformer。Global Transformer 管「這句話整體要怎麼唸、語意是什麼」,Local Transformer 專門收尾,處理音訊解碼的局部細節。把「理解全局」和「處理局部」拆成兩個專責的部分,而不是塞給同一個大網路硬學——這正是能把總參數壓到 0.1B 還不崩的原因。每一層只做它最該做的事。
所以整條路徑串起來其實很乾淨:文字進來,先正規化、tokenize;丟給小 LLM 自回歸生出一串聲音 token;再交給 Audio Tokenizer 解碼,還原成 48kHz 立體聲波形。三步,總共 0.1B 參數,CPU 從頭跑到尾。
到這裡你會發現,所謂「能在 CPU 上即時」根本不是把大模型硬塞進小機器,而是一開始就沒打算讓任何一個元件變大。它是設計出來的小,不是壓出來的小。
為什麼這個拆法值得記住
把昂貴的工作換個表示法、讓後面的模型在低維度上幹活——這個套路遠遠不只用在語音上。
影像生成的 latent diffusion 是同一招:不在像素空間裡跑擴散,先用 VAE 把圖壓進 latent space,在那個小空間裡生成完再解碼回來,運算量直接砍掉一個量級。長文本檢索把段落壓成向量也是同個邏輯。共通的心法就一句:先找一個夠好的壓縮表示,讓主模型在那個空間裡工作,最後再還原。 哪裡的運算貴、又有結構可以壓,這招就用得上。
MOSS-TTS-Nano 只是把這個老道理用在一個夠極端的場景——極端到結果是「不用 GPU」這種你以為一定要有的前提,突然就不成立了。
它確實有代價,講清楚才公平
小是有後果的。社群實測下來,中文跟英文品質最好,日文「幾乎不可用」,匈牙利文、希臘文也不穩。它沒有語速控制、沒有情感控制,也不支援句內語言切換(這個要旗艦的 8B 版才有)。換句話說,它把參數預算幾乎全押在「把一句話用一種語言、一種平穩語氣唸清楚」這件核心事情上,其餘的功能就先不要了——這跟它整個設計哲學是一致的:能砍的都砍掉,只留必要的。
安裝上也有個現實的坑:WeTextProcessing 和 pynini 在非 Conda 環境很容易裝爆,官方直接建議用 Conda 裝 pynini,這點 GitHub Issue 裡反覆有人踩。還有 transformers 版本被鎖死在 4.57.1,裝錯版本生出來的聲音會「像在唱歌而不是說話」——這種 bug 第一次遇到大概會以為自己參數設錯了。
真要動手,最快是 ONNX 版:比 PyTorch 版快約兩倍,MacBook Air M4 單核就能流暢推理,團隊甚至做了一個瀏覽器擴充套件 MOSS-TTS-Nano-Reader,讓整個推理在瀏覽器本地跑完,後端服務都不用架。對隱私敏感的場景——醫療、金融那種語音內容不能出裝置的——這個性質比品質頂不頂更重要。
帶走一個問題,不是帶走一個工具
下次再看到「某模型參數量只有別人的十分之一卻能做到 X」這種標題,先別急著驚嘆,問一個問題就好:它把哪一段昂貴的運算,換成了在更便宜的表示空間裡做?
MOSS-TTS-Nano 的答案是把波形換成 12.5Hz 的聲音 token。你手上正在用的那些工具,多半也藏著一個類似的答案——找出來,你對它能跑多快、會在哪裡出包,心裡就有底了。
想自己試的話,python infer.py 傳一段參考音訊加一句文字,一行就出聲,跑一次比讀十篇介紹都快。
來源:MOSS-TTS-Nano GitHub、Audio Tokenizer 論文、TTS Technical Report。License:Apache 2.0。










