Release selected stable recovery checkpoint
Browse files- README.md +36 -28
- USAGE.md +5 -3
- config.json +15 -1
- pytorch_model.bin +2 -2
- 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
|
| 18 |
-
|
| 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
|
| 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 |
-
|
|
| 120 |
| --- | --- | ---: | ---: |
|
| 121 |
-
|
|
| 122 |
-
|
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 148 |
-
|
| 149 |
-
|
| 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="
|
| 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
|
| 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.
|
| 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:
|
| 3 |
-
size
|
|
|
|
| 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": "
|
| 4 |
"release_status": "selected_stable",
|
| 5 |
"files": [
|
| 6 |
"pytorch_model.bin",
|
|
@@ -11,7 +11,7 @@
|
|
| 11 |
],
|
| 12 |
"artifacts": {
|
| 13 |
"pytorch_model.bin": {
|
| 14 |
-
"sha256": "
|
| 15 |
},
|
| 16 |
"audiovae.pth": {
|
| 17 |
"sha256": "cc01a2d5d817910f185d959f8bb23d1a5ab80c9a03b7398ac86d7457cb663332"
|
|
@@ -29,35 +29,42 @@
|
|
| 29 |
"evaluation": {
|
| 30 |
"scope": "internal held-out evaluation",
|
| 31 |
"centroid_only": {
|
| 32 |
-
"
|
| 33 |
-
"
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
"
|
| 37 |
-
"
|
| 38 |
-
"
|
| 39 |
-
"wer": 0.11774568024568023
|
| 40 |
},
|
| 41 |
"speaker_reference_embedding": {
|
| 42 |
"release_role": "production",
|
| 43 |
-
"
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
"
|
| 47 |
-
"
|
| 48 |
-
"
|
|
|
|
|
|
|
| 49 |
},
|
| 50 |
-
"
|
| 51 |
-
"
|
| 52 |
-
"
|
| 53 |
-
"
|
| 54 |
-
"
|
| 55 |
-
"chars_per_second": 4.017351942663145,
|
| 56 |
-
"chunk_speaker_similarity_drop": 0.1085478663444519
|
| 57 |
},
|
| 58 |
-
"
|
| 59 |
-
"
|
| 60 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
}
|