Commit ·
0993d8a
0
Parent(s):
Duplicate from Scicom-intl/CallEnhancer
Browse filesCo-authored-by: huseinzolkepliscicom <huseinzolkepliscicom@users.noreply.huggingface.co>
- .gitattributes +454 -0
- README.md +147 -0
- assets/deletions.png +0 -0
- assets/ncer.png +0 -0
- assets/sotamos.png +0 -0
- assets/spectrum_calls.png +3 -0
- assets/spectrum_clips.png +3 -0
- decoder_callcentre/decoder_only.pt +3 -0
- decoder_callcentre/last.pt +3 -0
- examples/callhome_deu.wav +3 -0
- examples/callhome_deu_v1_restored48k.wav +3 -0
- examples/callhome_deu_v2_restored48k.wav +3 -0
- examples/callhome_eng.wav +3 -0
- examples/callhome_eng_v1_restored48k.wav +3 -0
- examples/callhome_eng_v2_restored48k.wav +3 -0
- examples/callhome_jpn.wav +3 -0
- examples/callhome_jpn_v1_restored48k.wav +3 -0
- examples/callhome_jpn_v2_restored48k.wav +3 -0
- examples/callhome_spa.wav +3 -0
- examples/callhome_spa_v1_restored48k.wav +3 -0
- examples/callhome_spa_v2_restored48k.wav +3 -0
- examples/callhome_zho.wav +3 -0
- examples/callhome_zho_v1_restored48k.wav +3 -0
- examples/callhome_zho_v2_restored48k.wav +3 -0
- expand_decoder.py +182 -0
- fe_callcentre/fe_adapter_full.pt +3 -0
- infer_callcentre.py +317 -0
.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 |
+

|
| 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 |
+

|
| 55 |
+
|
| 56 |
+

|
| 57 |
+
|
| 58 |
+

|
| 59 |
+
|
| 60 |
+

|
| 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
|
assets/spectrum_clips.png
ADDED
|
Git LFS Details
|
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()
|