Spaces:
Running on Zero
Running on Zero
File size: 15,895 Bytes
96187a5 927c1a5 96187a5 927c1a5 96187a5 927c1a5 3849548 927c1a5 96187a5 3849548 927c1a5 3849548 927c1a5 3849548 927c1a5 7e7df2a 3849548 c5dba79 3849548 c5dba79 3849548 c5dba79 3849548 927c1a5 db9516b 7e7df2a 334063e 7e7df2a e99cd17 db9516b 3849548 980c9b8 c854ffa 3849548 347b364 980c9b8 34ba6ed 1804ac1 6b02f6a 980c9b8 7e7df2a 980c9b8 c854ffa 347b364 7e7df2a 347b364 7e7df2a c854ffa 980c9b8 3849548 7e7df2a 927c1a5 347b364 980c9b8 7e7df2a 980c9b8 7e7df2a 347b364 401d0bc 7e7df2a e99cd17 347b364 7e7df2a e99cd17 347b364 980c9b8 401d0bc 347b364 401d0bc 980c9b8 7e7df2a c854ffa 7e7df2a 34ba6ed 980c9b8 34ba6ed 980c9b8 c854ffa 980c9b8 927c1a5 6b02f6a 980c9b8 0d802e8 980c9b8 7e7df2a 0d802e8 980c9b8 f981c67 980c9b8 7e7df2a 347b364 c854ffa 7e7df2a 980c9b8 927c1a5 3849548 a8231fb 3849548 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | ---
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 | fixed candidate schedule: offset 0/even = 3.0, positive odd = 2.0; UI primary CFG is locked |
| NFE steps | fixed at the validated value 10 |
| Target pace | 4.0 speech units/sec |
| Initial whole-trajectory policy | base: 5.2 CJK / 4.6 ASCII-mixed units/sec + 1 latent step |
| Low-coverage chunk-refill policy | safe duration: 4.6 CJK / 4.0 ASCII-mixed units/sec + 1 latent step |
| Sparse completion-headroom policy | every fourth retry: 4.2 CJK / 3.6 ASCII-mixed units/sec + 1 latent step |
| Short-text guidance | minimum CFG 3.0 at no more than 6 speech units |
| Generation guidance | fixed mixed-CFG assignment within the bounded cascade; public NFE fixed at 10 |
| Email / URL frontend | explicit Taiwan-Mandarin letter names for scheme and opaque labels, digit-by-digit numbers, and audible separators |
| 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 waveform, pitch-preserving; second bounded correction above 4.00 active CPS; no active-interval slicing |
| Pace / speaker eligibility duration | union of active 25 ms RMS frames at 10 ms hop; internal pauses excluded |
| Semantic verification | orthographic whole CER + tone-aware acoustic first/last 6 exact + no lexical tail; turbo/full-large-v3 hard intersection; fail closed |
| Local speaker verification | frozen request centroid + bounded window begin/end directional drift |
| 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 | exactly one same-seed whole trajectory, then deterministic single-chunk refills for zero/low-coverage rows only |
| Whole-trajectory qualification | assemble with production RMS/fade/pause/crossfade/speed, then whole-output gate |
| Sequence fallback | ragged DP with up to 3 culprit-diverse paths; boundary-only local rejects may enter through a frozen 0.15 cap, then every exact assembly must pass turbo + full large-v3 and 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 speech units |
| Minimum chunk | 12 speech units where feasible; genuine short requests/natural short sentence boundaries are preserved |
| 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;其中所有長文切段
共用 root seed,並使用 base policy(5.2 CJK / 4.6 ASCII)。如果這條 exact whole path 未通過,
服務會保留每一段的 local evidence,再依 `(coverage, refill attempts, chunk index)` 穩定順序,
只對 zero/low-coverage chunk 逐一生成 refill。大多數 offset 使用 safe-duration(4.6 CJK / 4.0 ASCII),
每第四個 retry 使用 completion-headroom(4.2 CJK / 3.6 ASCII)。Refill 使用
`root seed + global generation offset`,不會重新生成其他已覆蓋 chunks。三種 policy 都只改 native-duration endpoint estimate,
margin 固定 +1 latent step、`min_len` 固定為 2,不會為了播放目標語速硬撐 generation loop。
選中完整 trajectory 或 coverage-sequence-DP 混合路徑後,log 會記錄每個 chunk 的 candidate、seed、policy、實際 CFG,
並記錄每個已嘗試 offset 的 schedule CFG。Offset 0 與偶數候選使用 primary CFG 3.0,
正奇數候選使用 alternate CFG 2.0;含 URL/email 的 chunk 仍有 CFG 3.0 的內容安全下限。
同一列 log 也記錄實際 generated chunks/text units 與各 row 的有效候選數。
每次生成前另外記錄 seed、local chunk index、duration policy、scheduled CFG,
以及 network/short-text floor 後的 effective CFG;因此即使最後 fail closed 也能重建嘗試軌跡。
終端 outcome 另輸出 content-free canonical evidence schema v2,包含 original chunk indices、
CFG contract、20/800 預算用量與 selected-path 交叉檢查,不包含 target/transcript/audio/embedding。
為了讓 release contract 與正式量測一致,UI 不提供其他 primary CFG。
內部 hosted evaluator 可注入 `[0, 2^31)` 的固定 root seed 以重現結果;UI 不暴露這個參數,
一般請求仍只在未注入 seed 時使用系統亂數。
初始完整 same-seed trajectory 永遠優先;通過 turbo + full large-v3 exact-whole gate 就立即回傳,
不會執行 refill 或 DP。若失敗,之後只做單 chunk refill,不再生成第二條完整 trajectory。
Ragged 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;initial whole rejection 會啟動低覆蓋 refill,sequence rejection 則只會
前進到下一條已排序的 exact path。
此外,初始 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。
初始 whole trajectory 未通過後,refill scheduler 會優先補 coverage=0 的 rows,再補不足 3 個
可用候選的低覆蓋 rows;失敗的 refill 也完整計入 generation budget,避免單一壞段無限重試。
完成 refill 或觸及任一硬預算後才建立 ragged DP,不要求每個 chunk 有相同候選數。
已通過 local hard gate 的 chunk 可直接進入 DP;唯一 rejection reason 是
`boundary_speaker_drop`、且 drop 不超過 0.15 的 chunk 也可作為 DP-only 候選。Single-chunk
request 可使用相同的 local proxy,但仍必須重新通過 exact whole-waveform 0.105/0.095 release guard。
這個 boundary-only relaxation 不適用於 semantic、pace、speaker similarity、缺少 evidence 或 whole-trajectory
accept,也不能在缺少整段 final verifier 時啟用。Local score 加上相鄰 ECAPA/RMS transition
cost 會產生最多 3 條 culprit-diverse 完整路徑;除了最低總成本,後續 exact checks 會優先選擇
在初始失敗 chunks 上使用不同候選的路徑,避免三次驗證都只改動已穩定段。每條都用同一個 production assembler 和整段
semantic/pace/speaker gate 驗證;整段仍必須通過 similarity 0.105 與 boundary drop 0.095,
第一條通過才回傳。三條都失敗、callback 異常或沒有完整
finite path 時一律 fail closed。
被拒的 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 會先統一
繁簡字形再評分,避免把正確的台灣華語輸出誤判為內容錯誤。
Email 與 URL 會以可辨識的語義讀法展開:scheme、local/domain/path 的 opaque ASCII
labels 逐字使用台灣華語字母名,數字逐位朗讀,分隔符明確朗讀(例如 `.tw`
讀成「點、踢、達不溜」)。
這能降低模型把不常見 TLD 自動補成 `.com` 的風險;一般英文句子不會套用這個規則。
URL 與後續英文 prose 應以空白或中文標點分隔;未分隔的 RFC path punctuation 會視為 URL
本身的一部分並納入 exact gate。Quoted email local-part 暫不支援,輸入時會直接 fail closed。
URL identifier 目前只支援 ASCII;非 ASCII IRI 必須先轉成 ASCII/percent-encoded 形式,
否則會因字母讀音碰撞而在 normalization 前 fail closed。
為避免 Whisper 自動句末標點和 URL 內容不可判定,URL 不接受以 `. , ! ? ; : '` 結尾;
需要這些尾端符號時請使用 percent encoding。
Whisper 常見的 `15点30分`/`15點30分` 會視為同一讀法;裸寫 `15點30` 只有在 target
明確含同一個完整鐘點讀法時才作 ASR-only canonicalization。比分、秒數、重量、裸 `15點`、
非法時間與真實漏字仍會被拒絕。超過 28 秒的 whole-output ASR 只在持續
低能量的標點 pause 切段,找不到 pause 才在 28 秒上限前使用最低能量 fallback。
整句 intelligibility 仍使用 orthographic CER 上限 0.20。首尾、刪字與額外尾詞則使用固定
`pypinyin==0.55.0` 的 lexical-tone units 做完整 Levenshtein alignment:例如 `陶藝/陶逸`
可視為同一聲學讀法,`陶藝/陶一` 與 `改到/改造` 仍會被拒。ASCII network identifier 保持
逐字元比較,numeric/frequency contradiction 也仍 fail closed。這項 acoustic endpoint
normalization 不會修改送入模型的文字;既有同音代詞 canonicalization 仍保留。
自然 stop 在目前 checkpoint 上仍可能過快或錯過句尾。Demo 不再用播放目標語速決定生成長度;
模型使用原生語速的安全上限,完成後才做保音高語速校正。缺少句末標點時只在模型輸入補上句號,
不超過 6 個 speech units 的短句會使用最低 CFG 3.0;stop threshold 只在預估進度 75% 後逐步降低,並於 95% 進度降至 0.05,以捕捉句末弱 stop 訊號而不影響前段內容。
80 字內的 request 不再為了 onset 額外切段;長文才依自然標點與 80 字上限切段,避免人工
endpoint、孤立引號與不必要的局部 prefix/suffix gate。Release
profile 鎖定 primary CFG 3.0 / alternate 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
回退,因此仍不切開 active intervals;production 先保留原本的完整 waveform 語速校正,再依
active union duration 只在 active pace 超過 4.0 units/s 時,對同一完整 waveform 做第二次
bounded、保音高校正;總 stretch rate 不低於 0.80。這保留 4.3 CPS gate 的安全餘量,並避免
已在 4.0 CPS 以下的完整語音被不必要地拉長。
Generation work 以實際產生的 chunks 與其 speech units 累計:初始 trajectory 花費
`chunk count` 與全文 speech units;每次 refill 再加 1 chunk 與該段 units。任一 request 最多
20 generated TTS chunks、800 generated speech units,且 refill 只跑固定 NFE 10。
因此長文不再為了取得某一段替代候選而重生整篇,預算可直接集中在 ASR/speaker gate 顯示的
zero/low-coverage rows。若某 row 在預算內仍為 zero coverage,或 ragged graph 沒有 finite path,
服務立即 fail closed,不會放寬 semantic、speaker、pace 或 endpoint gate。
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;固定 speaker centroid 只代表 identity,
不宣稱複製細緻情緒或韻律。Sequence DP 會使用相鄰候選的 ECAPA、active RMS 與 normalized
median-F0 軟成本來降低跨句音色、響度與基準音高跳變;任何選中路徑仍必須重新通過整段
semantic、speaker、pace 與 endpoint hard gates。
請只使用已取得授權的參考音檔。合成語音僅供研究與評估展示,正式使用前請人工檢視。
程式碼與本機使用方式:[OpenFormosa/BlueMagpie-TTS](https://github.com/OpenFormosa/BlueMagpie-TTS)
|