Reza2kn commited on
Commit
a8a6231
·
verified ·
1 Parent(s): d3548e7

Upload load_koochik_lite.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. load_koochik_lite.py +48 -0
load_koochik_lite.py ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Load Shenava-Koochik-Lite-v1.0 — a LITEASR-compressed (-21.6% encoder) Koochik.
3
+
4
+ Needs the base model Reza2kn/Shenava-Koochik-v1.0 (.nemo) plus this repo's
5
+ `koochik_lite099_enc.pt` (compressed encoder state_dict) and `koochik_lite099_kmap.json`
6
+ (per-layer low-rank sizes k). LITEASR replaces each targeted encoder Linear with a
7
+ rank-k Sequential(Linear(D_in->k, bias=False), Linear(k->D_out, bias=True)); this loader
8
+ rebuilds that skeleton from the kmap, then loads the compressed weights.
9
+
10
+ from huggingface_hub import hf_hub_download, snapshot_download
11
+ base = hf_hub_download("Reza2kn/Shenava-Koochik-v1.0", "shenava-koochik-v1.0.nemo")
12
+ repo = snapshot_download("Reza2kn/Shenava-Koochik-Lite-v1.0")
13
+ from load_koochik_lite import load_koochik_lite
14
+ m = load_koochik_lite(base, f"{repo}/koochik_lite099_enc.pt", f"{repo}/koochik_lite099_kmap.json")
15
+ print(m.transcribe(["clip.wav"])[0].text)
16
+ """
17
+ import json, torch, torch.nn as nn
18
+ import nemo.collections.asr as A
19
+
20
+
21
+ def load_koochik_lite(base_nemo, enc_sd_path, kmap_path, device="cuda", ctc=True):
22
+ m = A.models.ASRModel.restore_from(base_nemo, map_location=device).eval()
23
+ if ctc:
24
+ try:
25
+ m.change_decoding_strategy(decoder_type="ctc")
26
+ except Exception:
27
+ pass
28
+
29
+ def parent(root, name):
30
+ parts = name.split("."); p = root
31
+ for x in parts[:-1]:
32
+ p = getattr(p, x)
33
+ return p, parts[-1]
34
+
35
+ for n, k in json.load(open(kmap_path)).items():
36
+ par, at = parent(m.encoder, n)
37
+ mod = getattr(par, at)
38
+ Dout, Din = mod.weight.shape
39
+ setattr(par, at, nn.Sequential(nn.Linear(Din, k, bias=False), nn.Linear(k, Dout, bias=True)))
40
+ m.encoder.load_state_dict(torch.load(enc_sd_path, map_location=device), strict=True)
41
+ return m.to(device).eval()
42
+
43
+
44
+ if __name__ == "__main__":
45
+ import sys
46
+ m = load_koochik_lite(sys.argv[1], sys.argv[2], sys.argv[3], device="cuda" if torch.cuda.is_available() else "cpu")
47
+ for r in m.transcribe(sys.argv[4:], batch_size=8):
48
+ print(r.text if hasattr(r, "text") else r)