--- title: BlueMagpie-TTS Demo emoji: 🐦‍⬛ colorFrom: blue colorTo: indigo sdk: gradio sdk_version: 5.49.1 app_file: app.py pinned: false license: apache-2.0 short_description: 台灣華語與中英混合文字轉語音 models: - OpenFormosa/BlueMagpie-TTS --- # BlueMagpie-TTS Demo [OpenFormosa/BlueMagpie-TTS](https://huggingface.co/OpenFormosa/BlueMagpie-TTS) 的線上展示,輸出 48 kHz 單聲道語音,支援台灣華語與中英混合文字。 ## 模式 - **內建語者**:使用模型發佈內附的 speaker centroid;預設為已重新稽核的 `female_voice`(介面中的內建語者 B)。 - **參考音色**:從至少 3 秒的授權參考音檔抽取 ECAPA speaker embedding;參考內容不需要逐字稿。 - **穩定長文**:使用和短句相同的 speaker embedding,切段後輸出一個完整音檔。 參考音色模式只把參考音檔轉成固定長度 speaker embedding,不把 raw reference-audio tokens 送入 TTS。Embedding 會在每個請求開始時抽取一次,並由該請求的所有文字切段共用。 ## Production Profile Demo 預設採用目前通過長文穩定性評估的推論設定: 模型 snapshot 固定在 `aaf1a0878e37875382bb0e5c8a3a2ba43be67297`; speaker-reference 模式使用的 ECAPA encoder 固定在 `0f99f2d0ebe89ac095bcc5903c4dd8f72b367286`;TTS runtime 以 `ce384c8cc54efea1aaba7b9f1d7ded6c1c99aa9a` 的已驗證原始碼隨 Space 保存, Barbet 另固定在 `6fcd7ce4aa37f2250a3242995bef0fbc3b026ba8`, 避免 Space 重啟後在沒有程式版本變更的情況下改變模型或 speaker embedding 空間。 候選語意驗證固定使用 Whisper large-v3-turbo revision `41f01f3fe87f28c78e2fbf8b568835947dd65ed9`;exact-assembled whole-output 語意驗證另固定使用 Whisper large-v3 revision `06f233fe06e710322aca913c1bc4249a0d71fce1`,兩者必須同時通過。 | 設定 | 值 | |---|---:| | CFG | 2.0 | | NFE steps | fixed at the validated value 10 | | Target pace | 4.0 speech units/sec | | Candidate 0 generation policy | base: 5.2 CJK / 4.6 ASCII-mixed units/sec + 1 latent step | | Candidate 1–19 generation policy | safe duration: 4.6 CJK / 4.0 ASCII-mixed units/sec + 1 latent step | | Short-text guidance | minimum CFG 3.0 below 6 speech units | | Stop policy | 0.50 → 0.05 from 75% to 95% predicted progress, 1 hit | | Endpoint cue | append terminal punctuation for model input when missing, except very short text | | Hard stop | native-pace target steps, independent of playback pace | | Pace correction | whole completed chunk, pitch-preserving; active-region stretcher disabled | | Pace / speaker eligibility duration | union of active 25 ms RMS frames at 10 ms hop; internal pauses excluded | | Semantic verification | turbo local screen + turbo/full-large-v3 hard intersection on exact whole output; first/last 6 exact, no lexical tail; fail closed | | Local speaker verification | frozen request centroid + bounded window begin/end directional drift | | Early accept speaker preference | similarity ≥ 0.25 and directional drop ≤ 0.05 for gated chunks | | Local hard speaker gate | similarity ≥ 0.10 and directional drop ≤ 0.10 | | Joined/final release-parity speaker guard | full-audio similarity ≥ 0.105; disjoint first/last-third drop ≤ 0.095 | | Local long speaker evidence | one ECAPA batch over up to four 3-second windows + begin/end | | Candidate cascade | same-seed whole trajectory first; then 1→5→10→15→20 only while both chunk and text-work budgets allow | | Whole-trajectory qualification | assemble with production RMS/fade/pause/crossfade/speed, then whole-output gate | | Sequence fallback | up to 3 distinct k-best paths; boundary-only local rejects may enter DP through a frozen 0.15 cap, then each exact-assembled path must pass the stricter 0.105/0.095 whole gate | | Final output gate | re-verify joined/faded/RMS-matched/speed-adjusted whole waveform; fail closed | | Runtime budget | at most 20 generated TTS chunks and 800 generated speech units per request; NFE fixed at 10 | | Maximum chunk | 80 chars | | Minimum chunk | 12 chars | | Crossfade / internal edge fade | 80 ms / 80 ms | | Chunk RMS adjustment | at most 4 dB | | Generated continuation context | 0 sec | | Generated-audio retry | disabled | | Quality selection | enabled; no unverified fallback | 每個請求會取得新的隨機 root seed;每個候選 trajectory 的所有長文切段會重用同一 seed。 `candidate 0` 使用 base policy(5.2 CJK / 4.6 ASCII),`candidate 1–19` 使用實證回收用的 safe-duration policy(4.6 CJK / 4.0 ASCII);兩者都只改 native-duration endpoint estimate, margin 固定 +1 latent step、`min_len` 固定為 2,不會為了播放目標語速硬撐 generation loop。 選中完整 trajectory 或 sequence-DP 混合路徑後,log 會記錄每個 chunk 的 candidate、seed 與 policy。 內部 hosted evaluator 可注入 `[0, 2^31)` 的固定 root seed 以重現結果;UI 不暴露這個參數, 一般請求仍只在未注入 seed 時使用系統亂數。 完整 same-seed trajectory 永遠優先;有 final-aware verifier 時會先耗盡整個 request budget, 仍沒有 joined-safe whole trajectory 才允許 sequence DP。DP 可混合已通過 hard gate 的 chunks, 以及下述唯一 boundary-only、drop 不超過 0.15 的 DP-only chunks。切段保留標點,並依逗號、分號或句末標點 插入不同長度的停頓。輸出最後會套用保守的 RMS floor 與 peak limit。 完成 RMS matching、edge fade、pause、crossfade 與使用者 speed 後,服務會再對最終整段 waveform 執行 normalized target 的 prefix/whole/suffix/tail、pace 與 speaker anchor/boundary gate,並要求 turbo 與 full large-v3 的語意 hard intersection;這個 post-join gate 失敗時不會回傳先前已通過的 chunk 音訊。Full large-v3 不驗 local chunk,只驗 production assembler 產生的 exact whole candidate 或 exact sequence path;其 rejection 會讓 cascade 繼續下一個 seed。 此外,same-seed trajectory 只有在每個 local chunk 都通過後,才會先用同一個 `_assemble_trajectory_audio` 組成實際播放版本並跑整段 semantic/pace/speaker gate;joined gate 失敗會取消該 whole trajectory 的資格,但保留已通過的 local evidence 供 sequence DP 使用。 這個額外 dual-ASR whole gate 只對 local turbo 全數通過的候選執行,DP 選定後仍會保留上述最終 post-join gate。每個 request 只在 waveform float32 bytes、sample rate、normalized target 與 pinned verifier profile 完全相同時重用 full large-v3 evidence;任何 sample 改變都會重新驗證。ASR loader 異常、OOM、空 transcript 或無效 evidence 都 fail closed,不會降級為 turbo-only。 若整個 candidate budget 都沒有 joined-safe whole trajectory,多 chunk request 才會進入 bounded k-best DP。已通過 local hard gate 的 chunk 可直接進入 DP;唯一 rejection reason 是 `boundary_speaker_drop`、且 drop 不超過 0.15 的 chunk 也可作為 DP-only 候選。這個局部容忍 不適用於 semantic、pace、speaker similarity、缺少 evidence、單 chunk 或 whole-trajectory accept,也不能在缺少整段 final verifier 時啟用。Local score 加上相鄰 ECAPA/RMS transition cost 會產生最多 3 條不同完整路徑,依 `(total cost, candidate-index path)` 穩定排序;每條都用同一個 production assembler 和整段 semantic/pace/speaker gate 驗證;整段仍必須通過 similarity 0.105 與 boundary drop 0.095, 第一條通過才回傳。三條都失敗、callback 異常或沒有完整 finite path 時一律 fail closed。這不增加 TTS generation 數量,也不套用於單 chunk request。 被拒的 joined/final log 只記 normalized CER、prefix/suffix CER、tail units 與 reasons,不記逐字 transcript。 候選排序與 DP 保留低成本的 windowed speaker evidence;joined candidate、k-best path 與 最終 waveform 會再跑一次與獨立發布評估定義相同的 ECAPA guard:原始 sample rate 上以 25/10 ms RMS 取 active 外緣,將整段與三個不重疊 thirds 分開 encode。這避免短音檔的 1.5 秒首尾視窗重疊而掩蓋句尾 speaker drift。 日期、24 小時制時間、百分比、常見單位與大寫 acronym/model code 會先轉成保守的 zh-TW spoken form,例如 `2026/07/16`、`15:30`、`12.5%` 與 `10 km`。ASR 會先統一 繁簡字形再評分,避免把正確的台灣華語輸出誤判為內容錯誤。 Whisper 常見的 `15点30分`/`15點30分` 會視為同一讀法;裸寫 `15點30` 只有在 target 明確含同一個完整鐘點讀法時才作 ASR-only canonicalization。比分、秒數、重量、裸 `15點`、 非法時間與真實漏字仍會被拒絕。超過 28 秒的 whole-output ASR 只在持續 低能量的標點 pause 切段,找不到 pause 才在 28 秒上限前使用最低能量 fallback。 ASR 評分另只將實證可互換的同音代詞 `她/它/牠/祂` 視為 `他`、`妳` 視為 `你`; 這項 canonicalization 不會修改送入模型的文字,也不包含 `的/地/得` 或 `在/再`。 自然 stop 在目前 checkpoint 上仍可能過快或錯過句尾。Demo 不再用播放目標語速決定生成長度; 模型使用原生語速的安全上限,完成後才做保音高語速校正。缺少句末標點時只在模型輸入補上句號, 少於 6 個 speech units 的短句會使用最低 CFG 3.0;stop threshold 只在預估進度 75% 後逐步降低,並於 95% 進度降至 0.05,以捕捉句末弱 stop 訊號而不影響前段內容。 首段不會在無標點處硬切。進階參數可供研究比較,但 release profile 是 CFG 2.0、NFE 10、後處理語速 1.0。 Online pace gate 與 1.5 秒 speaker eligibility 使用和獨立 hosted evaluator 相同的 active-frame interval union(25 ms frame、10 ms hop、peak -35 dB、absolute RMS floor 1e-4),因此句內或插入的 pause 不會稀釋 CPS。逐 active interval 的 stretcher 曾在固定 root ablation 造成長文 availability 回退,目前 production profile 不啟用;這個 union duration 只用於正確量測與 fail-closed gate。 第一個候選同時通過 local 與 joined whole gate,且符合 early-accept speaker preference 時才會 立即回傳;若 generated-chunk budget 允許,request 才會依序擴展到 5、10 個候選;只有 chunk 與 800 speech-unit work budget 都允許的單 chunk 在 K10 仍無安全候選時才會再到 K15/K20。 每個 stage 先找完整 same-seed trajectory; 整個 budget 完全找不到 joined-safe whole trajectory 時,才用逐 chunk semantic/pace/speaker hard-gate local score(另含唯一 boundary-only ≤ 0.15 的 DP-only 例外),以及相鄰 chunks 的 ECAPA cosine 與 active-RMS dB 差做 bounded k-best dynamic programming。多 chunk request 的候選上限是 `min(20, floor(20 / chunk count), floor(800 / total speech units))`:40 units 內的單 chunk 才可到 K20、80 units 單 chunk 最多 K10;360-unit 長文最多 K2,因此不會把高 K 或 NFE 20 帶進 120 秒 ZeroGPU lease。 非 final stage 的 speaker-gated chunks 只有在 similarity 至少 0.25、directional boundary drop 不超過 0.05 時才能 early accept。只通過 local 0.10/0.10 hard gate 的 marginal candidate 會保留並 繼續下一個可用 stage;到了 request budget 的 final stage 仍可作為 verified fallback,避免降低 availability,但 joined/final 仍必須通過 0.105/0.095 release-parity guard。未套 speaker hard gate 的 極短句不受 preferred threshold 阻擋。 joined/final ECAPA 會從 1.48 秒 active duration 提前觸發,吸收 WAV round-trip 可能造成的 一至兩個 RMS frame 邊界位移;正式 release speaker eligibility 仍固定為 1.50 秒。 若所有候選仍有漏字、多說字、句尾截斷、語速過快或可量測的音色漂移,服務會拒絕輸出, 不會回傳任意 fallback。極短音檔的分段 ECAPA 不可靠,因此只採嚴格語意 gate,並在 release audit 中獨立標記為 speaker-unverified;這不代表模型的短句音色已被根治。 目前部署路徑不使用 reference-style distribution score;sequence DP 已使用 speaker/RMS transition,但尚未啟用 normalized median-F0 transition。Style 與 F0 helper 仍只供離線實驗, 不能把它們列為目前 Space 已提供的穩定性保證。 請只使用已取得授權的參考音檔。合成語音僅供研究與評估展示,正式使用前請人工檢視。 程式碼與本機使用方式:[OpenFormosa/BlueMagpie-TTS](https://github.com/OpenFormosa/BlueMagpie-TTS)