SuperPauly huseinzolkepliscicom commited on
Commit
0993d8a
·
0 Parent(s):

Duplicate from Scicom-intl/CallEnhancer

Browse files

Co-authored-by: huseinzolkepliscicom <huseinzolkepliscicom@users.noreply.huggingface.co>

.gitattributes ADDED
@@ -0,0 +1,454 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ examples/audio1.mp3 filter=lfs diff=lfs merge=lfs -text
37
+ examples/callhome_deu.wav filter=lfs diff=lfs merge=lfs -text
38
+ examples/callhome_eng.wav filter=lfs diff=lfs merge=lfs -text
39
+ examples/callhome_jpn.wav filter=lfs diff=lfs merge=lfs -text
40
+ examples/callhome_spa.wav filter=lfs diff=lfs merge=lfs -text
41
+ examples/callhome_zho.wav filter=lfs diff=lfs merge=lfs -text
42
+ examples/callhome_deu_restored48k_step46000.wav filter=lfs diff=lfs merge=lfs -text
43
+ examples/callhome_eng_restored48k_step46000.wav filter=lfs diff=lfs merge=lfs -text
44
+ examples/callhome_jpn_restored48k_step46000.wav filter=lfs diff=lfs merge=lfs -text
45
+ examples/callhome_spa_restored48k_step46000.wav filter=lfs diff=lfs merge=lfs -text
46
+ examples/callhome_zho_restored48k_step46000.wav filter=lfs diff=lfs merge=lfs -text
47
+ examples/malaysian1_restored48k_step46000.wav filter=lfs diff=lfs merge=lfs -text
48
+ examples/malaysian2_restored48k_step46000.wav filter=lfs diff=lfs merge=lfs -text
49
+ examples/callhome_deu_restored48k_step56000.wav filter=lfs diff=lfs merge=lfs -text
50
+ examples/callhome_eng_restored48k_step56000.wav filter=lfs diff=lfs merge=lfs -text
51
+ examples/callhome_jpn_restored48k_step56000.wav filter=lfs diff=lfs merge=lfs -text
52
+ examples/callhome_spa_restored48k_step56000.wav filter=lfs diff=lfs merge=lfs -text
53
+ examples/callhome_zho_restored48k_step56000.wav filter=lfs diff=lfs merge=lfs -text
54
+ examples/malaysian1_restored48k_step56000.wav filter=lfs diff=lfs merge=lfs -text
55
+ examples/malaysian2_restored48k_step56000.wav filter=lfs diff=lfs merge=lfs -text
56
+ examples/callhome_deu_restored48k_step66000.wav filter=lfs diff=lfs merge=lfs -text
57
+ examples/callhome_eng_restored48k_step66000.wav filter=lfs diff=lfs merge=lfs -text
58
+ examples/callhome_jpn_restored48k_step66000.wav filter=lfs diff=lfs merge=lfs -text
59
+ examples/callhome_spa_restored48k_step66000.wav filter=lfs diff=lfs merge=lfs -text
60
+ examples/callhome_zho_restored48k_step66000.wav filter=lfs diff=lfs merge=lfs -text
61
+ examples/malaysian1_restored48k_step66000.wav filter=lfs diff=lfs merge=lfs -text
62
+ examples/malaysian2_restored48k_step66000.wav filter=lfs diff=lfs merge=lfs -text
63
+ examples/callhome_deu_restored48k_step78000.wav filter=lfs diff=lfs merge=lfs -text
64
+ examples/callhome_eng_restored48k_step78000.wav filter=lfs diff=lfs merge=lfs -text
65
+ examples/callhome_jpn_restored48k_step78000.wav filter=lfs diff=lfs merge=lfs -text
66
+ examples/callhome_spa_restored48k_step78000.wav filter=lfs diff=lfs merge=lfs -text
67
+ examples/callhome_zho_restored48k_step78000.wav filter=lfs diff=lfs merge=lfs -text
68
+ examples/malaysian1_restored48k_step78000.wav filter=lfs diff=lfs merge=lfs -text
69
+ examples/malaysian2_restored48k_step78000.wav filter=lfs diff=lfs merge=lfs -text
70
+ examples/callhome_deu_restored48k_step94000.wav filter=lfs diff=lfs merge=lfs -text
71
+ examples/callhome_eng_restored48k_step94000.wav filter=lfs diff=lfs merge=lfs -text
72
+ examples/callhome_jpn_restored48k_step94000.wav filter=lfs diff=lfs merge=lfs -text
73
+ examples/callhome_spa_restored48k_step94000.wav filter=lfs diff=lfs merge=lfs -text
74
+ examples/callhome_zho_restored48k_step94000.wav filter=lfs diff=lfs merge=lfs -text
75
+ examples/malaysian1_restored48k_step94000.wav filter=lfs diff=lfs merge=lfs -text
76
+ examples/malaysian2_restored48k_step94000.wav filter=lfs diff=lfs merge=lfs -text
77
+ examples/callhome_deu_restored48k_step108000.wav filter=lfs diff=lfs merge=lfs -text
78
+ examples/callhome_eng_restored48k_step108000.wav filter=lfs diff=lfs merge=lfs -text
79
+ examples/callhome_jpn_restored48k_step108000.wav filter=lfs diff=lfs merge=lfs -text
80
+ examples/callhome_spa_restored48k_step108000.wav filter=lfs diff=lfs merge=lfs -text
81
+ examples/callhome_zho_restored48k_step108000.wav filter=lfs diff=lfs merge=lfs -text
82
+ examples/malaysian1_restored48k_step108000.wav filter=lfs diff=lfs merge=lfs -text
83
+ examples/malaysian2_restored48k_step108000.wav filter=lfs diff=lfs merge=lfs -text
84
+ examples/callhome_deu_restored48k_step120000.wav filter=lfs diff=lfs merge=lfs -text
85
+ examples/callhome_eng_restored48k_step120000.wav filter=lfs diff=lfs merge=lfs -text
86
+ examples/callhome_jpn_restored48k_step120000.wav filter=lfs diff=lfs merge=lfs -text
87
+ examples/callhome_spa_restored48k_step120000.wav filter=lfs diff=lfs merge=lfs -text
88
+ examples/callhome_zho_restored48k_step120000.wav filter=lfs diff=lfs merge=lfs -text
89
+ examples/malaysian1_restored48k_step120000.wav filter=lfs diff=lfs merge=lfs -text
90
+ examples/malaysian2_restored48k_step120000.wav filter=lfs diff=lfs merge=lfs -text
91
+ examples/callhome_deu_restored48k_step132000.wav filter=lfs diff=lfs merge=lfs -text
92
+ examples/callhome_eng_restored48k_step132000.wav filter=lfs diff=lfs merge=lfs -text
93
+ examples/callhome_jpn_restored48k_step132000.wav filter=lfs diff=lfs merge=lfs -text
94
+ examples/callhome_spa_restored48k_step132000.wav filter=lfs diff=lfs merge=lfs -text
95
+ examples/callhome_zho_restored48k_step132000.wav filter=lfs diff=lfs merge=lfs -text
96
+ examples/malaysian1_restored48k_step132000.wav filter=lfs diff=lfs merge=lfs -text
97
+ examples/malaysian2_restored48k_step132000.wav filter=lfs diff=lfs merge=lfs -text
98
+ examples/callhome_deu_restored48k_step144000.wav filter=lfs diff=lfs merge=lfs -text
99
+ examples/callhome_eng_restored48k_step144000.wav filter=lfs diff=lfs merge=lfs -text
100
+ examples/callhome_jpn_restored48k_step144000.wav filter=lfs diff=lfs merge=lfs -text
101
+ examples/callhome_spa_restored48k_step144000.wav filter=lfs diff=lfs merge=lfs -text
102
+ examples/callhome_zho_restored48k_step144000.wav filter=lfs diff=lfs merge=lfs -text
103
+ examples/malaysian1_restored48k_step144000.wav filter=lfs diff=lfs merge=lfs -text
104
+ examples/malaysian2_restored48k_step144000.wav filter=lfs diff=lfs merge=lfs -text
105
+ examples/callhome_deu_restored48k_step148000.wav filter=lfs diff=lfs merge=lfs -text
106
+ examples/callhome_eng_restored48k_step148000.wav filter=lfs diff=lfs merge=lfs -text
107
+ examples/callhome_jpn_restored48k_step148000.wav filter=lfs diff=lfs merge=lfs -text
108
+ examples/callhome_spa_restored48k_step148000.wav filter=lfs diff=lfs merge=lfs -text
109
+ examples/callhome_zho_restored48k_step148000.wav filter=lfs diff=lfs merge=lfs -text
110
+ examples/malaysian1_restored48k_step148000.wav filter=lfs diff=lfs merge=lfs -text
111
+ examples/malaysian2_restored48k_step148000.wav filter=lfs diff=lfs merge=lfs -text
112
+ examples/callhome_deu_restored48k_step158000.wav filter=lfs diff=lfs merge=lfs -text
113
+ examples/callhome_eng_restored48k_step158000.wav filter=lfs diff=lfs merge=lfs -text
114
+ examples/callhome_jpn_restored48k_step158000.wav filter=lfs diff=lfs merge=lfs -text
115
+ examples/callhome_spa_restored48k_step158000.wav filter=lfs diff=lfs merge=lfs -text
116
+ examples/callhome_zho_restored48k_step158000.wav filter=lfs diff=lfs merge=lfs -text
117
+ examples/malaysian1_restored48k_step158000.wav filter=lfs diff=lfs merge=lfs -text
118
+ examples/malaysian2_restored48k_step158000.wav filter=lfs diff=lfs merge=lfs -text
119
+ examples/callhome_deu_restored48k_step168000.wav filter=lfs diff=lfs merge=lfs -text
120
+ examples/callhome_eng_restored48k_step168000.wav filter=lfs diff=lfs merge=lfs -text
121
+ examples/callhome_jpn_restored48k_step168000.wav filter=lfs diff=lfs merge=lfs -text
122
+ examples/callhome_spa_restored48k_step168000.wav filter=lfs diff=lfs merge=lfs -text
123
+ examples/callhome_zho_restored48k_step168000.wav filter=lfs diff=lfs merge=lfs -text
124
+ examples/malaysian1_restored48k_step168000.wav filter=lfs diff=lfs merge=lfs -text
125
+ examples/malaysian2_restored48k_step168000.wav filter=lfs diff=lfs merge=lfs -text
126
+ examples/callhome_deu_restored48k_step180000.wav filter=lfs diff=lfs merge=lfs -text
127
+ examples/callhome_eng_restored48k_step180000.wav filter=lfs diff=lfs merge=lfs -text
128
+ examples/callhome_jpn_restored48k_step180000.wav filter=lfs diff=lfs merge=lfs -text
129
+ examples/callhome_spa_restored48k_step180000.wav filter=lfs diff=lfs merge=lfs -text
130
+ examples/callhome_zho_restored48k_step180000.wav filter=lfs diff=lfs merge=lfs -text
131
+ examples/malaysian1_restored48k_step180000.wav filter=lfs diff=lfs merge=lfs -text
132
+ examples/malaysian2_restored48k_step180000.wav filter=lfs diff=lfs merge=lfs -text
133
+ examples/callhome_deu_restored48k_step194000.wav filter=lfs diff=lfs merge=lfs -text
134
+ examples/callhome_eng_restored48k_step194000.wav filter=lfs diff=lfs merge=lfs -text
135
+ examples/callhome_jpn_restored48k_step194000.wav filter=lfs diff=lfs merge=lfs -text
136
+ examples/callhome_spa_restored48k_step194000.wav filter=lfs diff=lfs merge=lfs -text
137
+ examples/callhome_zho_restored48k_step194000.wav filter=lfs diff=lfs merge=lfs -text
138
+ examples/malaysian1_restored48k_step194000.wav filter=lfs diff=lfs merge=lfs -text
139
+ examples/malaysian2_restored48k_step194000.wav filter=lfs diff=lfs merge=lfs -text
140
+ examples/callhome_deu_restored48k_step212000.wav filter=lfs diff=lfs merge=lfs -text
141
+ examples/callhome_eng_restored48k_step212000.wav filter=lfs diff=lfs merge=lfs -text
142
+ examples/callhome_jpn_restored48k_step212000.wav filter=lfs diff=lfs merge=lfs -text
143
+ examples/callhome_spa_restored48k_step212000.wav filter=lfs diff=lfs merge=lfs -text
144
+ examples/callhome_zho_restored48k_step212000.wav filter=lfs diff=lfs merge=lfs -text
145
+ examples/malaysian1_restored48k_step212000.wav filter=lfs diff=lfs merge=lfs -text
146
+ examples/malaysian2_restored48k_step212000.wav filter=lfs diff=lfs merge=lfs -text
147
+ examples/callhome_deu_restored48k_step226000.wav filter=lfs diff=lfs merge=lfs -text
148
+ examples/callhome_eng_restored48k_step226000.wav filter=lfs diff=lfs merge=lfs -text
149
+ examples/callhome_jpn_restored48k_step226000.wav filter=lfs diff=lfs merge=lfs -text
150
+ examples/callhome_spa_restored48k_step226000.wav filter=lfs diff=lfs merge=lfs -text
151
+ examples/callhome_zho_restored48k_step226000.wav filter=lfs diff=lfs merge=lfs -text
152
+ examples/malaysian1_restored48k_step226000.wav filter=lfs diff=lfs merge=lfs -text
153
+ examples/malaysian2_restored48k_step226000.wav filter=lfs diff=lfs merge=lfs -text
154
+ examples/callhome_deu_restored48k_step242000.wav filter=lfs diff=lfs merge=lfs -text
155
+ examples/callhome_eng_restored48k_step242000.wav filter=lfs diff=lfs merge=lfs -text
156
+ examples/callhome_jpn_restored48k_step242000.wav filter=lfs diff=lfs merge=lfs -text
157
+ examples/callhome_spa_restored48k_step242000.wav filter=lfs diff=lfs merge=lfs -text
158
+ examples/callhome_zho_restored48k_step242000.wav filter=lfs diff=lfs merge=lfs -text
159
+ examples/malaysian1_restored48k_step242000.wav filter=lfs diff=lfs merge=lfs -text
160
+ examples/malaysian2_restored48k_step242000.wav filter=lfs diff=lfs merge=lfs -text
161
+ examples/malaysian3_restored48k_step242000.wav filter=lfs diff=lfs merge=lfs -text
162
+ examples/malaysian4_restored48k_step242000.wav filter=lfs diff=lfs merge=lfs -text
163
+ examples/callhome_deu_restored48k_step262000.wav filter=lfs diff=lfs merge=lfs -text
164
+ examples/callhome_eng_restored48k_step262000.wav filter=lfs diff=lfs merge=lfs -text
165
+ examples/callhome_jpn_restored48k_step262000.wav filter=lfs diff=lfs merge=lfs -text
166
+ examples/callhome_spa_restored48k_step262000.wav filter=lfs diff=lfs merge=lfs -text
167
+ examples/callhome_zho_restored48k_step262000.wav filter=lfs diff=lfs merge=lfs -text
168
+ examples/malaysian1_restored48k_step262000.wav filter=lfs diff=lfs merge=lfs -text
169
+ examples/malaysian2_restored48k_step262000.wav filter=lfs diff=lfs merge=lfs -text
170
+ examples/malaysian3_restored48k_step262000.wav filter=lfs diff=lfs merge=lfs -text
171
+ examples/malaysian4_restored48k_step262000.wav filter=lfs diff=lfs merge=lfs -text
172
+ examples/callhome_deu_restored48k_step286000.wav filter=lfs diff=lfs merge=lfs -text
173
+ examples/callhome_eng_restored48k_step286000.wav filter=lfs diff=lfs merge=lfs -text
174
+ examples/callhome_jpn_restored48k_step286000.wav filter=lfs diff=lfs merge=lfs -text
175
+ examples/callhome_spa_restored48k_step286000.wav filter=lfs diff=lfs merge=lfs -text
176
+ examples/callhome_zho_restored48k_step286000.wav filter=lfs diff=lfs merge=lfs -text
177
+ examples/malaysian1_restored48k_step286000.wav filter=lfs diff=lfs merge=lfs -text
178
+ examples/malaysian2_restored48k_step286000.wav filter=lfs diff=lfs merge=lfs -text
179
+ examples/malaysian3_restored48k_step286000.wav filter=lfs diff=lfs merge=lfs -text
180
+ examples/malaysian4_restored48k_step286000.wav filter=lfs diff=lfs merge=lfs -text
181
+ examples/callhome_deu_restored48k_step310000.wav filter=lfs diff=lfs merge=lfs -text
182
+ examples/callhome_eng_restored48k_step310000.wav filter=lfs diff=lfs merge=lfs -text
183
+ examples/callhome_jpn_restored48k_step310000.wav filter=lfs diff=lfs merge=lfs -text
184
+ examples/callhome_spa_restored48k_step310000.wav filter=lfs diff=lfs merge=lfs -text
185
+ examples/callhome_zho_restored48k_step310000.wav filter=lfs diff=lfs merge=lfs -text
186
+ examples/malaysian1_restored48k_step310000.wav filter=lfs diff=lfs merge=lfs -text
187
+ examples/malaysian2_restored48k_step310000.wav filter=lfs diff=lfs merge=lfs -text
188
+ examples/malaysian3_restored48k_step310000.wav filter=lfs diff=lfs merge=lfs -text
189
+ examples/malaysian4_restored48k_step310000.wav filter=lfs diff=lfs merge=lfs -text
190
+ examples/callhome_deu_restored48k_step332000.wav filter=lfs diff=lfs merge=lfs -text
191
+ examples/callhome_eng_restored48k_step332000.wav filter=lfs diff=lfs merge=lfs -text
192
+ examples/callhome_jpn_restored48k_step332000.wav filter=lfs diff=lfs merge=lfs -text
193
+ examples/callhome_spa_restored48k_step332000.wav filter=lfs diff=lfs merge=lfs -text
194
+ examples/callhome_zho_restored48k_step332000.wav filter=lfs diff=lfs merge=lfs -text
195
+ examples/malaysian1_restored48k_step332000.wav filter=lfs diff=lfs merge=lfs -text
196
+ examples/malaysian2_restored48k_step332000.wav filter=lfs diff=lfs merge=lfs -text
197
+ examples/malaysian3_restored48k_step332000.wav filter=lfs diff=lfs merge=lfs -text
198
+ examples/malaysian4_restored48k_step332000.wav filter=lfs diff=lfs merge=lfs -text
199
+ examples/callhome_deu_restored48k_step342000.wav filter=lfs diff=lfs merge=lfs -text
200
+ examples/callhome_eng_restored48k_step342000.wav filter=lfs diff=lfs merge=lfs -text
201
+ examples/callhome_jpn_restored48k_step342000.wav filter=lfs diff=lfs merge=lfs -text
202
+ examples/callhome_spa_restored48k_step342000.wav filter=lfs diff=lfs merge=lfs -text
203
+ examples/callhome_zho_restored48k_step342000.wav filter=lfs diff=lfs merge=lfs -text
204
+ examples/malaysian1_restored48k_step342000.wav filter=lfs diff=lfs merge=lfs -text
205
+ examples/malaysian2_restored48k_step342000.wav filter=lfs diff=lfs merge=lfs -text
206
+ examples/malaysian3_restored48k_step342000.wav filter=lfs diff=lfs merge=lfs -text
207
+ examples/malaysian4_restored48k_step342000.wav filter=lfs diff=lfs merge=lfs -text
208
+ examples/callhome_deu_restored48k_step356000.wav filter=lfs diff=lfs merge=lfs -text
209
+ examples/callhome_eng_restored48k_step356000.wav filter=lfs diff=lfs merge=lfs -text
210
+ examples/callhome_jpn_restored48k_step356000.wav filter=lfs diff=lfs merge=lfs -text
211
+ examples/callhome_spa_restored48k_step356000.wav filter=lfs diff=lfs merge=lfs -text
212
+ examples/callhome_zho_restored48k_step356000.wav filter=lfs diff=lfs merge=lfs -text
213
+ examples/malaysian1_restored48k_step356000.wav filter=lfs diff=lfs merge=lfs -text
214
+ examples/malaysian2_restored48k_step356000.wav filter=lfs diff=lfs merge=lfs -text
215
+ examples/malaysian3_restored48k_step356000.wav filter=lfs diff=lfs merge=lfs -text
216
+ examples/malaysian4_restored48k_step356000.wav filter=lfs diff=lfs merge=lfs -text
217
+ examples/callhome_deu_restored48k_step382000.wav filter=lfs diff=lfs merge=lfs -text
218
+ examples/callhome_eng_restored48k_step382000.wav filter=lfs diff=lfs merge=lfs -text
219
+ examples/callhome_jpn_restored48k_step382000.wav filter=lfs diff=lfs merge=lfs -text
220
+ examples/callhome_spa_restored48k_step382000.wav filter=lfs diff=lfs merge=lfs -text
221
+ examples/callhome_zho_restored48k_step382000.wav filter=lfs diff=lfs merge=lfs -text
222
+ examples/malaysian1_restored48k_step382000.wav filter=lfs diff=lfs merge=lfs -text
223
+ examples/malaysian2_restored48k_step382000.wav filter=lfs diff=lfs merge=lfs -text
224
+ examples/malaysian3_restored48k_step382000.wav filter=lfs diff=lfs merge=lfs -text
225
+ examples/malaysian4_restored48k_step382000.wav filter=lfs diff=lfs merge=lfs -text
226
+ examples/callhome_deu_restored48k_step392000.wav filter=lfs diff=lfs merge=lfs -text
227
+ examples/callhome_eng_restored48k_step392000.wav filter=lfs diff=lfs merge=lfs -text
228
+ examples/callhome_jpn_restored48k_step392000.wav filter=lfs diff=lfs merge=lfs -text
229
+ examples/callhome_spa_restored48k_step392000.wav filter=lfs diff=lfs merge=lfs -text
230
+ examples/callhome_zho_restored48k_step392000.wav filter=lfs diff=lfs merge=lfs -text
231
+ examples/malaysian1_restored48k_step392000.wav filter=lfs diff=lfs merge=lfs -text
232
+ examples/malaysian2_restored48k_step392000.wav filter=lfs diff=lfs merge=lfs -text
233
+ examples/malaysian3_restored48k_step392000.wav filter=lfs diff=lfs merge=lfs -text
234
+ examples/malaysian4_restored48k_step392000.wav filter=lfs diff=lfs merge=lfs -text
235
+ examples/callhome_deu_restored48k_step408000.wav filter=lfs diff=lfs merge=lfs -text
236
+ examples/callhome_eng_restored48k_step408000.wav filter=lfs diff=lfs merge=lfs -text
237
+ examples/callhome_jpn_restored48k_step408000.wav filter=lfs diff=lfs merge=lfs -text
238
+ examples/callhome_spa_restored48k_step408000.wav filter=lfs diff=lfs merge=lfs -text
239
+ examples/callhome_zho_restored48k_step408000.wav filter=lfs diff=lfs merge=lfs -text
240
+ examples/malaysian1_restored48k_step408000.wav filter=lfs diff=lfs merge=lfs -text
241
+ examples/malaysian2_restored48k_step408000.wav filter=lfs diff=lfs merge=lfs -text
242
+ examples/malaysian3_restored48k_step408000.wav filter=lfs diff=lfs merge=lfs -text
243
+ examples/malaysian4_restored48k_step408000.wav filter=lfs diff=lfs merge=lfs -text
244
+ examples/callhome_deu_restored48k_step432000.wav filter=lfs diff=lfs merge=lfs -text
245
+ examples/callhome_eng_restored48k_step432000.wav filter=lfs diff=lfs merge=lfs -text
246
+ examples/callhome_jpn_restored48k_step432000.wav filter=lfs diff=lfs merge=lfs -text
247
+ examples/callhome_spa_restored48k_step432000.wav filter=lfs diff=lfs merge=lfs -text
248
+ examples/callhome_zho_restored48k_step432000.wav filter=lfs diff=lfs merge=lfs -text
249
+ examples/malaysian1_restored48k_step432000.wav filter=lfs diff=lfs merge=lfs -text
250
+ examples/malaysian2_restored48k_step432000.wav filter=lfs diff=lfs merge=lfs -text
251
+ examples/malaysian3_restored48k_step432000.wav filter=lfs diff=lfs merge=lfs -text
252
+ examples/malaysian4_restored48k_step432000.wav filter=lfs diff=lfs merge=lfs -text
253
+ examples/callhome_deu_restored48k_step444000.wav filter=lfs diff=lfs merge=lfs -text
254
+ examples/callhome_eng_restored48k_step444000.wav filter=lfs diff=lfs merge=lfs -text
255
+ examples/callhome_jpn_restored48k_step444000.wav filter=lfs diff=lfs merge=lfs -text
256
+ examples/callhome_spa_restored48k_step444000.wav filter=lfs diff=lfs merge=lfs -text
257
+ examples/callhome_zho_restored48k_step444000.wav filter=lfs diff=lfs merge=lfs -text
258
+ examples/malaysian1_restored48k_step444000.wav filter=lfs diff=lfs merge=lfs -text
259
+ examples/malaysian2_restored48k_step444000.wav filter=lfs diff=lfs merge=lfs -text
260
+ examples/malaysian3_restored48k_step444000.wav filter=lfs diff=lfs merge=lfs -text
261
+ examples/malaysian4_restored48k_step444000.wav filter=lfs diff=lfs merge=lfs -text
262
+ examples/callhome_deu_restored48k_step458000.wav filter=lfs diff=lfs merge=lfs -text
263
+ examples/callhome_eng_restored48k_step458000.wav filter=lfs diff=lfs merge=lfs -text
264
+ examples/callhome_jpn_restored48k_step458000.wav filter=lfs diff=lfs merge=lfs -text
265
+ examples/callhome_spa_restored48k_step458000.wav filter=lfs diff=lfs merge=lfs -text
266
+ examples/callhome_zho_restored48k_step458000.wav filter=lfs diff=lfs merge=lfs -text
267
+ examples/malaysian1_restored48k_step458000.wav filter=lfs diff=lfs merge=lfs -text
268
+ examples/malaysian2_restored48k_step458000.wav filter=lfs diff=lfs merge=lfs -text
269
+ examples/malaysian3_restored48k_step458000.wav filter=lfs diff=lfs merge=lfs -text
270
+ examples/malaysian4_restored48k_step458000.wav filter=lfs diff=lfs merge=lfs -text
271
+ examples/callhome_deu_restored48k_step484000.wav filter=lfs diff=lfs merge=lfs -text
272
+ examples/callhome_eng_restored48k_step484000.wav filter=lfs diff=lfs merge=lfs -text
273
+ examples/callhome_jpn_restored48k_step484000.wav filter=lfs diff=lfs merge=lfs -text
274
+ examples/callhome_spa_restored48k_step484000.wav filter=lfs diff=lfs merge=lfs -text
275
+ examples/callhome_zho_restored48k_step484000.wav filter=lfs diff=lfs merge=lfs -text
276
+ examples/malaysian1_restored48k_step484000.wav filter=lfs diff=lfs merge=lfs -text
277
+ examples/malaysian2_restored48k_step484000.wav filter=lfs diff=lfs merge=lfs -text
278
+ examples/malaysian3_restored48k_step484000.wav filter=lfs diff=lfs merge=lfs -text
279
+ examples/malaysian4_restored48k_step484000.wav filter=lfs diff=lfs merge=lfs -text
280
+ examples/callhome_deu_restored48k_step492000.wav filter=lfs diff=lfs merge=lfs -text
281
+ examples/callhome_eng_restored48k_step492000.wav filter=lfs diff=lfs merge=lfs -text
282
+ examples/callhome_jpn_restored48k_step492000.wav filter=lfs diff=lfs merge=lfs -text
283
+ examples/callhome_spa_restored48k_step492000.wav filter=lfs diff=lfs merge=lfs -text
284
+ examples/callhome_zho_restored48k_step492000.wav filter=lfs diff=lfs merge=lfs -text
285
+ examples/malaysian1_restored48k_step492000.wav filter=lfs diff=lfs merge=lfs -text
286
+ examples/malaysian2_restored48k_step492000.wav filter=lfs diff=lfs merge=lfs -text
287
+ examples/malaysian3_restored48k_step492000.wav filter=lfs diff=lfs merge=lfs -text
288
+ examples/malaysian4_restored48k_step492000.wav filter=lfs diff=lfs merge=lfs -text
289
+ examples/callhome_deu_restored48k_step500000.wav filter=lfs diff=lfs merge=lfs -text
290
+ examples/callhome_eng_restored48k_step500000.wav filter=lfs diff=lfs merge=lfs -text
291
+ examples/callhome_jpn_restored48k_step500000.wav filter=lfs diff=lfs merge=lfs -text
292
+ examples/callhome_spa_restored48k_step500000.wav filter=lfs diff=lfs merge=lfs -text
293
+ examples/callhome_zho_restored48k_step500000.wav filter=lfs diff=lfs merge=lfs -text
294
+ examples/malaysian1_restored48k_step500000.wav filter=lfs diff=lfs merge=lfs -text
295
+ examples/malaysian2_restored48k_step500000.wav filter=lfs diff=lfs merge=lfs -text
296
+ examples/malaysian3_restored48k_step500000.wav filter=lfs diff=lfs merge=lfs -text
297
+ examples/malaysian4_restored48k_step500000.wav filter=lfs diff=lfs merge=lfs -text
298
+ assets/callcentre_cer.png filter=lfs diff=lfs merge=lfs -text
299
+ ab_degrade_eb/00_\#5[[:space:]]Music,[[:space:]]Life,[[:space:]]and[[:space:]]Love[[:space:]](ft.[[:space:]]SoImJenn[[:space:]]&_base.wav filter=lfs diff=lfs merge=lfs -text
300
+ ab_degrade_eb/00_\#5[[:space:]]Music,[[:space:]]Life,[[:space:]]and[[:space:]]Love[[:space:]](ft.[[:space:]]SoImJenn[[:space:]]&_clean.wav filter=lfs diff=lfs merge=lfs -text
301
+ ab_degrade_eb/00_\#5[[:space:]]Music,[[:space:]]Life,[[:space:]]and[[:space:]]Love[[:space:]](ft.[[:space:]]SoImJenn[[:space:]]&_hard1.wav filter=lfs diff=lfs merge=lfs -text
302
+ ab_degrade_eb/00_\#5[[:space:]]Music,[[:space:]]Life,[[:space:]]and[[:space:]]Love[[:space:]](ft.[[:space:]]SoImJenn[[:space:]]&_hard2.wav filter=lfs diff=lfs merge=lfs -text
303
+ ab_degrade_eb/01_rainbow_08_highpitch_base.wav filter=lfs diff=lfs merge=lfs -text
304
+ ab_degrade_eb/01_rainbow_08_highpitch_clean.wav filter=lfs diff=lfs merge=lfs -text
305
+ ab_degrade_eb/01_rainbow_08_highpitch_hard1.wav filter=lfs diff=lfs merge=lfs -text
306
+ ab_degrade_eb/01_rainbow_08_highpitch_hard2.wav filter=lfs diff=lfs merge=lfs -text
307
+ ab_degrade_eb/02_TechinAsia[[:space:]]in[[:space:]]KL,[[:space:]]Sarawak[[:space:]]forging[[:space:]]ahead,_base.wav filter=lfs diff=lfs merge=lfs -text
308
+ ab_degrade_eb/02_TechinAsia[[:space:]]in[[:space:]]KL,[[:space:]]Sarawak[[:space:]]forging[[:space:]]ahead,_clean.wav filter=lfs diff=lfs merge=lfs -text
309
+ ab_degrade_eb/02_TechinAsia[[:space:]]in[[:space:]]KL,[[:space:]]Sarawak[[:space:]]forging[[:space:]]ahead,_hard1.wav filter=lfs diff=lfs merge=lfs -text
310
+ ab_degrade_eb/02_TechinAsia[[:space:]]in[[:space:]]KL,[[:space:]]Sarawak[[:space:]]forging[[:space:]]ahead,_hard2.wav filter=lfs diff=lfs merge=lfs -text
311
+ ab_degrade_eb/03_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]Ep.3[[:space:]](Part[[:space:]]2)_base.wav filter=lfs diff=lfs merge=lfs -text
312
+ ab_degrade_eb/03_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]Ep.3[[:space:]](Part[[:space:]]2)_clean.wav filter=lfs diff=lfs merge=lfs -text
313
+ ab_degrade_eb/03_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]Ep.3[[:space:]](Part[[:space:]]2)_hard1.wav filter=lfs diff=lfs merge=lfs -text
314
+ ab_degrade_eb/03_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]Ep.3[[:space:]](Part[[:space:]]2)_hard2.wav filter=lfs diff=lfs merge=lfs -text
315
+ ab_degrade_eb/04_EP15[[:space:]]|[[:space:]]Kenapa[[:space:]]Melayu[[:space:]]Tak[[:space:]]Suka[[:space:]]DAP?,[[:space:]]OKM[[:space:]]_base.wav filter=lfs diff=lfs merge=lfs -text
316
+ ab_degrade_eb/04_EP15[[:space:]]|[[:space:]]Kenapa[[:space:]]Melayu[[:space:]]Tak[[:space:]]Suka[[:space:]]DAP?,[[:space:]]OKM[[:space:]]_clean.wav filter=lfs diff=lfs merge=lfs -text
317
+ ab_degrade_eb/04_EP15[[:space:]]|[[:space:]]Kenapa[[:space:]]Melayu[[:space:]]Tak[[:space:]]Suka[[:space:]]DAP?,[[:space:]]OKM[[:space:]]_hard1.wav filter=lfs diff=lfs merge=lfs -text
318
+ ab_degrade_eb/04_EP15[[:space:]]|[[:space:]]Kenapa[[:space:]]Melayu[[:space:]]Tak[[:space:]]Suka[[:space:]]DAP?,[[:space:]]OKM[[:space:]]_hard2.wav filter=lfs diff=lfs merge=lfs -text
319
+ ab_degrade_eb/05_\[PART[[:space:]]1\][[:space:]]Telling[[:space:]]My[[:space:]]Children[[:space:]]I[[:space:]]Don't[[:space:]]Hav_base.wav filter=lfs diff=lfs merge=lfs -text
320
+ ab_degrade_eb/05_\[PART[[:space:]]1\][[:space:]]Telling[[:space:]]My[[:space:]]Children[[:space:]]I[[:space:]]Don't[[:space:]]Hav_clean.wav filter=lfs diff=lfs merge=lfs -text
321
+ ab_degrade_eb/05_\[PART[[:space:]]1\][[:space:]]Telling[[:space:]]My[[:space:]]Children[[:space:]]I[[:space:]]Don't[[:space:]]Hav_hard1.wav filter=lfs diff=lfs merge=lfs -text
322
+ ab_degrade_eb/05_\[PART[[:space:]]1\][[:space:]]Telling[[:space:]]My[[:space:]]Children[[:space:]]I[[:space:]]Don't[[:space:]]Hav_hard2.wav filter=lfs diff=lfs merge=lfs -text
323
+ ab_degrade_eb/06_\#13[[:space:]]Speaking[[:space:]]Up[[:space:]]Against[[:space:]]Sexual[[:space:]]Harassmen_base.wav filter=lfs diff=lfs merge=lfs -text
324
+ ab_degrade_eb/06_\#13[[:space:]]Speaking[[:space:]]Up[[:space:]]Against[[:space:]]Sexual[[:space:]]Harassmen_clean.wav filter=lfs diff=lfs merge=lfs -text
325
+ ab_degrade_eb/06_\#13[[:space:]]Speaking[[:space:]]Up[[:space:]]Against[[:space:]]Sexual[[:space:]]Harassmen_hard1.wav filter=lfs diff=lfs merge=lfs -text
326
+ ab_degrade_eb/06_\#13[[:space:]]Speaking[[:space:]]Up[[:space:]]Against[[:space:]]Sexual[[:space:]]Harassmen_hard2.wav filter=lfs diff=lfs merge=lfs -text
327
+ ab_degrade_eb/07_Seni[[:space:]]bela[[:space:]]diri[[:space:]]wajib[[:space:]]ada[[:space:]]setiap[[:space:]]individu_base.wav filter=lfs diff=lfs merge=lfs -text
328
+ ab_degrade_eb/07_Seni[[:space:]]bela[[:space:]]diri[[:space:]]wajib[[:space:]]ada[[:space:]]setiap[[:space:]]individu_clean.wav filter=lfs diff=lfs merge=lfs -text
329
+ ab_degrade_eb/07_Seni[[:space:]]bela[[:space:]]diri[[:space:]]wajib[[:space:]]ada[[:space:]]setiap[[:space:]]individu_hard1.wav filter=lfs diff=lfs merge=lfs -text
330
+ ab_degrade_eb/07_Seni[[:space:]]bela[[:space:]]diri[[:space:]]wajib[[:space:]]ada[[:space:]]setiap[[:space:]]individu_hard2.wav filter=lfs diff=lfs merge=lfs -text
331
+ ab_degrade_eb/08_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]EP48[[:space:]]-[[:space:]]Letchu_base.wav filter=lfs diff=lfs merge=lfs -text
332
+ ab_degrade_eb/08_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]EP48[[:space:]]-[[:space:]]Letchu_clean.wav filter=lfs diff=lfs merge=lfs -text
333
+ ab_degrade_eb/08_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]EP48[[:space:]]-[[:space:]]Letchu_hard1.wav filter=lfs diff=lfs merge=lfs -text
334
+ ab_degrade_eb/08_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]EP48[[:space:]]-[[:space:]]Letchu_hard2.wav filter=lfs diff=lfs merge=lfs -text
335
+ ab_degrade_eb/09_Bell[[:space:]]Ngasri[[:space:]]-[[:space:]]OKLETSGO[[:space:]]Video[[:space:]]Podcast[[:space:]](Pa_base.wav filter=lfs diff=lfs merge=lfs -text
336
+ ab_degrade_eb/09_Bell[[:space:]]Ngasri[[:space:]]-[[:space:]]OKLETSGO[[:space:]]Video[[:space:]]Podcast[[:space:]](Pa_clean.wav filter=lfs diff=lfs merge=lfs -text
337
+ ab_degrade_eb/09_Bell[[:space:]]Ngasri[[:space:]]-[[:space:]]OKLETSGO[[:space:]]Video[[:space:]]Podcast[[:space:]](Pa_hard1.wav filter=lfs diff=lfs merge=lfs -text
338
+ ab_degrade_eb/09_Bell[[:space:]]Ngasri[[:space:]]-[[:space:]]OKLETSGO[[:space:]]Video[[:space:]]Podcast[[:space:]](Pa_hard2.wav filter=lfs diff=lfs merge=lfs -text
339
+ ab_degrade_eb/10_Are[[:space:]]labels[[:space:]]important[[:space:]]in[[:space:]]relationships?[[:space:]]|_base.wav filter=lfs diff=lfs merge=lfs -text
340
+ ab_degrade_eb/10_Are[[:space:]]labels[[:space:]]important[[:space:]]in[[:space:]]relationships?[[:space:]]|_clean.wav filter=lfs diff=lfs merge=lfs -text
341
+ ab_degrade_eb/10_Are[[:space:]]labels[[:space:]]important[[:space:]]in[[:space:]]relationships?[[:space:]]|_hard1.wav filter=lfs diff=lfs merge=lfs -text
342
+ ab_degrade_eb/10_Are[[:space:]]labels[[:space:]]important[[:space:]]in[[:space:]]relationships?[[:space:]]|_hard2.wav filter=lfs diff=lfs merge=lfs -text
343
+ ab_degrade_eb/11_rainbow_03_fast_base.wav filter=lfs diff=lfs merge=lfs -text
344
+ ab_degrade_eb/11_rainbow_03_fast_clean.wav filter=lfs diff=lfs merge=lfs -text
345
+ ab_degrade_eb/11_rainbow_03_fast_hard1.wav filter=lfs diff=lfs merge=lfs -text
346
+ ab_degrade_eb/11_rainbow_03_fast_hard2.wav filter=lfs diff=lfs merge=lfs -text
347
+ ab_degrade_eb2/00_\#5[[:space:]]Music,[[:space:]]Life,[[:space:]]and[[:space:]]Love[[:space:]](ft.[[:space:]]SoImJenn[[:space:]]&_base.wav filter=lfs diff=lfs merge=lfs -text
348
+ ab_degrade_eb2/00_\#5[[:space:]]Music,[[:space:]]Life,[[:space:]]and[[:space:]]Love[[:space:]](ft.[[:space:]]SoImJenn[[:space:]]&_clean.wav filter=lfs diff=lfs merge=lfs -text
349
+ ab_degrade_eb2/00_\#5[[:space:]]Music,[[:space:]]Life,[[:space:]]and[[:space:]]Love[[:space:]](ft.[[:space:]]SoImJenn[[:space:]]&_hard1.wav filter=lfs diff=lfs merge=lfs -text
350
+ ab_degrade_eb2/00_\#5[[:space:]]Music,[[:space:]]Life,[[:space:]]and[[:space:]]Love[[:space:]](ft.[[:space:]]SoImJenn[[:space:]]&_hard2.wav filter=lfs diff=lfs merge=lfs -text
351
+ ab_degrade_eb2/00_argentinian_es_000309_base.wav filter=lfs diff=lfs merge=lfs -text
352
+ ab_degrade_eb2/00_argentinian_es_000309_clean.wav filter=lfs diff=lfs merge=lfs -text
353
+ ab_degrade_eb2/00_argentinian_es_000309_hard1.wav filter=lfs diff=lfs merge=lfs -text
354
+ ab_degrade_eb2/00_argentinian_es_000309_hard2.wav filter=lfs diff=lfs merge=lfs -text
355
+ ab_degrade_eb2/01_rainbow_08_highpitch_base.wav filter=lfs diff=lfs merge=lfs -text
356
+ ab_degrade_eb2/01_rainbow_08_highpitch_clean.wav filter=lfs diff=lfs merge=lfs -text
357
+ ab_degrade_eb2/01_rainbow_08_highpitch_hard1.wav filter=lfs diff=lfs merge=lfs -text
358
+ ab_degrade_eb2/01_rainbow_08_highpitch_hard2.wav filter=lfs diff=lfs merge=lfs -text
359
+ ab_degrade_eb2/01_south_african_002577_base.wav filter=lfs diff=lfs merge=lfs -text
360
+ ab_degrade_eb2/01_south_african_002577_clean.wav filter=lfs diff=lfs merge=lfs -text
361
+ ab_degrade_eb2/01_south_african_002577_hard1.wav filter=lfs diff=lfs merge=lfs -text
362
+ ab_degrade_eb2/01_south_african_002577_hard2.wav filter=lfs diff=lfs merge=lfs -text
363
+ ab_degrade_eb2/02_TechinAsia[[:space:]]in[[:space:]]KL,[[:space:]]Sarawak[[:space:]]forging[[:space:]]ahead,_base.wav filter=lfs diff=lfs merge=lfs -text
364
+ ab_degrade_eb2/02_TechinAsia[[:space:]]in[[:space:]]KL,[[:space:]]Sarawak[[:space:]]forging[[:space:]]ahead,_clean.wav filter=lfs diff=lfs merge=lfs -text
365
+ ab_degrade_eb2/02_TechinAsia[[:space:]]in[[:space:]]KL,[[:space:]]Sarawak[[:space:]]forging[[:space:]]ahead,_hard1.wav filter=lfs diff=lfs merge=lfs -text
366
+ ab_degrade_eb2/02_TechinAsia[[:space:]]in[[:space:]]KL,[[:space:]]Sarawak[[:space:]]forging[[:space:]]ahead,_hard2.wav filter=lfs diff=lfs merge=lfs -text
367
+ ab_degrade_eb2/02_emo_neutral_freeform_base.wav filter=lfs diff=lfs merge=lfs -text
368
+ ab_degrade_eb2/02_emo_neutral_freeform_clean.wav filter=lfs diff=lfs merge=lfs -text
369
+ ab_degrade_eb2/02_emo_neutral_freeform_hard1.wav filter=lfs diff=lfs merge=lfs -text
370
+ ab_degrade_eb2/02_emo_neutral_freeform_hard2.wav filter=lfs diff=lfs merge=lfs -text
371
+ ab_degrade_eb2/03_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]Ep.3[[:space:]](Part[[:space:]]2)_base.wav filter=lfs diff=lfs merge=lfs -text
372
+ ab_degrade_eb2/03_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]Ep.3[[:space:]](Part[[:space:]]2)_clean.wav filter=lfs diff=lfs merge=lfs -text
373
+ ab_degrade_eb2/03_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]Ep.3[[:space:]](Part[[:space:]]2)_hard1.wav filter=lfs diff=lfs merge=lfs -text
374
+ ab_degrade_eb2/03_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]Ep.3[[:space:]](Part[[:space:]]2)_hard2.wav filter=lfs diff=lfs merge=lfs -text
375
+ ab_degrade_eb2/03_malayalam_001464_base.wav filter=lfs diff=lfs merge=lfs -text
376
+ ab_degrade_eb2/03_malayalam_001464_clean.wav filter=lfs diff=lfs merge=lfs -text
377
+ ab_degrade_eb2/03_malayalam_001464_hard1.wav filter=lfs diff=lfs merge=lfs -text
378
+ ab_degrade_eb2/03_malayalam_001464_hard2.wav filter=lfs diff=lfs merge=lfs -text
379
+ ab_degrade_eb2/04_EP15[[:space:]]|[[:space:]]Kenapa[[:space:]]Melayu[[:space:]]Tak[[:space:]]Suka[[:space:]]DAP?,[[:space:]]OKM[[:space:]]_base.wav filter=lfs diff=lfs merge=lfs -text
380
+ ab_degrade_eb2/04_EP15[[:space:]]|[[:space:]]Kenapa[[:space:]]Melayu[[:space:]]Tak[[:space:]]Suka[[:space:]]DAP?,[[:space:]]OKM[[:space:]]_clean.wav filter=lfs diff=lfs merge=lfs -text
381
+ ab_degrade_eb2/04_EP15[[:space:]]|[[:space:]]Kenapa[[:space:]]Melayu[[:space:]]Tak[[:space:]]Suka[[:space:]]DAP?,[[:space:]]OKM[[:space:]]_hard1.wav filter=lfs diff=lfs merge=lfs -text
382
+ ab_degrade_eb2/04_EP15[[:space:]]|[[:space:]]Kenapa[[:space:]]Melayu[[:space:]]Tak[[:space:]]Suka[[:space:]]DAP?,[[:space:]]OKM[[:space:]]_hard2.wav filter=lfs diff=lfs merge=lfs -text
383
+ ab_degrade_eb2/04_south_african_002209_base.wav filter=lfs diff=lfs merge=lfs -text
384
+ ab_degrade_eb2/04_south_african_002209_clean.wav filter=lfs diff=lfs merge=lfs -text
385
+ ab_degrade_eb2/04_south_african_002209_hard1.wav filter=lfs diff=lfs merge=lfs -text
386
+ ab_degrade_eb2/04_south_african_002209_hard2.wav filter=lfs diff=lfs merge=lfs -text
387
+ ab_degrade_eb2/05_\[PART[[:space:]]1\][[:space:]]Telling[[:space:]]My[[:space:]]Children[[:space:]]I[[:space:]]Don't[[:space:]]Hav_base.wav filter=lfs diff=lfs merge=lfs -text
388
+ ab_degrade_eb2/05_\[PART[[:space:]]1\][[:space:]]Telling[[:space:]]My[[:space:]]Children[[:space:]]I[[:space:]]Don't[[:space:]]Hav_clean.wav filter=lfs diff=lfs merge=lfs -text
389
+ ab_degrade_eb2/05_\[PART[[:space:]]1\][[:space:]]Telling[[:space:]]My[[:space:]]Children[[:space:]]I[[:space:]]Don't[[:space:]]Hav_hard1.wav filter=lfs diff=lfs merge=lfs -text
390
+ ab_degrade_eb2/05_\[PART[[:space:]]1\][[:space:]]Telling[[:space:]]My[[:space:]]Children[[:space:]]I[[:space:]]Don't[[:space:]]Hav_hard2.wav filter=lfs diff=lfs merge=lfs -text
391
+ ab_degrade_eb2/05_rainbow_02_slow_base.wav filter=lfs diff=lfs merge=lfs -text
392
+ ab_degrade_eb2/05_rainbow_02_slow_clean.wav filter=lfs diff=lfs merge=lfs -text
393
+ ab_degrade_eb2/05_rainbow_02_slow_hard1.wav filter=lfs diff=lfs merge=lfs -text
394
+ ab_degrade_eb2/05_rainbow_02_slow_hard2.wav filter=lfs diff=lfs merge=lfs -text
395
+ ab_degrade_eb2/06_\#13[[:space:]]Speaking[[:space:]]Up[[:space:]]Against[[:space:]]Sexual[[:space:]]Harassmen_base.wav filter=lfs diff=lfs merge=lfs -text
396
+ ab_degrade_eb2/06_\#13[[:space:]]Speaking[[:space:]]Up[[:space:]]Against[[:space:]]Sexual[[:space:]]Harassmen_clean.wav filter=lfs diff=lfs merge=lfs -text
397
+ ab_degrade_eb2/06_\#13[[:space:]]Speaking[[:space:]]Up[[:space:]]Against[[:space:]]Sexual[[:space:]]Harassmen_hard1.wav filter=lfs diff=lfs merge=lfs -text
398
+ ab_degrade_eb2/06_\#13[[:space:]]Speaking[[:space:]]Up[[:space:]]Against[[:space:]]Sexual[[:space:]]Harassmen_hard2.wav filter=lfs diff=lfs merge=lfs -text
399
+ ab_degrade_eb2/06_uk_ireland_en_011206_base.wav filter=lfs diff=lfs merge=lfs -text
400
+ ab_degrade_eb2/06_uk_ireland_en_011206_clean.wav filter=lfs diff=lfs merge=lfs -text
401
+ ab_degrade_eb2/06_uk_ireland_en_011206_hard1.wav filter=lfs diff=lfs merge=lfs -text
402
+ ab_degrade_eb2/06_uk_ireland_en_011206_hard2.wav filter=lfs diff=lfs merge=lfs -text
403
+ ab_degrade_eb2/07_Seni[[:space:]]bela[[:space:]]diri[[:space:]]wajib[[:space:]]ada[[:space:]]setiap[[:space:]]individu_base.wav filter=lfs diff=lfs merge=lfs -text
404
+ ab_degrade_eb2/07_Seni[[:space:]]bela[[:space:]]diri[[:space:]]wajib[[:space:]]ada[[:space:]]setiap[[:space:]]individu_clean.wav filter=lfs diff=lfs merge=lfs -text
405
+ ab_degrade_eb2/07_Seni[[:space:]]bela[[:space:]]diri[[:space:]]wajib[[:space:]]ada[[:space:]]setiap[[:space:]]individu_hard1.wav filter=lfs diff=lfs merge=lfs -text
406
+ ab_degrade_eb2/07_Seni[[:space:]]bela[[:space:]]diri[[:space:]]wajib[[:space:]]ada[[:space:]]setiap[[:space:]]individu_hard2.wav filter=lfs diff=lfs merge=lfs -text
407
+ ab_degrade_eb2/07_cv_zhcn_001130_base.wav filter=lfs diff=lfs merge=lfs -text
408
+ ab_degrade_eb2/07_cv_zhcn_001130_clean.wav filter=lfs diff=lfs merge=lfs -text
409
+ ab_degrade_eb2/07_cv_zhcn_001130_hard1.wav filter=lfs diff=lfs merge=lfs -text
410
+ ab_degrade_eb2/07_cv_zhcn_001130_hard2.wav filter=lfs diff=lfs merge=lfs -text
411
+ ab_degrade_eb2/08_0001115_base.wav filter=lfs diff=lfs merge=lfs -text
412
+ ab_degrade_eb2/08_0001115_clean.wav filter=lfs diff=lfs merge=lfs -text
413
+ ab_degrade_eb2/08_0001115_hard1.wav filter=lfs diff=lfs merge=lfs -text
414
+ ab_degrade_eb2/08_0001115_hard2.wav filter=lfs diff=lfs merge=lfs -text
415
+ ab_degrade_eb2/08_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]EP48[[:space:]]-[[:space:]]Letchu_base.wav filter=lfs diff=lfs merge=lfs -text
416
+ ab_degrade_eb2/08_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]EP48[[:space:]]-[[:space:]]Letchu_clean.wav filter=lfs diff=lfs merge=lfs -text
417
+ ab_degrade_eb2/08_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]EP48[[:space:]]-[[:space:]]Letchu_hard1.wav filter=lfs diff=lfs merge=lfs -text
418
+ ab_degrade_eb2/08_PODCAST[[:space:]]Borak[[:space:]]Dalam[[:space:]]Galley[[:space:]]EP48[[:space:]]-[[:space:]]Letchu_hard2.wav filter=lfs diff=lfs merge=lfs -text
419
+ ab_degrade_eb2/09_023116_base.wav filter=lfs diff=lfs merge=lfs -text
420
+ ab_degrade_eb2/09_023116_clean.wav filter=lfs diff=lfs merge=lfs -text
421
+ ab_degrade_eb2/09_023116_hard1.wav filter=lfs diff=lfs merge=lfs -text
422
+ ab_degrade_eb2/09_023116_hard2.wav filter=lfs diff=lfs merge=lfs -text
423
+ ab_degrade_eb2/09_Bell[[:space:]]Ngasri[[:space:]]-[[:space:]]OKLETSGO[[:space:]]Video[[:space:]]Podcast[[:space:]](Pa_base.wav filter=lfs diff=lfs merge=lfs -text
424
+ ab_degrade_eb2/09_Bell[[:space:]]Ngasri[[:space:]]-[[:space:]]OKLETSGO[[:space:]]Video[[:space:]]Podcast[[:space:]](Pa_clean.wav filter=lfs diff=lfs merge=lfs -text
425
+ ab_degrade_eb2/09_Bell[[:space:]]Ngasri[[:space:]]-[[:space:]]OKLETSGO[[:space:]]Video[[:space:]]Podcast[[:space:]](Pa_hard1.wav filter=lfs diff=lfs merge=lfs -text
426
+ ab_degrade_eb2/09_Bell[[:space:]]Ngasri[[:space:]]-[[:space:]]OKLETSGO[[:space:]]Video[[:space:]]Podcast[[:space:]](Pa_hard2.wav filter=lfs diff=lfs merge=lfs -text
427
+ ab_degrade_eb2/10_Are[[:space:]]labels[[:space:]]important[[:space:]]in[[:space:]]relationships?[[:space:]]|_base.wav filter=lfs diff=lfs merge=lfs -text
428
+ ab_degrade_eb2/10_Are[[:space:]]labels[[:space:]]important[[:space:]]in[[:space:]]relationships?[[:space:]]|_clean.wav filter=lfs diff=lfs merge=lfs -text
429
+ ab_degrade_eb2/10_Are[[:space:]]labels[[:space:]]important[[:space:]]in[[:space:]]relationships?[[:space:]]|_hard1.wav filter=lfs diff=lfs merge=lfs -text
430
+ ab_degrade_eb2/10_Are[[:space:]]labels[[:space:]]important[[:space:]]in[[:space:]]relationships?[[:space:]]|_hard2.wav filter=lfs diff=lfs merge=lfs -text
431
+ ab_degrade_eb2/10_tamil_003048_base.wav filter=lfs diff=lfs merge=lfs -text
432
+ ab_degrade_eb2/10_tamil_003048_clean.wav filter=lfs diff=lfs merge=lfs -text
433
+ ab_degrade_eb2/10_tamil_003048_hard1.wav filter=lfs diff=lfs merge=lfs -text
434
+ ab_degrade_eb2/10_tamil_003048_hard2.wav filter=lfs diff=lfs merge=lfs -text
435
+ ab_degrade_eb2/11_rainbow_03_fast_base.wav filter=lfs diff=lfs merge=lfs -text
436
+ ab_degrade_eb2/11_rainbow_03_fast_clean.wav filter=lfs diff=lfs merge=lfs -text
437
+ ab_degrade_eb2/11_rainbow_03_fast_hard1.wav filter=lfs diff=lfs merge=lfs -text
438
+ ab_degrade_eb2/11_rainbow_03_fast_hard2.wav filter=lfs diff=lfs merge=lfs -text
439
+ ab_degrade_eb2/11_uk_ireland_en_008806_base.wav filter=lfs diff=lfs merge=lfs -text
440
+ ab_degrade_eb2/11_uk_ireland_en_008806_clean.wav filter=lfs diff=lfs merge=lfs -text
441
+ ab_degrade_eb2/11_uk_ireland_en_008806_hard1.wav filter=lfs diff=lfs merge=lfs -text
442
+ ab_degrade_eb2/11_uk_ireland_en_008806_hard2.wav filter=lfs diff=lfs merge=lfs -text
443
+ assets/spectrum_calls.png filter=lfs diff=lfs merge=lfs -text
444
+ assets/spectrum_clips.png filter=lfs diff=lfs merge=lfs -text
445
+ examples/callhome_deu_v1_restored48k.wav filter=lfs diff=lfs merge=lfs -text
446
+ examples/callhome_deu_v2_restored48k.wav filter=lfs diff=lfs merge=lfs -text
447
+ examples/callhome_eng_v1_restored48k.wav filter=lfs diff=lfs merge=lfs -text
448
+ examples/callhome_eng_v2_restored48k.wav filter=lfs diff=lfs merge=lfs -text
449
+ examples/callhome_jpn_v1_restored48k.wav filter=lfs diff=lfs merge=lfs -text
450
+ examples/callhome_jpn_v2_restored48k.wav filter=lfs diff=lfs merge=lfs -text
451
+ examples/callhome_spa_v1_restored48k.wav filter=lfs diff=lfs merge=lfs -text
452
+ examples/callhome_spa_v2_restored48k.wav filter=lfs diff=lfs merge=lfs -text
453
+ examples/callhome_zho_v1_restored48k.wav filter=lfs diff=lfs merge=lfs -text
454
+ examples/callhome_zho_v2_restored48k.wav filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: cc-by-nc-4.0
3
+ tags:
4
+ - speech-restoration
5
+ - speech-enhancement
6
+ - bandwidth-extension
7
+ - telephony
8
+ - call-center
9
+ - w2v-bert
10
+ - lora
11
+ - dac
12
+ base_model: facebook/w2v-bert-2.0
13
+ pipeline_tag: audio-to-audio
14
+ ---
15
+
16
+ # CallEnhancer
17
+
18
+ CallEnhancer restores call-centre speech. It takes narrowband, codec'd, noisy phone audio, such as 8 kHz G.711 or GSM calls,
19
+ and returns clean speech at 48 kHz.
20
+
21
+ This is **version 2**. Version 1 stays available at the [`v1` tag](https://huggingface.co/Scicom-intl/CallEnhancer/tree/v1).
22
+
23
+ ## What changed in v2
24
+
25
+ - **The full band.** v2's high-band distance to clean speech is 5.5 dB on our 1,289 call-centre clips, against 6.9 dB for v1, and 3.9 dB against 5.3 dB on 58 real calls. Clean studio recordings score 2.0 to 2.3 dB.
26
+ - **Intelligibility.** On the 58 real calls v2 reads 30.8 % nCER and v1 30.1 %. The mean per-call difference is +1.1 points (95 % CI [-0.9, +3.5]), within noise. v2 is better on 27 calls and worse on 30.
27
+ - **Deletions.** v2 deletes less speech. It mutes 10.9 % of speech against 13.2 % for v1, at 40.5 % against 41.9 % silence filled: more than a change in loudness balance explains.
28
+ - **Two parties in one channel.** v2 keeps a quieter second voice. With the two sides of our 58 real calls mixed into one channel, v2 dropped 4.4 % of the quieter party's speech and v1 4.1 %. v2 still drops more than a quarter of it in 4 of 56 calls, v1 in 1.
29
+ - **Naturalness.** About the same. SOTA-MOS is 2.77 for v2 and 2.70 for v1 (300 clips). Two runs of one recipe differ by 0.07 to 0.08.
30
+ - **Same size, same files.** A w2v-BERT 2.0 encoder with a LoRA adapter and a 188M DAC decoder. The weights keep v1's paths, so
31
+ existing download code keeps working.
32
+
33
+ ## Comparison
34
+
35
+ We ran CallEnhancer v2, CallEnhancer v1 and three open restoration models on the same call-centre audio, through the same scripts.
36
+
37
+ ![Median spectrum on 1,289 call-centre clips](assets/spectrum_clips.png)
38
+
39
+ Each curve is a system's median spectrum, relative to its own 1 to 4 kHz band, on speech-active frames. Black is clean speech.
40
+ The number in the legend is the high-band distance (HBD): the RMS gap to the black curve from 4 to 20 kHz. Lower is closer to
41
+ clean speech.
42
+
43
+ | model | output | HBD, 1,289 clips (dB) ↓ | HBD, 58 real calls (dB) ↓ | nCER, 58 real calls (%) ↓ | speech muted (%) ↓ | silence filled (%) | SOTA-MOS ↑ | DNSMOS overall ↑ |
44
+ |---|---|---:|---:|---:|---:|---:|---:|---:|
45
+ | **CallEnhancer v2 (this release)** | 48 kHz | 5.5 | 3.9 | 30.8 | **10.9** | 40.5 | **2.77** | 2.97 |
46
+ | CallEnhancer v1 | 48 kHz | 6.9 | 5.3 | **30.1** | 13.2 | 41.9 | 2.70 | 2.76 |
47
+ | sidon-v0.1 | 48 kHz | 4.4 | 5.2 | 30.8 | 28.2 | 20.9 | 2.64 | **3.17** |
48
+ | VoiceFixer | 44.1 kHz | **3.0** | **2.1** | 50.0 | 27.1 | 52.9 | 2.19 | 2.78 |
49
+ | Resemble Enhance | 44.1 kHz | 4.8 | 8.6 | 48.8 | 19.5 | 15.7 | 2.28 | 3.05 |
50
+ | input (telephone audio) | 8 to 16 kHz | 51.3 | 49.2 | 48.8 | | | | |
51
+
52
+ Bold marks the best system in each column. Silence filled has no best (see How we measured).
53
+
54
+ ![Median spectrum on 58 real calls](assets/spectrum_calls.png)
55
+
56
+ ![Character error rate on 58 real calls](assets/ncer.png)
57
+
58
+ ![Speech muted against silence filled](assets/deletions.png)
59
+
60
+ ![SOTA-MOS on 300 clips](assets/sotamos.png)
61
+
62
+ ### How we measured
63
+
64
+ - **Test audio.** 1,289 call-centre clips (English, Malay and Mandarin, 9.4 hours) and 58 real calls with human transcripts, one
65
+ party per channel. Both are customer data; we publish aggregates only.
66
+ - **Systems.** Each restores the same files with its default settings. 44.1 kHz outputs are resampled to 48 kHz.
67
+ - **nCER.** [Malaysian Whisper](https://huggingface.co/mesolitica/Malaysian-whisper-large-v3-turbo-v3) against the human transcripts,
68
+ after LLM normalisation, mean of 3 runs. Each party is restored on its own channel.
69
+ - **Speech muted.** The share of 20 ms speech frames that the output drops by more than 6 dB. A band-pass that deletes nothing
70
+ scores 5.9 %.
71
+ - **Silence filled.** The share of silent input frames that the output raises by more than 6 dB. A counter-metric, not a score: a
72
+ change in loudness balance trades one against the other, so compare muting at similar silence filled. The shaded band in the
73
+ deletions figure is v1 with only its balance changed.
74
+ - **One channel.** Both sides of each real call mixed into one file at their recorded levels (11.4 dB apart at the median). Speech muted is read on the quieter party, at 8 kHz.
75
+ - **SOTA-MOS** ([HighRateMOS](https://huggingface.co/Scicom-intl/HighRateMOS-VoiceMOS2025)) on 300 clips at 48 kHz.
76
+ - **DNSMOS** P.835 overall, the median over the clips it can score (1,243 to 1,283 of 1,289).
77
+ - **Silent outputs.** Resemble Enhance returns silence (under -60 dBFS) on 41 clips; the other systems never do. Speech muted counts these as deletions.
78
+
79
+ ## Quick start
80
+
81
+ ```bash
82
+ pip install torch torchaudio "transformers>=4.56" "descript-audio-codec>=1.0.0" soundfile "huggingface_hub>=0.34"
83
+
84
+ hf download Scicom-intl/CallEnhancer infer_callcentre.py expand_decoder.py \
85
+ fe_callcentre/fe_adapter_full.pt decoder_callcentre/decoder_only.pt --local-dir CallEnhancer
86
+ cd CallEnhancer
87
+
88
+ python infer_callcentre.py --input your_call.wav --out-dir out \
89
+ --fe-adapter fe_callcentre/fe_adapter_full.pt \
90
+ --decoder decoder_callcentre/decoder_only.pt --device cuda
91
+ ```
92
+
93
+ - `out/your_call_restored48k.wav` is the restored speech at 48 kHz.
94
+ - `out/your_call_orig48k.wav` is the input, upsampled with no model, for an A/B listen.
95
+ - `--input` takes a file or a directory (`.wav`, `.flac`, `.mp3`, `.ogg`, `.opus`, `.m4a`). Stereo calls are restored per channel.
96
+ One channel holding both parties works too: v2 keeps the quieter voice.
97
+ - The default restores in 4-second windows with a 2-second crossfade. Keep it: the encoder's feature normalisation depends on
98
+ clip length, and a single pass over a long file drops speech. Use `--device cpu` without a GPU.
99
+ - v1 stays at the tag `v1`. To run it, keep this script and fetch only v1's weights:
100
+ `hf download Scicom-intl/CallEnhancer fe_callcentre/fe_adapter_full.pt decoder_callcentre/decoder_only.pt --revision v1 --local-dir v1`,
101
+ then pass them to `--fe-adapter` and `--decoder`. v1's own script restores in a single pass by default.
102
+
103
+ ### Python
104
+
105
+ ```python
106
+ import numpy as np, soundfile as sf, torch, torchaudio
107
+ from huggingface_hub import hf_hub_download
108
+ from transformers import AutoFeatureExtractor
109
+ import infer_callcentre as ic # from the download above, next to expand_decoder.py
110
+
111
+ torch.set_float32_matmul_precision("medium") # as the command line sets it: same output, bit for bit
112
+ dev = torch.device("cuda" if torch.cuda.is_available() else "cpu")
113
+ fe = ic.load_fe(hf_hub_download("Scicom-intl/CallEnhancer", "fe_callcentre/fe_adapter_full.pt"), dev)
114
+ dec, out_sr = ic.load_decoder(hf_hub_download("Scicom-intl/CallEnhancer", "decoder_callcentre/decoder_only.pt"), dev)
115
+ proc = AutoFeatureExtractor.from_pretrained("facebook/w2v-bert-2.0")
116
+
117
+ x, sr = sf.read("your_call.wav", dtype="float32", always_2d=True)
118
+ x16 = torchaudio.functional.resample(torch.from_numpy(x[:, 0])[None], sr, 16000)[0].numpy() # one channel
119
+ x16 = x16 / (np.abs(x16).max() + 1e-9) * 0.95
120
+ y = ic.restore_channel(x16, fe, dec, proc, dev, chunk_s=4.0, bf16=True, out_sr=out_sr)
121
+ y = y / (np.abs(y).max() + 1e-9) * 0.97 # peak level, as the command line writes it
122
+ sf.write("restored48k.wav", y, out_sr)
123
+ ```
124
+
125
+ ## Files
126
+
127
+ | path | what it is |
128
+ |---|---|
129
+ | `fe_callcentre/fe_adapter_full.pt` | encoder adapter for inference: 96 LoRA tensors and 48 `output_dense` biases on w2v-BERT 2.0 |
130
+ | `decoder_callcentre/decoder_only.pt` | decoder for inference: the 188M DAC decoder, 48 kHz |
131
+ | `decoder_callcentre/last.pt` | the full training state at step 150,000 (decoder, adapter, discriminator, optimisers), to continue training |
132
+ | `infer_callcentre.py`, `expand_decoder.py` | the inference script and the decoder builder it imports |
133
+ | `examples/` | five public CallHome calls (TalkBank), each one channel with both parties: the input, and the v2 and v1 restorations |
134
+ | `assets/` | the figures on this card |
135
+
136
+ ## Limitations
137
+
138
+ - The benchmarks are one operator's calls in English, Malay and Mandarin. Other lines and languages may differ.
139
+ - Sidon-style restoration resynthesises speech. Above 8 kHz the output is generated from the encoder's features, not recovered.
140
+ - SOTA-MOS mostly judges the band below 8 kHz. Use HBD and the spectra for the band above it.
141
+ - The test audio is customer data. We publish aggregates only, so the numbers cannot be reproduced outside Scicom.
142
+
143
+ ## License
144
+
145
+ CC BY-NC 4.0. Some training noise comes from non-commercial sources.
146
+
147
+ Built by Scicom (MSC) Berhad.
assets/deletions.png ADDED
assets/ncer.png ADDED
assets/sotamos.png ADDED
assets/spectrum_calls.png ADDED

Git LFS Details

  • SHA256: a750c60587c049c74424a34ea961fedc5468ba935dc7a51ff38e9d7ced07f1f2
  • Pointer size: 131 Bytes
  • Size of remote file: 162 kB
assets/spectrum_clips.png ADDED

Git LFS Details

  • SHA256: 02fb47707b9956718d1b1696b4c3e865bfd05840b63c3740d8250b755b76503f
  • Pointer size: 131 Bytes
  • Size of remote file: 156 kB
decoder_callcentre/decoder_only.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6c568f76b1bcf7f48971a420de7e6c74dae2334b7b8b7a2d490c5873f4ee788a
3
+ size 750805910
decoder_callcentre/last.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:142d714ab2b0df38fc395c4957a195913cb7f1373280b81ba9019b94462aca60
3
+ size 2952482645
examples/callhome_deu.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d7a1e7ba05cfa60f5771046b7d87be367594c3d337923ed5c3a8f2a3f342567e
3
+ size 180302
examples/callhome_deu_v1_restored48k.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b4fec771e06377db8d3d8d6ceadf98ce5329faf78302cc1225a194166ec6e0e3
3
+ size 1081388
examples/callhome_deu_v2_restored48k.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a0e4777290989676a26767a399752179c9aebbc9242b5be2fbdc1aed79e35251
3
+ size 1081388
examples/callhome_eng.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1a5733271526d5a22d7f2aed68fe1d7880d0a65c81e4c3b6da0888da5c2cb4b1
3
+ size 131150
examples/callhome_eng_v1_restored48k.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c80e71f5538712df31005fb6385dc6e03a53a942eff877549c9f55e09e0b77ed
3
+ size 786476
examples/callhome_eng_v2_restored48k.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a4f00ac6cc207f87aca353f2d218ea8b8b6718b3d2315a9600225bb1472c287b
3
+ size 786476
examples/callhome_jpn.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7a9b15f32e312b8700c38c9ac486c8a86a9fdfd86079963960dd030aa9412df2
3
+ size 176206
examples/callhome_jpn_v1_restored48k.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3a1fbf4c1c17032e1436154043063d9601016e5dc3074f168472b20796a7c0b6
3
+ size 1056812
examples/callhome_jpn_v2_restored48k.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6d5afd12eeb437a8026bb64d02c9122eccbf7772fc410fca7ee0f0cf9b55d2db
3
+ size 1056812
examples/callhome_spa.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:582cec7d70435fd07e6467eef80ec8bc3aeb4c8297dca080ba1d66a9ebbef0dd
3
+ size 155726
examples/callhome_spa_v1_restored48k.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:87256169e15dd494d77c254ca070ae388d40a671ec4c9a2b5212b6b09df9e909
3
+ size 933932
examples/callhome_spa_v2_restored48k.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:dfbbfb54dda722b3f117d42bc4a8ec0b6d16c92a036d6979134d82ae5562a377
3
+ size 933932
examples/callhome_zho.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:345bb077b928b45cb59d7e431f1cdd5c51fa36f139816d6ec8aa1bf830431055
3
+ size 163918
examples/callhome_zho_v1_restored48k.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a655a09b94243cb0a59f935c7374fe20313d2304941eaafa747b4f7b131bf11d
3
+ size 983084
examples/callhome_zho_v2_restored48k.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8f51ae2218aa6c697dc8e30141f5d4cc1dec80f540401a2a7f6001f4b2e9df92
3
+ size 983084
expand_decoder.py ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Warm-start expansion of the enhancer-small DAC decoder (188M -> >=300M).
3
+
4
+ Takes the released `Scicom-intl/CallEnhancer` decoder checkpoint (3072 ch, 188M,
5
+ 500k steps) and DEEPENS it by appending extra ResidualUnits inside the widest
6
+ DecoderBlocks, so all 500k steps of training are kept (the neucodec-44k
7
+ `extend_decoder.py` trick, adapted to a CNN pyramid).
8
+
9
+ Why not "duplicate the last layer" literally: the DAC decoder is not a
10
+ homogeneous transformer stack — widths halve per block (3072->1536->768->384->
11
+ 192->96), so the literal last layers are tiny (a 96-ch ResidualUnit is ~0.07M).
12
+ The parameter mass lives in the wide early blocks: one ResidualUnit at 1536 ch
13
+ is ~18.9M (@400 Hz frame rate — cheap compute) and one at 768 ch is ~4.7M
14
+ (@2 kHz). The default `1536:9,768:5` takes 188M -> ~381M
15
+ (9x18.9 + 5x4.7 = +193M), i.e. slightly over 2x the released decoder.
16
+
17
+ Why duplicate + ZERO-GATE (not random init, not plain copy):
18
+ * ResidualUnits compute `x + f(x)`. Zeroing the new unit's output 1x1 conv
19
+ (weight_norm g + bias) makes it an exact identity, so the expanded model is
20
+ FUNCTION-IDENTICAL to the 500k checkpoint at step 0 (`--verify` proves it).
21
+ The 500k-strength discriminator (also carried over) therefore stays balanced
22
+ instead of hammering a suddenly-degraded generator.
23
+ * The rest of the new unit is copied from the trained same-dilation unit in
24
+ its block, so when the gate opens, gradients start from trained filter
25
+ directions rather than noise.
26
+
27
+ Usage (on the pod, dac importable):
28
+ hf download Scicom-intl/CallEnhancer decoder_callcentre/decoder_train_state.pt --local-dir ck
29
+ python expand_decoder.py --ckpt ck/decoder_callcentre/decoder_train_state.pt \
30
+ --extra-res 1536:6 --out /Sidon/decoder_callcentre/last.pt --verify
31
+
32
+ # then continue training with the SAME graph:
33
+ python train_decoder_callcentre.py --dec-channels 3072 --extra-res 1536:6 \
34
+ --out /Sidon/decoder_callcentre --steps 800000 ...
35
+
36
+ The output is a trainer-resumable `last.pt`: expanded decoder + the 500k
37
+ discriminator and its optimizer state; the GENERATOR optimizer is dropped (its
38
+ param groups changed) — the trainer starts a fresh opt_g, so use a warmup/lower
39
+ LR for the first ~5-10k steps.
40
+ """
41
+ from __future__ import annotations
42
+
43
+ import argparse
44
+
45
+ import torch
46
+
47
+ import dac
48
+
49
+ RATES = [8, 5, 4, 3, 2]
50
+ DILATIONS = (1, 3, 9) # DAC's per-block dilation stack; appended units cycle it
51
+ N_BASE_UNITS = 3 # ResidualUnits per DecoderBlock in stock DAC
52
+ FIRST_UNIT_IDX = 2 # DecoderBlock.block = [Snake1d, WNConvTranspose1d, RU, RU, RU]
53
+
54
+
55
+ def parse_extra_res(spec: str) -> dict[int, int]:
56
+ """'1536:6,768:4' -> {1536: 6, 768: 4} (block output channels -> extra units)."""
57
+ out: dict[int, int] = {}
58
+ for part in (spec or "").split(","):
59
+ part = part.strip()
60
+ if not part:
61
+ continue
62
+ ch, n = part.split(":")
63
+ out[int(ch)] = int(n)
64
+ return out
65
+
66
+
67
+ def build_decoder(input_channel: int, channels: int, extra_res: dict[int, int] | None = None,
68
+ rates=RATES):
69
+ """Stock DAC decoder graph + `extra_res[out_ch]` extra ResidualUnits appended at
70
+ the END of each matching DecoderBlock's Sequential — existing state-dict keys are
71
+ untouched, new units land at `model.<i>.block.{5,6,...}`. Random init (callers
72
+ either load a full expanded checkpoint, or warm-start via `expand_state`)."""
73
+ dec = dac.model.dac.Decoder(input_channel=input_channel, channels=channels, rates=list(rates))
74
+ extra_res = extra_res or {}
75
+ used = set()
76
+ for i in range(len(rates)):
77
+ out_ch = channels // 2 ** (i + 1)
78
+ n_extra = extra_res.get(out_ch, 0)
79
+ if n_extra <= 0:
80
+ continue
81
+ used.add(out_ch)
82
+ blk = dec.model[1 + i] # model[0] is the input conv
83
+ for k in range(n_extra):
84
+ unit = dac.model.dac.ResidualUnit(out_ch, dilation=DILATIONS[k % len(DILATIONS)])
85
+ blk.block.add_module(str(len(blk.block)), unit)
86
+ unknown = set(extra_res) - used
87
+ if unknown:
88
+ raise ValueError(f"extra_res channels {sorted(unknown)} do not match any "
89
+ f"DecoderBlock output width of a {channels}-ch decoder")
90
+ return dec
91
+
92
+
93
+ def _zero_output_gate(unit) -> None:
94
+ """Zero the unit's final 1x1 conv (weight-norm g + bias) => unit is identity."""
95
+ conv = unit.block[-1]
96
+ with torch.no_grad():
97
+ if hasattr(conv, "weight_g"): # torch old-style weight_norm
98
+ conv.weight_g.zero_()
99
+ elif hasattr(conv, "parametrizations"): # new-style parametrization
100
+ conv.parametrizations.weight.original0.zero_()
101
+ else:
102
+ conv.weight.zero_()
103
+ if conv.bias is not None:
104
+ conv.bias.zero_()
105
+
106
+
107
+ def expand_state(dec, old_sd: dict, channels: int, extra_res: dict[int, int],
108
+ rates=RATES) -> None:
109
+ """Load the trained (unexpanded) `old_sd` into the expanded `dec`, then init each
110
+ appended unit as a COPY of its block's trained same-dilation unit with the output
111
+ gate zeroed (exact identity => function-preserving warm start)."""
112
+ missing, unexpected = dec.load_state_dict(old_sd, strict=False)
113
+ if unexpected:
114
+ raise RuntimeError(f"checkpoint keys not in expanded graph: {unexpected[:5]} ...")
115
+ base_keys = set(old_sd)
116
+ for key in missing:
117
+ if ".block." not in key or int(key.split(".block.")[1].split(".")[0]) < FIRST_UNIT_IDX + N_BASE_UNITS:
118
+ raise RuntimeError(f"missing non-appended key after load: {key}")
119
+ for i in range(len(rates)):
120
+ out_ch = channels // 2 ** (i + 1)
121
+ n_extra = extra_res.get(out_ch, 0)
122
+ blk = dec.model[1 + i]
123
+ for k in range(n_extra):
124
+ src = blk.block[FIRST_UNIT_IDX + (k % N_BASE_UNITS)] # dilation-matched trained unit
125
+ new = blk.block[FIRST_UNIT_IDX + N_BASE_UNITS + k]
126
+ new.load_state_dict(src.state_dict())
127
+ _zero_output_gate(new)
128
+ assert base_keys <= set(dec.state_dict())
129
+
130
+
131
+ def main() -> None:
132
+ ap = argparse.ArgumentParser(description=__doc__.split("\n")[0])
133
+ ap.add_argument("--ckpt", required=True,
134
+ help="decoder_train_state.pt / last.pt / decoder_only.pt (needs 'decoder' key)")
135
+ ap.add_argument("--extra-res", default="1536:9,768:5",
136
+ help="extra ResidualUnits per block as 'out_ch:n,...' "
137
+ "[1536:9,768:5 => 188M -> ~381M; 1536:6 => ~301M]")
138
+ ap.add_argument("--out", required=True, help="output trainer-resumable last.pt")
139
+ ap.add_argument("--input-channel", type=int, default=1024)
140
+ ap.add_argument("--verify", action="store_true",
141
+ help="also build the base decoder and assert identical outputs")
142
+ ap.add_argument("--set-step", type=int, default=None,
143
+ help="override the stored step (default: keep, e.g. 500000)")
144
+ a = ap.parse_args()
145
+
146
+ ck = torch.load(a.ckpt, map_location="cpu")
147
+ old_sd = ck["decoder"] if "decoder" in ck else ck
148
+ channels = ck.get("dec_channels", 3072)
149
+ if ck.get("extra_res"):
150
+ raise SystemExit(f"{a.ckpt} is already expanded (extra_res={ck['extra_res']})")
151
+ extra = parse_extra_res(a.extra_res)
152
+
153
+ dec = build_decoder(a.input_channel, channels, extra)
154
+ expand_state(dec, old_sd, channels, extra)
155
+ n_old = sum(v.numel() for v in old_sd.values())
156
+ n_new = sum(p.numel() for p in dec.parameters())
157
+ print(f"[expand] {channels}ch +{a.extra_res}: {n_old/1e6:.1f}M -> {n_new/1e6:.1f}M params")
158
+
159
+ if a.verify:
160
+ base = build_decoder(a.input_channel, channels, None)
161
+ base.load_state_dict(old_sd)
162
+ base.eval(); dec.eval()
163
+ with torch.no_grad():
164
+ x = torch.randn(1, a.input_channel, 50)
165
+ d = (base(x) - dec(x)).abs().max().item()
166
+ print(f"[verify] max |base - expanded| on random input: {d:.3e}")
167
+ assert d < 1e-5, "expanded decoder is NOT function-preserving"
168
+
169
+ out = {"step": a.set_step if a.set_step is not None else ck.get("step", 0),
170
+ "decoder": dec.state_dict(),
171
+ "dec_channels": channels,
172
+ "extra_res": a.extra_res}
173
+ for key in ("disc", "opt_d"): # keep the 500k discriminator (+ its optimizer);
174
+ if key in ck: # opt_g is dropped — decoder param groups changed
175
+ out[key] = ck[key]
176
+ torch.save(out, a.out)
177
+ print(f"[save] {a.out} (step={out['step']}, disc={'disc' in out}, opt_d={'opt_d' in out}; "
178
+ f"opt_g intentionally dropped -> trainer starts a fresh generator optimizer)")
179
+
180
+
181
+ if __name__ == "__main__":
182
+ main()
fe_callcentre/fe_adapter_full.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:998b57cfcbeeba14d1ed938d5ec5d6f24c75bb901cf3548d567321ecb4963b3e
3
+ size 63160783
infer_callcentre.py ADDED
@@ -0,0 +1,317 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Sidon call-centre restoration — inference.
3
+
4
+ Restores telephony / call-centre audio (narrowband, codec'd, noisy) to clean
5
+ 48 kHz, using the two trained stages:
6
+
7
+ input audio --resample 16k--> (call-centre FE: 24L w2v-BERT + LoRA) --features[T,1024]-->
8
+ (DAC decoder, 188M) --> 48 kHz waveform
9
+
10
+ The FE LoRA adapter is **merged into the base weights** here (W_eff = W + (alpha/r)*B@A,
11
+ bias = trained bias), so inference needs NO `peft` — just transformers + descript-audio-codec.
12
+
13
+ Usage:
14
+ python runpod/infer_callcentre.py --input audio --out-dir audio/out \
15
+ --fe-adapter checkpoints/fe_adapter_full.pt --decoder checkpoints/decoder_only.pt
16
+
17
+ Stereo inputs (e.g. agent/customer on separate channels) are restored per-channel
18
+ and recombined to stereo. A `<name>_orig<khz>.wav` (naive-upsampled input, no model)
19
+ is also written for an apples-to-apples A/B listen.
20
+
21
+ The output rate comes from the DECODER CHECKPOINT (`out_sr`/`dec_rates`), so a 24 kHz
22
+ enhancer-lite decoder needs no extra flag; 48 kHz models keep the `_restored48k.wav`
23
+ filenames the eval scripts already expect.
24
+ """
25
+ from __future__ import annotations
26
+
27
+ import os
28
+
29
+ os.environ.setdefault("OMP_NUM_THREADS", "4")
30
+
31
+ import argparse
32
+ import glob
33
+ import time
34
+
35
+ import numpy as np
36
+ import soundfile as sf
37
+ import torch
38
+ import torchaudio
39
+ from transformers import AutoFeatureExtractor, Wav2Vec2BertModel
40
+
41
+ import dac
42
+
43
+ # tm-b300 (B300 = sm_103): torch 2.8's cuDNN has no tuned 1-D conv kernels there (32 TFLOP/s in every precision),
44
+ # so FAST_CONV1D=1 routes conv1d / conv_transpose1d through unfold + GEMM (runpod/fast_conv1d.py, verified
45
+ # against the reference to 1e-7). Off by default: other boxes keep cuDNN byte for byte.
46
+ if os.environ.get("FAST_CONV1D", "0") == "1":
47
+ import fast_conv1d as _fc
48
+ if _fc.patch(): # only on Blackwell-class GPUs; elsewhere cuDNN stays and nothing is printed
49
+ print("[fast_conv1d] conv1d/conv_transpose1d via GEMM (sm_10x cuDNN workaround)", flush=True)
50
+
51
+
52
+ SSL_MODEL = "facebook/w2v-bert-2.0"
53
+ FE_SR = 16000
54
+ SR_OUT = 48000
55
+ AUDIO_EXTS = (".wav", ".flac", ".mp3", ".ogg", ".opus", ".m4a")
56
+
57
+
58
+ def log(m: str) -> None:
59
+ print(m, flush=True)
60
+
61
+
62
+ def load_fe(adapter_path: str, device: torch.device) -> Wav2Vec2BertModel:
63
+ """Build the 24L w2v-BERT base and merge the trained LoRA adapter into it."""
64
+ ck = torch.load(adapter_path, map_location="cpu")
65
+ ad = ck["adapter"]
66
+ scaling = ck["lora_alpha"] / ck["r"]
67
+ layers = ck.get("layers", 24)
68
+ model = Wav2Vec2BertModel.from_pretrained(SSL_MODEL, num_hidden_layers=layers, layerdrop=0.0)
69
+ sd = model.state_dict()
70
+ prefixes = sorted({k[: -len(".lora_A.default.weight")]
71
+ for k in ad if k.endswith(".lora_A.default.weight")})
72
+ merged = 0
73
+ for p in prefixes: # p e.g. encoder.layers.0.ffn1.output_dense
74
+ A = ad[p + ".lora_A.default.weight"].float() # (r, in)
75
+ B = ad[p + ".lora_B.default.weight"].float() # (out, r)
76
+ delta = scaling * (B @ A) # (out, in)
77
+ wkey = p + ".weight"
78
+ sd[wkey] = sd[wkey].float() + delta.to(sd[wkey].dtype)
79
+ bkey = p + ".base_layer.bias" # trained (lora_only) bias
80
+ if bkey in ad:
81
+ sd[p + ".bias"] = ad[bkey].to(sd[p + ".bias"].dtype)
82
+ merged += 1
83
+ model.load_state_dict(sd)
84
+ model.to(device).eval()
85
+ for q in model.parameters():
86
+ q.requires_grad_(False)
87
+ log(f"[fe] merged LoRA into {merged} output_dense layers (scaling={scaling}); "
88
+ f"step {ck.get('step')}")
89
+ return model
90
+
91
+
92
+ def load_decoder(path: str, device: torch.device, input_channel: int = 1024):
93
+ """Returns (decoder, out_sr). The graph is reconstructed from the checkpoint, so a
94
+ 24 kHz decoder (`rates=[8,5,4,3]`) loads without any CLI flag; checkpoints written
95
+ before --out-sr existed have no `out_sr` key and were all 48 kHz."""
96
+ ck = torch.load(path, map_location="cpu")
97
+ ch = ck.get("dec_channels", 3072)
98
+ extra = ck.get("extra_res", "") # depth-expanded ckpts, see expand_decoder.py
99
+ out_sr = int(ck.get("out_sr", SR_OUT))
100
+ rates = ([int(r) for r in ck["dec_rates"].split(",")] if ck.get("dec_rates")
101
+ else [8, 5, 4, 3, 2])
102
+ # `dec_arch` only exists on ckpts written after the HiFi-GAN port; everything older
103
+ # is a DAC decoder, so the default keeps every existing checkpoint loading unchanged.
104
+ arch = ck.get("dec_arch", "dac")
105
+ if arch == "hifigan":
106
+ from hifigan_decoder import build_hifigan_decoder
107
+ dec = build_hifigan_decoder(input_channel, ch, rates=tuple(rates),
108
+ activation=ck.get("dec_activation", "lrelu"))
109
+ else:
110
+ from expand_decoder import build_decoder, parse_extra_res
111
+ dec = build_decoder(input_channel, ch, parse_extra_res(extra), rates=rates)
112
+ dec.load_state_dict(ck["decoder"])
113
+ dec.to(device).eval()
114
+ for q in dec.parameters():
115
+ q.requires_grad_(False)
116
+ label = "HiFi-GAN(MRF)" if arch == "hifigan" else "DAC"
117
+ log(f"[dec] {label} decoder channels={ch}{' +' + extra if extra else ''} rates={rates} "
118
+ f"-> {out_sr} Hz ({sum(p.numel() for p in dec.parameters())/1e6:.1f}M); "
119
+ f"step {ck.get('step')}")
120
+ return dec, out_sr
121
+
122
+
123
+ def _peak_norm(x: np.ndarray, peak: float = 0.95) -> np.ndarray:
124
+ m = float(np.abs(x).max())
125
+ return (x / m * peak).astype("float32") if m > 1e-6 else x.astype("float32")
126
+
127
+
128
+ def _lowpass(x: np.ndarray, sr: int, fc: float) -> np.ndarray:
129
+ """Zero-phase low-pass of the decoder output (see --out-lowpass for the measurement
130
+ that justifies the 8 kHz default). scipy is a hard dep of the training stack; if it
131
+ is somehow absent, pass the audio through rather than fail an inference run."""
132
+ try:
133
+ from scipy.signal import butter, sosfiltfilt
134
+ except Exception: # noqa: BLE001
135
+ log("[lp] scipy unavailable — skipping --out-lowpass")
136
+ return x
137
+ sos = butter(8, fc / (sr / 2), btype="low", output="sos")
138
+ return sosfiltfilt(sos, x).astype("float32")
139
+
140
+
141
+ @torch.no_grad()
142
+ def restore_channel(wav16: np.ndarray, fe, dec, proc, device, chunk_s: float, bf16: bool,
143
+ out_sr: int = SR_OUT):
144
+ """wav16: 1-D float32 @16k (peak-normalized) -> restored 1-D float32 @out_sr.
145
+ chunk_s > 0 => WINDOWED. The DEFAULT IS ARCH-AWARE (resolved in main): 4.0 s for w2vbert,
146
+ 0 (straight pass) for distilhubert. Both are measured, and they differ because only one of
147
+ the two feature extractors is length-dependent:
148
+ w2vbert SeamlessM4TFeatureExtractor normalises PER UTTERANCE -> the same audio
149
+ encodes differently depending on how much follows it (max|diff| 0 -> 10.4
150
+ from 6 s -> 29 s). Training used 6 s windows, so whole-file is OOD.
151
+ distilhubert its INPUT features are bit-identical across length (do_normalize=False on
152
+ raw waveform), but its HIDDEN STATES are NOT -- the transformer attends over
153
+ the whole utterance, so the same 6 s drifts 18.9-39.5 % as more audio follows.
154
+ Window it too. (An earlier note here claimed invariance from the input test
155
+ alone; that inference was wrong.)
156
+
157
+ The old docstring claimed a full pass is "length-invariant and cleaner" because w2v-BERT
158
+ uses rotary embeddings and the decoder is convolutional. **That is wrong, measured
159
+ 2026-08-13.** `SeamlessM4TFeatureExtractor` normalises each utterance to zero-mean /
160
+ unit-variance, so the SAME audio gets different features depending on how much audio
161
+ follows it: on one 30 s clip the first 6 s came out as ~1.61x + 0.37 relative to encoding
162
+ those 6 s alone. Training only ever used 6 s windows, so whole-file inference is
163
+ out-of-distribution and the decoder collapses to silence on parts of long inputs.
164
+ Measured on 20 worst-case clips: whole-pass 82.7 % of speech muted with 46 dropouts >3 s,
165
+ vs 33.6 % / 20 at chunk=4. On a random 40 it is a wash (14.9 -> 14.3 %), so windowing
166
+ rescues the pathological tail rather than improving the average -- but the tail is 20 s
167
+ holes in customer calls. Sweep: 4 s best, then 6 / 8 / 12, monotone in length.
168
+ COST: the 2 s overlap means chunk=4 is ~2x the compute of a straight pass (chunk=6 is
169
+ ~1.5x) -- relevant for the CPU-realtime lite path, not for GPU."""
170
+ n = len(wav16)
171
+ win = int(chunk_s * FE_SR)
172
+ if chunk_s <= 0 or n <= win:
173
+ bounds = [(0, n)]
174
+ else:
175
+ ov = int(2.0 * FE_SR) # 2 s overlap
176
+ hop = win - ov
177
+ bounds = [(s, min(s + win, n)) for s in range(0, n, hop)]
178
+ bounds = [b for b in bounds if b[1] > b[0]]
179
+ # A trailing sliver CRASHES the stack: the FE conv frontend strides 320, so <~0.5 s
180
+ # yields 1-2 frames and the decoder's conv stack raises "Kernel size can't be greater
181
+ # than actual input size". Latent until chunking became the default (it killed a
182
+ # full-set run after 244/1289 clips). Absorb any short tail into the previous window
183
+ # instead of emitting it — the overlap-add already covers that audio.
184
+ MIN_SEG = int(0.6 * FE_SR)
185
+ while len(bounds) > 1 and (bounds[-1][1] - bounds[-1][0]) < MIN_SEG:
186
+ bounds[-2] = (bounds[-2][0], bounds[-1][1])
187
+ bounds.pop()
188
+ # 16k -> out_sr upsample ratio (x3 at 48 kHz, x1.5 at 24 kHz) — integer math only, so
189
+ # a 24 kHz model doesn't silently round its overlap-add offsets.
190
+ up_num, up_den = out_sr, FE_SR
191
+ out = np.zeros(n * up_num // up_den + out_sr, dtype="float32") # + pad slack
192
+ wsum = np.zeros_like(out)
193
+ amp = torch.bfloat16 if (bf16 and device.type == "cuda") else torch.float32
194
+ for s, e in bounds:
195
+ seg = np.pad(wav16[s:e], (40, 40))
196
+ feats_in = proc(seg, sampling_rate=FE_SR, return_tensors="pt")
197
+ feats_in = {k: v.to(device) for k, v in feats_in.items()}
198
+ with torch.autocast(device.type, dtype=amp, enabled=(amp == torch.bfloat16)):
199
+ h = fe(**feats_in).last_hidden_state # [1,T,1024]
200
+ y = dec(h.transpose(1, 2)) # [1,1,L] @out_sr
201
+ y = y.squeeze().float().cpu().numpy()
202
+ o0 = s * up_num // up_den
203
+ L = min(len(y), len(out) - o0)
204
+ ramp = np.ones(L, dtype="float32")
205
+ if len(bounds) > 1: # taper edges for crossfade
206
+ r = min(int(2.0 * out_sr), L // 2)
207
+ if r > 0:
208
+ ramp[:r] = np.linspace(0, 1, r)
209
+ ramp[-r:] = np.linspace(1, 0, r)
210
+ out[o0:o0 + L] += y[:L] * ramp
211
+ wsum[o0:o0 + L] += ramp
212
+ valid = wsum > 1e-6
213
+ out[valid] /= wsum[valid]
214
+ return out[: n * up_num // up_den]
215
+
216
+
217
+ def main() -> None:
218
+ ap = argparse.ArgumentParser()
219
+ ap.add_argument("--input", default="audio", help="audio file or directory")
220
+ ap.add_argument("--out-dir", default="audio/out")
221
+ ap.add_argument("--fe-adapter", default="checkpoints/fe_adapter_full.pt",
222
+ help="w2vbert: LoRA adapter (merged into the base at load)")
223
+ ap.add_argument("--decoder", default="checkpoints/decoder_only.pt")
224
+ ap.add_argument("--fe-arch", default="w2vbert", choices=["w2vbert", "distilhubert"],
225
+ help="distilhubert = the ~37M realtime FE (enhancer-lite); pass the "
226
+ "stage-1 checkpoint via --fe-adapter (it holds the full FE)")
227
+ ap.add_argument("--chunk", type=float, default=None,
228
+ help="window seconds, crossfaded with 2 s overlap. DEFAULT IS ARCH-AWARE: "
229
+ "4.0 for w2vbert (its SeamlessM4T fbank normalises PER UTTERANCE, so a "
230
+ "whole-file pass is out-of-distribution and drops speech), 0 for "
231
+ "distilhubert (raw waveform, do_normalize=False -> verified BIT-IDENTICAL "
232
+ "at 6/10/20/29 s, so windowing only costs ~2x compute). Pass a value to "
233
+ "override; 0 = single straight pass.")
234
+ ap.add_argument("--mono", action="store_true", help="downmix to mono instead of per-channel")
235
+ ap.add_argument("--out-lowpass", type=float, default=0.0,
236
+ help="low-pass the decoder output at this Hz (0 = off, the DEFAULT since 2026-10-03). From 2026-08-07 to "
237
+ "2026-10-03 the default was 8000: measured on the 58-clip EMGS benchmark as a small gain on both ASRs "
238
+ "(WER 56.18 vs 57.63 whisper-large-v3; 50.00 vs 51.77 Malaysian-whisper-turbo) and on UTMOS (2.230 vs "
239
+ "2.205). It also removed the whole 8-24 kHz band of a 48 kHz model, so every full-band measurement read "
240
+ "a 10 kHz ceiling that was this filter, not the decoder (ABLATION.md 2026-10-03). The user removed it: "
241
+ "the shipped output is the decoder's native band. Pass --out-lowpass 8000 to reproduce the old outputs.")
242
+ ap.add_argument("--bf16", type=int, default=1)
243
+ ap.add_argument("--device", default="cuda")
244
+ a = ap.parse_args()
245
+ dev = torch.device(a.device if torch.cuda.is_available() else "cpu")
246
+ torch.set_float32_matmul_precision("medium")
247
+ os.makedirs(a.out_dir, exist_ok=True)
248
+
249
+ if os.path.isdir(a.input):
250
+ files = sorted(f for f in glob.glob(os.path.join(a.input, "*"))
251
+ if f.lower().endswith(AUDIO_EXTS))
252
+ else:
253
+ files = [a.input]
254
+ if not files:
255
+ raise SystemExit(f"no audio under {a.input}")
256
+
257
+ if a.fe_arch == "distilhubert":
258
+ import fe_distilhubert as fedh
259
+ fe = fedh.load_fe(a.fe_adapter, dev)
260
+ proc = fedh.make_processor() # raw waveform in (no fbank)
261
+ dec, out_sr = load_decoder(a.decoder, dev, input_channel=fe.out_dim)
262
+ # WINDOW THIS TOO. A 2026-08-14 conclusion that distilhubert is "length-invariant"
263
+ # was WRONG: it measured the FEATURE EXTRACTOR (do_normalize=False on raw waveform ->
264
+ # input features genuinely bit-identical at 6/10/20/29 s) and then wrongly inferred
265
+ # the MODEL was invariant. The FE is a TRANSFORMER, so attention spans the whole
266
+ # utterance: re-measured 2026-08-18, the hidden states for the SAME first 6 s drift
267
+ # 18.9 % / 38.6 % / 39.5 % (mean rel err) when 4 / 14 / 23 s follow. Whole-pass
268
+ # inference then produced 24 s dropouts and ~29k mute events on the 1,289-clip set,
269
+ # vs 6.6k at chunk=4. Input invariance does NOT imply representation invariance.
270
+ if a.chunk is None:
271
+ a.chunk = 4.0
272
+ else:
273
+ fe = load_fe(a.fe_adapter, dev)
274
+ dec, out_sr = load_decoder(a.decoder, dev)
275
+ proc = AutoFeatureExtractor.from_pretrained(SSL_MODEL)
276
+ # w2v-BERT: SeamlessM4TFeatureExtractor normalises PER UTTERANCE, so the same audio
277
+ # encodes differently depending on how much follows it (max|diff| 0 -> 10.4 from
278
+ # 6 s -> 29 s; ~1.61x + 0.37 affine). Training used 6 s windows, so a whole-file pass
279
+ # is out-of-distribution. Window by default.
280
+ if a.chunk is None:
281
+ a.chunk = 4.0
282
+ khz = f"{out_sr // 1000}k" # filenames follow the model, not a constant
283
+
284
+ for path in files:
285
+ name = os.path.splitext(os.path.basename(path))[0]
286
+ data, sr = sf.read(path, always_2d=True, dtype="float32") # [N, C]
287
+ if a.mono:
288
+ data = data.mean(axis=1, keepdims=True)
289
+ nch = data.shape[1]
290
+ t0 = time.time()
291
+ chans = []
292
+ for c in range(nch):
293
+ x = data[:, c]
294
+ x16 = (torchaudio.functional.resample(torch.from_numpy(x)[None], sr, FE_SR)[0].numpy()
295
+ if sr != FE_SR else x)
296
+ x16 = _peak_norm(x16, 0.95)
297
+ yout = restore_channel(x16, fe, dec, proc, dev, a.chunk, bool(a.bf16), out_sr)
298
+ if a.out_lowpass and a.out_lowpass < out_sr / 2:
299
+ yout = _lowpass(yout, out_sr, a.out_lowpass)
300
+ chans.append(_peak_norm(yout, 0.97))
301
+ L = max(len(c) for c in chans)
302
+ chans = [np.pad(c, (0, L - len(c))) for c in chans]
303
+ restored = np.stack(chans, axis=1) # [L, C]
304
+
305
+ # naive-upsampled input (no model) for an A/B reference, at the model's rate
306
+ orig = torchaudio.functional.resample(torch.from_numpy(data.T), sr, out_sr).T.numpy()
307
+ sf.write(os.path.join(a.out_dir, f"{name}_orig{khz}.wav"), _peak_norm(orig, 0.97), out_sr)
308
+ sf.write(os.path.join(a.out_dir, f"{name}_restored{khz}.wav"), restored, out_sr)
309
+ dur = data.shape[0] / sr
310
+ log(f"[ok] {name}: {nch}ch {sr}Hz {dur:.1f}s -> {khz} in {time.time()-t0:.1f}s "
311
+ f"(RTF {(time.time()-t0)/dur:.2f})")
312
+
313
+ log(f"[done] outputs in {a.out_dir}")
314
+
315
+
316
+ if __name__ == "__main__":
317
+ main()