voidful commited on
Commit
9f63115
·
verified ·
1 Parent(s): 71084e9

Release selected stable recovery checkpoint

Browse files
Files changed (5) hide show
  1. README.md +36 -28
  2. USAGE.md +5 -3
  3. config.json +15 -1
  4. pytorch_model.bin +2 -2
  5. release_metadata.json +33 -26
README.md CHANGED
@@ -14,9 +14,8 @@ license: other
14
  # BlueMagpie-TTS
15
 
16
  BlueMagpie-TTS checkpoint for research and evaluation. The files in this Hub
17
- repository are the selected balanced two-mode release. Newer experimental
18
- checkpoints are not promoted unless they pass the same intelligibility,
19
- duration, endpoint, and speaker-stability gates.
20
 
21
  This repository contains the inference artifact only: model weights, AudioVAE
22
  weights, tokenizer files, config, and usage documentation. It does not include
@@ -60,6 +59,7 @@ audio = model.generate(
60
  cfg_value=2.0,
61
  inference_timesteps=10,
62
  retry_badcase=True,
 
63
  stop_threshold=0.65,
64
  stop_consecutive=2,
65
  )
@@ -108,7 +108,7 @@ speaker embedding for every chunk, applies punctuation-aware pauses, and can
108
  set a minimum duration from the target speaking rate:
109
 
110
  ```bash
111
- python scripts/generate_tts.py --checkpoint /path/to/model-snapshot --mode speaker-reference-audio-only --speaker-reference-wav /path/to/rights-cleared-reference.wav --reference-audio-conditioning speaker-embedding --text-file long_text.txt --chunk-chars 45 --min-chunk-chars 12 --target-chars-per-sec 4.2 --stop-threshold 0.65 --stop-consecutive 2 --crossfade-ms 80 --out long.wav
112
  ```
113
 
114
  ## Evaluation
@@ -116,26 +116,35 @@ python scripts/generate_tts.py --checkpoint /path/to/model-snapshot --mode s
116
  Numbers below are from an internal held-out evaluation set. The eval set and
117
  training data are intentionally not described in this model card.
118
 
119
- | System | Setting | CER | WER |
120
  | --- | --- | ---: | ---: |
121
- | BlueMagpie-TTS | centroid-only | 7.44% | 8.57% |
122
- | BlueMagpie-TTS | raw-reference-tokens research path | 8.99% | 11.77% |
123
- | BlueMagpie-TTS | speaker-reference-embedding production path | pending re-qualification | pending re-qualification |
124
- | Reference baseline | same internal eval | 11.45% | 14.83% |
125
-
126
- Long-form diagnostics on the selected checkpoint:
127
-
128
- | Metric | Value |
129
- | --- | ---: |
130
- | centroid-only CER / WER | 7.51% / 7.51% |
131
- | raw-reference-tokens CER / WER | 8.92% / 8.92% |
132
- | Median chars/sec | 4.017 |
133
- | speaker-reference chunk speaker-sim drop | 0.109 |
134
-
135
- The measured reference-audio rows above used the raw-reference-token research
136
- backend. They are not presented as production speaker-embedding results. The
137
- long-form rate was measured with controlled chunked inference; it does not show
138
- that unrestricted single-pass endpoint behavior is fully solved.
 
 
 
 
 
 
 
 
 
139
 
140
  ## Limitations
141
 
@@ -143,11 +152,10 @@ that unrestricted single-pass endpoint behavior is fully solved.
143
  selection.
144
  - Speaker similarity depends on the quality and rights-cleared status of the
145
  supplied reference audio or centroid.
146
- - The windowed speaker-embedding backend is the recommended production path,
147
- but its full release-gate metrics are still pending re-qualification.
148
- - Free-running endpoint behavior can still produce rare early stops, overruns,
149
- repetitions, or extra speech. Keep retry and stop hysteresis enabled for
150
- offline generation and inspect important outputs.
151
  - Very long passages should be chunked to avoid stop-token and prosody drift.
152
  - Generated speech may be incorrect; do not use it as a real-world notification
153
  without human review.
 
14
  # BlueMagpie-TTS
15
 
16
  BlueMagpie-TTS checkpoint for research and evaluation. The files in this Hub
17
+ repository are the selected two-mode recovery release. Experimental branches
18
+ are not promoted when they regress the production speaker-reference path.
 
19
 
20
  This repository contains the inference artifact only: model weights, AudioVAE
21
  weights, tokenizer files, config, and usage documentation. It does not include
 
59
  cfg_value=2.0,
60
  inference_timesteps=10,
61
  retry_badcase=True,
62
+ retry_badcase_ratio_threshold=6.0,
63
  stop_threshold=0.65,
64
  stop_consecutive=2,
65
  )
 
108
  set a minimum duration from the target speaking rate:
109
 
110
  ```bash
111
+ python scripts/generate_tts.py --checkpoint /path/to/model-snapshot --mode speaker-reference-audio-only --speaker-reference-wav /path/to/rights-cleared-reference.wav --reference-audio-conditioning speaker-embedding --text-file long_text.txt --chunk-chars 120 --min-chunk-chars 12 --target-chars-per-sec 4.0 --stop-threshold 0.65 --stop-consecutive 2 --crossfade-ms 80 --out long.wav
112
  ```
113
 
114
  ## Evaluation
 
116
  Numbers below are from an internal held-out evaluation set. The eval set and
117
  training data are intentionally not described in this model card.
118
 
119
+ | Mode | Evaluation profile | CER | WER |
120
  | --- | --- | ---: | ---: |
121
+ | centroid-only | 30 texts x 5 seeds, controlled pace | 15.37% | 41.48% |
122
+ | speaker-reference-embedding | 30 texts x 5 seeds, controlled pace | 13.39% | 33.05% |
123
+
124
+ The controlled profile uses 4.2 target chars/sec, stop threshold 0.65, two-hit
125
+ hysteresis, and no retry selection. Its median/P95 pace is 4.04/4.17 chars/sec.
126
+ The stricter natural-stop profile has lower CER but fails the pace gate: P95
127
+ reaches 6.25 chars/sec and early-stop classification exceeds 50%. Controlled
128
+ pace is therefore part of the current production contract, not an optional
129
+ benchmark optimization.
130
+
131
+ Long-form diagnostics use 12 varied texts and five seeds. The final reference
132
+ path calibration uses 4.0 target chars/sec; the centroid comparison retains
133
+ the matched 4.2 target used during checkpoint selection:
134
+
135
+ | Mode | Path | Target CPS | CER | WER | Across-text speaker similarity |
136
+ | --- | --- | ---: | ---: | ---: | ---: |
137
+ | centroid-only | direct | 4.2 | 24.51% | 55.79% | 0.619 |
138
+ | centroid-only | chunked, 120 chars | 4.2 | 27.16% | 61.83% | 0.628 |
139
+ | speaker-reference-embedding | direct | 4.0 | 23.33% | 52.64% | 0.608 |
140
+ | speaker-reference-embedding | chunked, 120 chars | 4.0 | 26.54% | 56.13% | 0.625 |
141
+
142
+ Chunking improves speaker consistency and sentence-final completeness but can
143
+ trade reference-mode CER. At 4.0 target chars/sec, reference chunking reduced
144
+ the first-to-last sentence speaker drop from 0.108 at the previous 4.2 policy
145
+ to 0.025 and reduced final truncation from 18.33% to 16.67%. Use it for
146
+ multi-sentence or long input. Raw reference tokens are not represented by
147
+ these production metrics.
148
 
149
  ## Limitations
150
 
 
152
  selection.
153
  - Speaker similarity depends on the quality and rights-cleared status of the
154
  supplied reference audio or centroid.
155
+ - The windowed speaker-embedding backend is the recommended production path.
156
+ - Free-running endpoint behavior is not fully calibrated. Use the documented
157
+ target pace, stop hysteresis, and chunking contract; inspect important output.
158
+ - Raw reference tokens remain a separately gated research backend.
 
159
  - Very long passages should be chunked to avoid stop-token and prosody drift.
160
  - Generated speech may be incorrect; do not use it as a real-world notification
161
  without human review.
USAGE.md CHANGED
@@ -33,6 +33,7 @@ wav = model.generate(
33
  cfg_value=2.0,
34
  inference_timesteps=10,
35
  retry_badcase=True,
 
36
  stop_threshold=0.65,
37
  stop_consecutive=2,
38
  )
@@ -57,7 +58,7 @@ reference_embedding = speaker_embedding_from_wav(
57
  "reference_speaker.wav", window_sec=3.0, hop_sec=1.5
58
  )
59
  wav = model.generate(
60
- target_text="明天 meeting 取消一次,我們大家放假。",
61
  speaker_centroid=reference_embedding,
62
  cfg_value=2.0,
63
  inference_timesteps=10,
@@ -103,7 +104,7 @@ sf.write("streaming.wav", wav.numpy(), model.sample_rate)
103
  Long text:
104
 
105
  ```bash
106
- python scripts/generate_tts.py --checkpoint /path/to/model-snapshot --mode speaker-reference-audio-only --speaker-reference-wav /path/to/rights-cleared-reference.wav --reference-audio-conditioning speaker-embedding --text-file long_text.txt --chunk-chars 45 --min-chunk-chars 12 --target-chars-per-sec 4.2 --stop-threshold 0.65 --stop-consecutive 2 --crossfade-ms 80 --out long.wav
107
  ```
108
 
109
  This path extracts the windowed speaker embedding once and reuses it for every
@@ -115,9 +116,10 @@ Recommended generation defaults:
115
  - `cfg_value=2.0`
116
  - `inference_timesteps=10`
117
  - `retry_badcase=True` for offline generation
 
118
  - `stop_threshold=0.65`, `stop_consecutive=2` for offline generation
119
  - `max_len=2000` unless a longer chunk is intentionally needed
120
- - `target-chars-per-sec=4.2` for controlled long-form chunking
121
  - Reference wavs used to extract speaker embeddings should be at least 3 seconds.
122
 
123
  Safety:
 
33
  cfg_value=2.0,
34
  inference_timesteps=10,
35
  retry_badcase=True,
36
+ retry_badcase_ratio_threshold=6.0,
37
  stop_threshold=0.65,
38
  stop_consecutive=2,
39
  )
 
58
  "reference_speaker.wav", window_sec=3.0, hop_sec=1.5
59
  )
60
  wav = model.generate(
61
+ target_text="今天的 meeting 依照原定時間進行。",
62
  speaker_centroid=reference_embedding,
63
  cfg_value=2.0,
64
  inference_timesteps=10,
 
104
  Long text:
105
 
106
  ```bash
107
+ python scripts/generate_tts.py --checkpoint /path/to/model-snapshot --mode speaker-reference-audio-only --speaker-reference-wav /path/to/rights-cleared-reference.wav --reference-audio-conditioning speaker-embedding --text-file long_text.txt --chunk-chars 120 --min-chunk-chars 12 --target-chars-per-sec 4.0 --stop-threshold 0.65 --stop-consecutive 2 --crossfade-ms 80 --out long.wav
108
  ```
109
 
110
  This path extracts the windowed speaker embedding once and reuses it for every
 
116
  - `cfg_value=2.0`
117
  - `inference_timesteps=10`
118
  - `retry_badcase=True` for offline generation
119
+ - `retry_badcase_ratio_threshold=6.0` so retry detection is not a pace cap
120
  - `stop_threshold=0.65`, `stop_consecutive=2` for offline generation
121
  - `max_len=2000` unless a longer chunk is intentionally needed
122
+ - `target-chars-per-sec=4.0` for controlled long-form chunking
123
  - Reference wavs used to extract speaker embeddings should be at least 3 seconds.
124
 
125
  Safety:
config.json CHANGED
@@ -242,11 +242,22 @@
242
  0.25,
243
  0.75
244
  ],
 
 
245
  "noise_cond_prob_range": [
246
  0.0,
247
  0.0
248
  ],
249
- "noise_cond_scale": 0.0
 
 
 
 
 
 
 
 
 
250
  }
251
  },
252
  "audio_vae_config": {
@@ -287,6 +298,9 @@
287
  },
288
  "speaker_embed_dim": 192,
289
  "ref_audio_bottleneck": "none",
 
 
 
290
  "audio_start_token": -1,
291
  "audio_end_token": -1,
292
  "ref_audio_start_token": -1,
 
242
  0.25,
243
  0.75
244
  ],
245
+ "time_logit_mean": -0.4,
246
+ "time_logit_std": 1.0,
247
  "noise_cond_prob_range": [
248
  0.0,
249
  0.0
250
  ],
251
+ "noise_cond_scale": 0.0,
252
+ "full_interval_prob": 0.0,
253
+ "full_interval_mode": "absolute",
254
+ "full_interval_r": 0.0,
255
+ "full_interval_t": 1.0,
256
+ "integrated_cfg_training": false,
257
+ "integrated_cfg_inference": false,
258
+ "integrated_cfg_omega": 0.3,
259
+ "integrated_cfg_kappa": 0.9,
260
+ "cfg_rescale_phi": 0.0
261
  }
262
  },
263
  "audio_vae_config": {
 
298
  },
299
  "speaker_embed_dim": 192,
300
  "ref_audio_bottleneck": "none",
301
+ "ref_audio_summary_tokens": 4,
302
+ "speaker_step_injection": true,
303
+ "speaker_step_injection_init": "zero",
304
  "audio_start_token": -1,
305
  "audio_end_token": -1,
306
  "ref_audio_start_token": -1,
pytorch_model.bin CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:e454c077ded2ce9d5f3b8ec4f336af840a2fe9912149d1f25afd4938bf7a0319
3
- size 7746547131
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4c2f67a50db73a8bd4e35f6ecef7e9c874c13e22388a0e9dc73330e4a679d7dd
3
+ size 7783283863
release_metadata.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "format": "bluemagpie-pretrained",
3
- "checkpoint": "step_0006000",
4
  "release_status": "selected_stable",
5
  "files": [
6
  "pytorch_model.bin",
@@ -11,7 +11,7 @@
11
  ],
12
  "artifacts": {
13
  "pytorch_model.bin": {
14
- "sha256": "e454c077ded2ce9d5f3b8ec4f336af840a2fe9912149d1f25afd4938bf7a0319"
15
  },
16
  "audiovae.pth": {
17
  "sha256": "cc01a2d5d817910f185d959f8bb23d1a5ab80c9a03b7398ac86d7457cb663332"
@@ -29,35 +29,42 @@
29
  "evaluation": {
30
  "scope": "internal held-out evaluation",
31
  "centroid_only": {
32
- "cer": 0.07441389020336389,
33
- "wer": 0.08565566378066376
34
- },
35
- "speaker_reference_audio_only": {
36
- "backend": "raw_reference_tokens",
37
- "release_role": "research",
38
- "cer": 0.08992608978902839,
39
- "wer": 0.11774568024568023
40
  },
41
  "speaker_reference_embedding": {
42
  "release_role": "production",
43
- "status": "pending_requalification"
44
- },
45
- "long_centroid_only": {
46
- "cer": 0.07511737089201878,
47
- "wer": 0.07511737089201878,
48
- "chars_per_second": 4.017351942663145
 
 
49
  },
50
- "long_speaker_reference_audio_only": {
51
- "backend": "raw_reference_tokens",
52
- "release_role": "research",
53
- "cer": 0.0892018779342723,
54
- "wer": 0.0892018779342723,
55
- "chars_per_second": 4.017351942663145,
56
- "chunk_speaker_similarity_drop": 0.1085478663444519
57
  },
58
- "reference_baseline": {
59
- "cer": 0.114483,
60
- "wer": 0.148266
 
 
 
 
 
 
 
 
61
  }
62
  }
63
  }
 
1
  {
2
  "format": "bluemagpie-pretrained",
3
+ "checkpoint": "step_0000100",
4
  "release_status": "selected_stable",
5
  "files": [
6
  "pytorch_model.bin",
 
11
  ],
12
  "artifacts": {
13
  "pytorch_model.bin": {
14
+ "sha256": "4c2f67a50db73a8bd4e35f6ecef7e9c874c13e22388a0e9dc73330e4a679d7dd"
15
  },
16
  "audiovae.pth": {
17
  "sha256": "cc01a2d5d817910f185d959f8bb23d1a5ab80c9a03b7398ac86d7457cb663332"
 
29
  "evaluation": {
30
  "scope": "internal held-out evaluation",
31
  "centroid_only": {
32
+ "profile": "controlled_30_texts_5_seeds",
33
+ "cer": 0.1537326315659649,
34
+ "wer": 0.4148126965626966,
35
+ "chars_per_second_median": 4.044117647058823,
36
+ "chars_per_second_p95": 4.166666666666667,
37
+ "speaker_across_texts_median": 0.4630973200859695,
38
+ "speaker_centroid_p10": 0.37282803654670715
 
39
  },
40
  "speaker_reference_embedding": {
41
  "release_role": "production",
42
+ "profile": "controlled_30_texts_5_seeds",
43
+ "cer": 0.13387449587449585,
44
+ "wer": 0.330523828023828,
45
+ "chars_per_second_median": 4.044117647058823,
46
+ "chars_per_second_p95": 4.166666666666667,
47
+ "duration_cv": 0.045454545454545414,
48
+ "speaker_across_texts_median": 0.4557993102947186,
49
+ "speaker_reference_p10": 0.3619180113077164
50
  },
51
+ "natural_stop": {
52
+ "status": "pace_gate_failed",
53
+ "speaker_reference_cer": 0.1285453712953713,
54
+ "speaker_reference_p95_chars_per_second": 6.25,
55
+ "speaker_reference_early_stop_rate": 0.5066666666666667
 
 
56
  },
57
+ "longform_chunked_120": {
58
+ "profile": "12_texts_5_seeds",
59
+ "centroid_target_chars_per_second": 4.2,
60
+ "centroid_cer": 0.27156543786258974,
61
+ "centroid_speaker_across_texts_median": 0.6284434280612252,
62
+ "speaker_reference_target_chars_per_second": 4.0,
63
+ "speaker_reference_cer": 0.26542808108820687,
64
+ "speaker_reference_wer": 0.5612998112998112,
65
+ "speaker_reference_across_texts_median": 0.6251172526316209,
66
+ "speaker_reference_final_truncation_rate": 0.16666666666666666,
67
+ "speaker_reference_first_last_sentence_drop_p95": 0.024524328112602203
68
  }
69
  }
70
  }