aufklarer commited on
Commit
112dd8f
·
verified ·
1 Parent(s): 1272aa3

Preserve FP32 ReDimNet frontend and embedding head

Browse files

Keep the learned backbone in FP16; publish compiled artifacts, export metadata, SHA-256 checksums and numerical validation.

README.md CHANGED
@@ -22,8 +22,8 @@ samples. It does not diarize audio or assign names by itself.
22
  | Property | Value |
23
  |---|---:|
24
  | Parameters | 12.3 million |
25
- | Format | Compiled Core ML, Float16 weights |
26
- | Compiled size | 24.7 MiB |
27
  | Input | 96,000 mono Float32 samples |
28
  | Sample rate | 16 kHz |
29
  | Window | 6 seconds |
@@ -35,29 +35,37 @@ shape avoids the slow Core ML fallback observed with a flexible waveform shape.
35
  Applications should repeat clean two-to-six-second speech to fill the input and
36
  center-crop longer samples.
37
 
 
 
 
 
 
38
  ## Files
39
 
40
  | File | Size | Description |
41
  |---|---:|---|
42
- | `ReDimNet2B6.mlmodelc/` | 24.7 MiB | Precompiled Core ML model |
43
- | `config.json` | <2 KiB | Input, output, source revision, checksum, and validation metadata |
44
- | `README.md` | <4 KiB | This model card |
 
45
  | `LICENSE` | 1.0 KiB | MIT license from the upstream implementation |
46
 
47
  ## Performance
48
 
49
- Measured on an Apple M2 Max after two warm-up predictions:
50
 
51
  | Measurement | Result | Meaning |
52
  |---|---:|---|
53
- | Warm six-second inference | 13.8 ms | One voice-profile embedding |
54
- | Warm throughput | 72.6 embeddings/s | Repeated six-second windows after warm-up |
55
- | Meeting pilot equal-error rate, 2-second clips | 1.50% | Lower is better; WeSpeaker Core ML was 5.17% |
56
- | Meeting pilot equal-error rate, 3-second clips | 0.00% | Lower is better; WeSpeaker Core ML was 1.50% |
57
- | LibriSpeech test-clean equal-error rate, 40 speakers | 0.00% | Two- and three-second controls |
58
-
59
- The meeting pilot contains five recurring speakers and is not a universal
60
- quality claim. Thresholds must be calibrated for the intended microphones,
 
 
61
  languages, and acoustic conditions. Speaker embeddings are useful for labeling;
62
  they are not biometric authentication and do not protect against voice spoofing.
63
 
 
22
  | Property | Value |
23
  |---|---:|
24
  | Parameters | 12.3 million |
25
+ | Format | Compiled Core ML; FP32 frontend/head, FP16 backbone |
26
+ | Compiled size | 28.6 MiB |
27
  | Input | 96,000 mono Float32 samples |
28
  | Sample rate | 16 kHz |
29
  | Window | 6 seconds |
 
35
  Applications should repeat clean two-to-six-second speech to fill the input and
36
  center-crop longer samples.
37
 
38
+ Export revision `frontend-fp32-v1` preserves waveform normalization, spectral
39
+ and mel computation, log/feature normalization, pooling and output projection
40
+ in FP32. The learned backbone remains FP16. This prevents numerical overflow
41
+ in preprocessing without changing the checkpoint or input/output contract.
42
+
43
  ## Files
44
 
45
  | File | Size | Description |
46
  |---|---:|---|
47
+ | `ReDimNet2B6.mlmodelc/` | 28.6 MiB | Precompiled Core ML model |
48
+ | `config.json` | <16 KiB | Contract, export revision, compiled-file SHA-256 and numerical validation |
49
+ | `checksums.json` | <2 KiB | SHA-256 of every other published artifact |
50
+ | `README.md` | <8 KiB | This model card |
51
  | `LICENSE` | 1.0 KiB | MIT license from the upstream implementation |
52
 
53
  ## Performance
54
 
55
+ Measured on an Apple M5 Pro after two warm-up predictions:
56
 
57
  | Measurement | Result | Meaning |
58
  |---|---:|---|
59
+ | Warm six-second inference | 13.6 ms | One voice-profile embedding |
60
+ | Warm throughput | 73.6 embeddings/s | Repeated six-second windows after warm-up |
61
+ | Numerical validation | 20/20 configurations and controls | Five deterministic controls across four allowed-device settings |
62
+
63
+ Numerical validation checks finite, normalized outputs and cosine >= 0.999
64
+ against the original FP32 model. Controls cover a noisy two-tone waveform,
65
+ sparse burst, quiet waveform, repeated 600 ms waveform and silence. Allowed-device
66
+ settings do not identify actual per-operation placement. These checks do not
67
+ measure diarization, recognition accuracy, or speaker-verification error rate.
68
+ Thresholds must be calibrated for the intended microphones,
69
  languages, and acoustic conditions. Speaker embeddings are useful for labeling;
70
  they are not biometric authentication and do not protect against voice spoofing.
71
 
ReDimNet2B6.mlmodelc/analytics/coremldata.bin CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:1fa08bf1dda00e0fa91ba683fdd0665880bf8f8a0bb4e42f40d844ad81b0e839
3
  size 243
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:05fe3e096940a0a13f1a4f2382108872e4a5c448cc552cefcfdebee93f096322
3
  size 243
ReDimNet2B6.mlmodelc/coremldata.bin CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:81a52a3b06ef39f27a242e47b51d6d00b0dce4e57809d6c8b68677d89bf3e66b
3
  size 518
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8b23b5a85f79b16a5798121193254e18b43096264c63afdbed90911a64ba1294
3
  size 518
ReDimNet2B6.mlmodelc/model.mil CHANGED
The diff for this file is too large to render. See raw diff
 
ReDimNet2B6.mlmodelc/weights/weight.bin CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:dc2144871b34862429a4c82b28a413e201b52c89e6e66414b61fe9ba0e4ad7a2
3
- size 25423808
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:780eb60151995b33d6a967deac32b9fe22ebd119e8288417f6d51ac7b856bcfc
3
+ size 29519872
checksums.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "LICENSE": "3d5a4bf9936a7d09dd770588c0d7cb116fc16916a0310d71fb1fff5d64562101",
3
+ "README.md": "d799fb856ad8d9c04f34579c999ccac4d5f5abc56630fc70fd790ef3af76f1bd",
4
+ "ReDimNet2B6.mlmodelc/analytics/coremldata.bin": "05fe3e096940a0a13f1a4f2382108872e4a5c448cc552cefcfdebee93f096322",
5
+ "ReDimNet2B6.mlmodelc/coremldata.bin": "8b23b5a85f79b16a5798121193254e18b43096264c63afdbed90911a64ba1294",
6
+ "ReDimNet2B6.mlmodelc/model.mil": "8b138359651f98bcd876eab2377ed9a5ddaf5f726745775ce1670ac5103fc79d",
7
+ "ReDimNet2B6.mlmodelc/weights/weight.bin": "780eb60151995b33d6a967deac32b9fe22ebd119e8288417f6d51ac7b856bcfc",
8
+ "config.json": "7c4e9a6afcd5322f5bf6e5c7d2ec1d555221504c87fdaed3bc50fa197628c630"
9
+ }
config.json CHANGED
@@ -12,14 +12,165 @@
12
  "checkpoint_sha256": "e0a7d340a92f798720d1208949aa6a6bd0cddcb0ba7d4cec33596a17a484e6a2",
13
  "source_repository": "https://github.com/PalabraAI/redimnet2.git",
14
  "source_revision": "2a8d15f65b1dfb5d73fede2f11ee42bcccca3035",
15
- "compute_precision": "float16",
 
 
 
 
 
 
 
16
  "compiled_model": "ReDimNet2B6.mlmodelc",
17
- "compiled_size_bytes": 25931707,
18
  "validation": {
19
- "pytorch_coreml_cosine": 0.9999898663545027,
20
- "max_absolute_error": 0.0011521875858306885,
21
- "output_l2_norm": 0.9999155402183533,
22
- "warm_latency_median_ms": 13.766916505119298,
23
- "warm_latency_min_ms": 13.575500008300878
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
  }
 
12
  "checkpoint_sha256": "e0a7d340a92f798720d1208949aa6a6bd0cddcb0ba7d4cec33596a17a484e6a2",
13
  "source_repository": "https://github.com/PalabraAI/redimnet2.git",
14
  "source_revision": "2a8d15f65b1dfb5d73fede2f11ee42bcccca3035",
15
+ "compute_precision": "fp32-frontend-head-fp16-backbone",
16
+ "artifact_revision": "frontend-fp32-v1",
17
+ "compiled_files_sha256": {
18
+ "analytics/coremldata.bin": "05fe3e096940a0a13f1a4f2382108872e4a5c448cc552cefcfdebee93f096322",
19
+ "coremldata.bin": "8b23b5a85f79b16a5798121193254e18b43096264c63afdbed90911a64ba1294",
20
+ "model.mil": "8b138359651f98bcd876eab2377ed9a5ddaf5f726745775ce1670ac5103fc79d",
21
+ "weights/weight.bin": "780eb60151995b33d6a967deac32b9fe22ebd119e8288417f6d51ac7b856bcfc"
22
+ },
23
  "compiled_model": "ReDimNet2B6.mlmodelc",
24
+ "compiled_size_bytes": 30024704,
25
  "validation": {
26
+ "pytorch_coreml_cosine": 0.9999944567677055,
27
+ "max_absolute_error": 0.0007698908448219299,
28
+ "output_l2_norm": 0.9999999403953552,
29
+ "numerical_trials": [
30
+ {
31
+ "control": "representative",
32
+ "configured_compute": "all",
33
+ "pytorch_coreml_cosine": 0.9999944567677055,
34
+ "max_absolute_error": 0.0007698908448219299,
35
+ "output_l2_norm": 0.9999999403953552
36
+ },
37
+ {
38
+ "control": "sparse_burst",
39
+ "configured_compute": "all",
40
+ "pytorch_coreml_cosine": 0.9999972581863403,
41
+ "max_absolute_error": 0.0005928315222263336,
42
+ "output_l2_norm": 0.9999999403953552
43
+ },
44
+ {
45
+ "control": "quiet",
46
+ "configured_compute": "all",
47
+ "pytorch_coreml_cosine": 0.9999944567677055,
48
+ "max_absolute_error": 0.0007817968726158142,
49
+ "output_l2_norm": 0.9999999403953552
50
+ },
51
+ {
52
+ "control": "short_600ms_repeated",
53
+ "configured_compute": "all",
54
+ "pytorch_coreml_cosine": 0.9999915361394329,
55
+ "max_absolute_error": 0.0008646771311759949,
56
+ "output_l2_norm": 0.9999999403953552
57
+ },
58
+ {
59
+ "control": "silence",
60
+ "configured_compute": "all",
61
+ "pytorch_coreml_cosine": 0.9999983906745911,
62
+ "max_absolute_error": 0.0004066694527864456,
63
+ "output_l2_norm": 1.0
64
+ },
65
+ {
66
+ "control": "representative",
67
+ "configured_compute": "cpuOnly",
68
+ "pytorch_coreml_cosine": 0.9996381401800001,
69
+ "max_absolute_error": 0.004830073099583387,
70
+ "output_l2_norm": 0.9999999403953552
71
+ },
72
+ {
73
+ "control": "sparse_burst",
74
+ "configured_compute": "cpuOnly",
75
+ "pytorch_coreml_cosine": 0.9994637966156006,
76
+ "max_absolute_error": 0.006543740630149841,
77
+ "output_l2_norm": 0.9999999403953552
78
+ },
79
+ {
80
+ "control": "quiet",
81
+ "configured_compute": "cpuOnly",
82
+ "pytorch_coreml_cosine": 0.9996398687362671,
83
+ "max_absolute_error": 0.004818218294531107,
84
+ "output_l2_norm": 1.0
85
+ },
86
+ {
87
+ "control": "short_600ms_repeated",
88
+ "configured_compute": "cpuOnly",
89
+ "pytorch_coreml_cosine": 0.999514043302181,
90
+ "max_absolute_error": 0.006073140539228916,
91
+ "output_l2_norm": 1.0
92
+ },
93
+ {
94
+ "control": "silence",
95
+ "configured_compute": "cpuOnly",
96
+ "pytorch_coreml_cosine": 0.9995816946029663,
97
+ "max_absolute_error": 0.004980172961950302,
98
+ "output_l2_norm": 1.0
99
+ },
100
+ {
101
+ "control": "representative",
102
+ "configured_compute": "cpuAndGPU",
103
+ "pytorch_coreml_cosine": 0.9999944567677055,
104
+ "max_absolute_error": 0.0007698908448219299,
105
+ "output_l2_norm": 0.9999999403953552
106
+ },
107
+ {
108
+ "control": "sparse_burst",
109
+ "configured_compute": "cpuAndGPU",
110
+ "pytorch_coreml_cosine": 0.9999972581863403,
111
+ "max_absolute_error": 0.0005928315222263336,
112
+ "output_l2_norm": 0.9999999403953552
113
+ },
114
+ {
115
+ "control": "quiet",
116
+ "configured_compute": "cpuAndGPU",
117
+ "pytorch_coreml_cosine": 0.9999944567677055,
118
+ "max_absolute_error": 0.0007817968726158142,
119
+ "output_l2_norm": 0.9999999403953552
120
+ },
121
+ {
122
+ "control": "short_600ms_repeated",
123
+ "configured_compute": "cpuAndGPU",
124
+ "pytorch_coreml_cosine": 0.9999915361394329,
125
+ "max_absolute_error": 0.0008646771311759949,
126
+ "output_l2_norm": 0.9999999403953552
127
+ },
128
+ {
129
+ "control": "silence",
130
+ "configured_compute": "cpuAndGPU",
131
+ "pytorch_coreml_cosine": 0.9999983906745911,
132
+ "max_absolute_error": 0.0004066694527864456,
133
+ "output_l2_norm": 1.0
134
+ },
135
+ {
136
+ "control": "representative",
137
+ "configured_compute": "cpuAndNeuralEngine",
138
+ "pytorch_coreml_cosine": 0.9997856616973877,
139
+ "max_absolute_error": 0.004807561635971069,
140
+ "output_l2_norm": 1.0
141
+ },
142
+ {
143
+ "control": "sparse_burst",
144
+ "configured_compute": "cpuAndNeuralEngine",
145
+ "pytorch_coreml_cosine": 0.999923825263977,
146
+ "max_absolute_error": 0.002673111855983734,
147
+ "output_l2_norm": 0.9999999403953552
148
+ },
149
+ {
150
+ "control": "quiet",
151
+ "configured_compute": "cpuAndNeuralEngine",
152
+ "pytorch_coreml_cosine": 0.9997879862785339,
153
+ "max_absolute_error": 0.004699621349573135,
154
+ "output_l2_norm": 1.0
155
+ },
156
+ {
157
+ "control": "short_600ms_repeated",
158
+ "configured_compute": "cpuAndNeuralEngine",
159
+ "pytorch_coreml_cosine": 0.9998489022074821,
160
+ "max_absolute_error": 0.0035514049232006073,
161
+ "output_l2_norm": 0.9999999403953552
162
+ },
163
+ {
164
+ "control": "silence",
165
+ "configured_compute": "cpuAndNeuralEngine",
166
+ "pytorch_coreml_cosine": 0.9998403787612915,
167
+ "max_absolute_error": 0.0037407726049423218,
168
+ "output_l2_norm": 1.0
169
+ }
170
+ ],
171
+ "numerical_trial_count": 20,
172
+ "minimum_pytorch_coreml_cosine": 0.9994637966156006,
173
+ "warm_latency_median_ms": 13.595416501630098,
174
+ "warm_latency_min_ms": 13.451875012833625
175
  }
176
  }