台灣華語語音合成與聲音克隆
BlueMagpie-TTS
藍鵲
用最白話的方式,講這個模型怎麼運作、怎麼訓練
https://bluemagpie.intemotech.com
這是什麼
一台會「講台灣華語」的機器
- 打字進去 → 它念出來
- 錄一段你的聲音 → 它用你的聲音念別的話
- 也能選內建的聲音來念
- 專攻台灣腔,還能中英混講(一句話裡中夾英)
一句話
就像一個很會模仿的播音員:你給它字,它念給你聽;你給它一段聲音,它就學起來。
整體架構
前端負責「對外」,GPU 主機負責「運算」
瀏覽器(使用者)
↓
前端 Portal Web
展示介面麥克風錄音
播放 · 歷史即時 GPUAPI 入口
↓ 私有內網(不對公網)
GPU 主機 GB10 推論
BlueMagpie 模型
Barbet(想)
擴散(發聲)
語者編碼
本場焦點,就是右下角那塊:BlueMagpie 模型本身。
模型在做什麼
跟人講話一樣,分兩步
我們做的事:換掉「想」的那顆腦袋,沿用一套很會「發聲」的嘴巴。
其實是:① Barbet 文字語意語言模型(TSLM) ② 沿用 VoxCPM 的聲學生成棧,中間用橋接模組對接
①「想」的那顆腦袋
記性好、又讀得快的腦袋
- 它的工作:看字,規劃語氣、節奏、重音
- 一種讀法:從頭順順讀過去 → 很省力、很快
- 另一種:回頭看前面的重點 → 比較準
- 這顆腦袋兩種都用 → 又快又準
打個比方
像一個邊讀邊抓重點的人:一路讀下去不費力,遇到關鍵還會回頭確認。
其實是:Barbet = Mamba2(順順讀、線性時間)+ Attention(回看重點)的混合架構。
②「發聲」的那張嘴
把「沙沙的雜訊」慢慢擦成人聲
像擦一面起霧的鏡子:擦一次有點清楚,多擦幾次就完全清晰。
其實是:擴散 / Flow-matching(LocDiT);取樣約 10 步(inference_timesteps 預設 10/建議 9),加上 CFG 有/無條件兩條,網路實際跑近 20 次 → 這步最花時間、最吃 GPU。
聲音克隆
幫你的聲音「拍一張身分證」
這串數字就是你的「聲音指紋」。模型看著指紋,就能用你的聲音念任何字。
其實是:ECAPA-TDNN 語者編碼 → 192 維向量;沒聽過的人也行(零樣本)。內建語者=事先存好的指紋。
聲音克隆 · 最重要的觀念
不是「重新學習」,是「給一張提示」
模型的大腦一個字都沒改。
你的錄音被壓成一串數字,當成提示遞給早就訓練好的模型,它一次就照著念。
所以它很快
- 不用訓練,幾秒就完成
- 換一個人 = 換一張提示,模型不用重學
對比另一種做法
- 有些克隆要拿幾十分鐘錄音去「重新訓練」
- 那種慢很多;我們這種是當場、零樣本
其實是:conditioning(條件化)+ zero-shot(零樣本);一次 forward pass(推論),不更新模型參數。
聲音克隆 · 完整流程
從你的聲音,到一張「聲音指紋」
「聲紋辨識器」ECAPA-TDNN(本來用來認人,借來抽指紋);指紋=L2 正規化的 192 維向量(centroid=平均質心)。模型訓練時就學會「看著指紋控制音色」,所以沒聽過的人也能克隆(零樣本)。
程式怎麼用
載入 → 合成 → 克隆,三段就好
# 1) 載入模型(權重 + tokenizer)
model = BlueMagpieModel.from_local(model_dir, tokenizer=tok, device="cuda")
# 2) 一般合成:文字 → 語音
audio = model.generate(target_text="今天天氣真好。", cfg_value=2.0)
# 3) 克隆:先從「語音檔」抽出指紋,再帶進去合成
from bluemagpie import extract_speaker_centroid
centroid = extract_speaker_centroid("reference.wav") # → 192 維
audio = model.generate(target_text="…", speaker_centroid=centroid, cfg_value=2.8)
匯入語音檔的關鍵就一行:extract_speaker_centroid("檔案.wav") → 得到 192 維「指紋」;合成時用 speaker_centroid= 帶進去就會模仿。
語者向量怎麼產生 · 跟權重的差別
把一個人的聲音,存成一個小檔
# 1) 從參考音「產生」語者向量檔(CLI)
python scripts/extract_speaker_centroid.py \
--audio reference.wav --out my_voice.pt
# 同一人多段更穩: --audio a.wav b.wav c.wav
# 2) 之後直接載入這個 .pt 來用
c = torch.load("my_voice.pt") # [192]
audio = model.generate(target_text="…", speaker_centroid=c)
# 3) 內建語者:打包好的多條向量
d = torch.load("speaker_centroids.pt")
# {speaker_ids:[…], centroids:[N,192]}
語者向量 ≠ 模型權重
- 語者向量
.pt:192 數字、幾 KB,一人一條
- 模型權重
pytorch_model.bin:約 7.7 GB
- 換人只換
.pt;權重不變、所有聲音共用
你自己抽的 my_voice.pt 和內建的 speaker_centroids.pt 是同一種東西,只是後者多打包了幾個人;產生方式都是上面那支 extract_speaker_centroid。
一個重要旋鈕
「要多用力模仿」的旋鈕
- 轉小 → 比較自然、但比較不像
- 轉大 → 比較像、但太大會變僵硬、走音
- 建議停在中間(2.0–2.8)
打個比方
像化妝:淡妝自然好看,妝太濃反而變一個怪人。
其實是:cfg_value(無分類器引導強度)。
怎麼訓練 ①
站在巨人的肩膀上,不從零開始
已經有一位很會發音的老師。我們不重教發音,
只換上一個新學生來「看字、想怎麼念」,
再讓學生一直模仿老師,把這段學起來。
其實是:以 VoxCPM 當蒸餾老師;換上 Barbet;AudioVAE(嘴巴)全程不動,省力又穩。
怎麼訓練 ②
像學騎腳踏車:先扶著,再放手
一次只放開一點點,穩、不會跌倒、學得快。
其實是三階段:bridge(只訓練橋接)→ tslm(學語者條件)→ full(整體微調,只有 AudioVAE 凍結)。
合成流程
從文字到聲音,一條龍
- 一般:用預設聲音念
- 內建語者:用事先存好的「聲音指紋」
- 克隆:用你現場錄音抓出的「聲音指紋」
跑在哪裡
放在一台 GPU 主機上
- 模型住在 GPU 裡,隨時待命
- 合成時,前端能即時看到 GPU 忙起來(0% → 約 86%)
- 對外只開展示頁,模型本體不直接對公網
背後還有
排隊、限流、輸入檢查、克隆要勾同意 —— 確保穩定又不被濫用。
成效與速度
念得準,也念得快
BlueMagpie
對照模型
數字=錯誤率 %
越低越好 ↓
速度與特色
- 約即時的 4.7 倍速(產 1 秒語音約 0.2 秒)
- 專攻台灣腔+中英混講
- 含李宏毅教授的內建語者(已授權)
評測:closed-loop TTS→ASR→比對(CER=字錯誤率、WER=詞錯誤率,越低越好);速度以 RTF(real-time factor)衡量。
老實說
它還不會什麼
目前限制
- 只會台灣華語(國語),不會台語
- 英文縮寫可能念錯(例如 "LLM")
- 不是 production 等級(官方定位為展示/研究)
- 錄音越乾淨,克隆越像
Demo 時間 · 動手玩玩看
來實際聽聽看
- ① 文字合成:點一句長範例 →
「感謝大家今天撥空參加這場說明會…」
- ② 內建語者:選 hung_yi_lee,按「試聽語者」 →
「各位好,這是內建語者的聲音示範。」
- ③ 克隆我的聲音:勾同意、照腳本錄約 10 秒 →
「嗨,這是用我的聲音克隆出來的,像不像?」
小提醒
- 風格強度先用預設(一般 2.0/克隆 2.8)
- 長句更能聽出停頓與語氣
- 合成時看上面 GPU 使用率衝高
- 錄音安靜、久一點會更像
https://bluemagpie.intemotech.com · 歡迎現場操作 · Q & A
BlueMagpie-TTS(藍鵲)· 白話版
1 / 14