台灣華語語音合成與聲音克隆

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 推論
API 服務
排隊 · 限流 · 檢查
BlueMagpie 模型
Barbet(想) 擴散(發聲) 語者編碼
本場焦點,就是右下角那塊:BlueMagpie 模型本身
認識模型 · BlueMagpie 的組成

拆開 BlueMagpie:跟人講話一樣,分兩步

BlueMagpie = 換上新「腦袋」Barbet  沿用成熟的「嘴」VoxCPM 聲學棧

🧠
① 先「想」
看懂字,規劃語氣、節奏、重音
= Barbet 換上新的 ✦
🔌 橋接模組
🗣️
② 再「發聲」
把想好的變成真正的聲音
= 擴散聲學棧(VoxCPM) 直接沿用 ❄
🔊
聲音
48 kHz 波形

為什麼要這樣拆?

把「說什麼」和「怎麼發聲」分開 → 換腦袋不用重學發聲,省力、又不會破壞原本的音質。中間用一個橋接模組把兩邊接起來。

和一般 TTS 有什麼不一樣

它的「不一樣」,在這幾個地方

多數中文 TTSBlueMagpie
腔調偏中國普通話腔台灣腔,還能中英混講
怎麼做多為端到端、整包從零訓練模組化「換腦袋」:沿用開源發聲、只換語言模型
語言模型多為純 TransformerMamba2 + Attention 混合,省力又準
來源多為封閉、通用市場台灣開源社群,站在開源 VoxCPM 上
重點不是「誰比較強」,而是 BlueMagpie 側重台灣在地需求(台灣腔、中英夾雜),並用開源、不重造輪子的方式把它組起來。
聲音克隆 · 最重要的觀念

不是「重新學習」,是「給一張提示」

模型的大腦一個字都沒改
你的錄音被壓成一串數字,當成提示遞給早就訓練好的模型,它一次就照著念。

所以它很快

  • 不用訓練,幾秒就完成
  • 換一個人 = 換一張提示,模型不用重學

對比另一種做法

  • 有些克隆要拿幾十分鐘錄音去「重新訓練」
  • 那種慢很多;我們這種是當場、零樣本
其實是:conditioning(條件化)+ zero-shot(零樣本);一次 forward pass(推論),不更新模型參數。
聲音克隆 · 完整流程

從你的聲音,到一張「聲音指紋」

🎙️ 你的聲音
16 kHz
聲紋辨識器ECAPA-TDNN
每 6 秒切一段
每段 → 192 個數字
平均 → 你的指紋
指紋不同 → 模型就知道要模仿誰
別人
「聲紋辨識器」ECAPA-TDNN(本來用來認人,借來抽指紋);指紋=L2 正規化的 192 維向量(centroid=平均質心)。模型訓練時就學會「看著指紋控制音色」,所以沒聽過的人也能克隆(零樣本)。
聲音克隆 · 怎麼做更像

兩種克隆方式 —— 我們改用最像的「語音接續」

模式用什麼當條件相似度
語者向量
speaker_centroid(原本)
只用 192 維向量(ECAPA 聲紋)較不像 · 只抓「大概的音色」
語音接續
prompt_wav + prompt_text(現在採用)
參考音 + 逐字稿做「語音接續」最像(典型零樣本克隆)
原本只送一個 192 維數字進去、細節幾乎都壓掉 —— 難怪不夠像;現在改用「語音接續」(參考音+你念的腳本逐字稿),相似度明顯提升。
聲音克隆 · 語音接續是什麼

像「接話」:用你的聲音,接著講下去

不是「用一串數字描述你的聲音」,
而是給模型一段你講話的錄音 + 那段話的逐字稿,叫它用同一個聲音「接著講」你要的新句子。

🎙️ 你的錄音
+ 逐字稿(朗讀腳本)
模型把它當「前文」
acoustic prompt
🔊 用同嗓音念「新文字」

🪪 語者向量

給一張「證件照」——把聲音壓成 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
← → 或空白鍵翻頁 · F 全螢幕 · 點左右兩側切換