台灣華語語音合成與聲音克隆
BlueMagpie-TTS
藍鵲
為台灣華語打造的開源語音模型 —— 打字念出來,也能用你的聲音念
開源社群OpenFormosa
聲學基礎VoxCPM(開源)
授權Apache-2.0
https://bluemagpie.intemotech.com
這是什麼
一台會「講台灣華語」的機器
- 打字進去 → 它念出來
- 錄一段你的聲音 → 它用你的聲音念別的話
- 也能選內建的聲音來念
- 專攻台灣腔,還能中英混講(一句話裡中夾英)
一句話
就像一個很會模仿的播音員:你給它字,它念給你聽;你給它一段聲音,它就學起來。
出處 · 開源
站在開源社群的基礎上
OpenFormosa 做 BlueMagpie 的社群
- 台灣的開源 AI 社群,專注台灣在地語言
- 開發並開源釋出 BlueMagpie-TTS
openformosa.com
VoxCPM 沿用的聲學基礎
- 由國際開源社群 OpenBMB 釋出的開源語音模型
- BlueMagpie 沿用它成熟的聲學生成棧,自己換上 Barbet
github.com/OpenBMB/VoxCPM · Apache-2.0
OpenBMB:以 MiniCPM/CPM 系列大模型聞名的開源社群;OpenFormosa 站在這些開源成果上,把力氣專注在「台灣華語」上 —— 不重造輪子。
整體架構
前端負責「對外」,GPU 主機負責「運算」
瀏覽器(使用者)
↓
前端 Portal Web
展示介面麥克風錄音
播放 · 歷史即時 GPUAPI 入口
↓ 私有內網(不對公網)
GPU 主機 GB10 推論
BlueMagpie 模型
Barbet(想)
擴散(發聲)
語者編碼
本場焦點,就是右下角那塊:BlueMagpie 模型本身。
認識模型 · BlueMagpie 的組成
拆開 BlueMagpie:跟人講話一樣,分兩步
BlueMagpie = 換上新「腦袋」Barbet + 沿用成熟的「嘴」VoxCPM 聲學棧
🧠
① 先「想」
看懂字,規劃語氣、節奏、重音
= Barbet 換上新的 ✦
→🔌 橋接模組
🗣️
② 再「發聲」
把想好的變成真正的聲音
= 擴散聲學棧(VoxCPM) 直接沿用 ❄
→
為什麼要這樣拆?
把「說什麼」和「怎麼發聲」分開 → 換腦袋不用重學發聲,省力、又不會破壞原本的音質。中間用一個橋接模組把兩邊接起來。
和一般 TTS 有什麼不一樣
它的「不一樣」,在這幾個地方
| 多數中文 TTS | BlueMagpie |
| 腔調 | 偏中國普通話腔 | 台灣腔,還能中英混講 |
| 怎麼做 | 多為端到端、整包從零訓練 | 模組化「換腦袋」:沿用開源發聲、只換語言模型 |
| 語言模型 | 多為純 Transformer | Mamba2 + Attention 混合,省力又準 |
| 來源 | 多為封閉、通用市場 | 台灣開源社群,站在開源 VoxCPM 上 |
重點不是「誰比較強」,而是 BlueMagpie 側重台灣在地需求(台灣腔、中英夾雜),並用開源、不重造輪子的方式把它組起來。
聲音克隆 · 最重要的觀念
不是「重新學習」,是「給一張提示」
模型的大腦一個字都沒改。
你的錄音被壓成一串數字,當成提示遞給早就訓練好的模型,它一次就照著念。
所以它很快
- 不用訓練,幾秒就完成
- 換一個人 = 換一張提示,模型不用重學
對比另一種做法
- 有些克隆要拿幾十分鐘錄音去「重新訓練」
- 那種慢很多;我們這種是當場、零樣本
其實是:conditioning(條件化)+ zero-shot(零樣本);一次 forward pass(推論),不更新模型參數。
聲音克隆 · 完整流程
從你的聲音,到一張「聲音指紋」
「聲紋辨識器」ECAPA-TDNN(本來用來認人,借來抽指紋);指紋=L2 正規化的 192 維向量(centroid=平均質心)。模型訓練時就學會「看著指紋控制音色」,所以沒聽過的人也能克隆(零樣本)。
聲音克隆 · 怎麼做更像
兩種克隆方式 —— 我們改用最像的「語音接續」
| 模式 | 用什麼當條件 | 相似度 |
語者向量 speaker_centroid(原本) | 只用 192 維向量(ECAPA 聲紋) | 較不像 · 只抓「大概的音色」 |
語音接續 prompt_wav + prompt_text(現在採用) | 參考音 + 逐字稿做「語音接續」 | 最像(典型零樣本克隆) |
原本只送一個 192 維數字進去、細節幾乎都壓掉 —— 難怪不夠像;現在改用「語音接續」(參考音+你念的腳本逐字稿),相似度明顯提升。
聲音克隆 · 語音接續是什麼
像「接話」:用你的聲音,接著講下去
不是「用一串數字描述你的聲音」,
而是給模型一段你講話的錄音 + 那段話的逐字稿,叫它用同一個聲音「接著講」你要的新句子。
🪪 語者向量
給一張「證件照」——把聲音壓成 192 個數字,只剩大概輪廓。加大維度也沒用:快照放大,還是快照。
🎬 語音接續
給一段「本人說話的影片」讓它照著接——音色、語調、節奏都看得到。
概念是脈絡內學習(in-context learning),跟大型語言模型「接龍」同理。192 維由 ECAPA-TDNN 固定,加大要重訓、且報酬遞減——真正變像靠的是換方法(語音接續),不是加數字。關鍵:逐字稿要對得上 → demo 請照腳本念。
聲音克隆 · 改善計劃
怎麼讓它更像
① 換成 prompt_wav「語音接續」 · 最大改善
- 錄音當
prompt_wav、朗讀腳本當 prompt_text 一起送
- portal 早就有朗讀腳本 → 正好知道逐字稿!這正是 in-context 克隆需要的
- 退路:沒逐字稿就退回
語者向量(reference 模式此版不穩定)
② 錄到「乾淨、真實」的聲音
- 瀏覽器預設開回音消除/降噪/自動增益,會改變音色 → 全部關掉
- 錄久一點、念完整段腳本、環境安靜
①+② 是根因、且我們完全可控,預期會明顯變像。再上去就是模型天花板(零樣本、非 production),要靠針對特定人微調或模型更新。
程式怎麼用
載入 → 合成 → 克隆,三段就好
# 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(無分類器引導強度)。
老實說
它還不會什麼
目前限制
- 只會台灣華語(國語),不會台語
- 英文縮寫可能念錯(例如 "LLM")
- 不是 production 等級(官方定位為展示/研究)
- 錄音越乾淨,克隆越像
Demo 時間 · 動手玩玩看
來實際聽聽看
- ① 文字合成:點一句長範例 →
「感謝大家今天撥空參加這場說明會…」
- ② 內建語者:選 hung_yi_lee,按「試聽語者」 →
「各位好,這是內建語者的聲音示範。」
- ③ 克隆我的聲音:勾同意、照腳本錄約 10 秒 →
「嗨,這是用我的聲音克隆出來的,像不像?」
小提醒
- 風格強度先用預設(一般 2.0/克隆 2.8)
- 長句更能聽出停頓與語氣
- 合成時看上面 GPU 使用率衝高
- 錄音安靜、久一點會更像
https://bluemagpie.intemotech.com · 歡迎現場操作 · Q & A
BlueMagpie-TTS(藍鵲)· 白話版
1 / 14