Automatic Speech Recognition
NeMo
Persian
speech
persian
farsi
fastconformer
ctc
on-device
shenava
shenava-1
visualears
liteasr
compression
low-rank
dhh
Instructions to use Reza2kn/Shenava-Koochik-Lite-v1.0 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- NeMo
How to use Reza2kn/Shenava-Koochik-Lite-v1.0 with NeMo:
import nemo.collections.asr as nemo_asr asr_model = nemo_asr.models.ASRModel.from_pretrained("Reza2kn/Shenava-Koochik-Lite-v1.0") transcriptions = asr_model.transcribe(["file.wav"]) - Notebooks
- Google Colab
- Kaggle
Upload load_koochik_lite.py with huggingface_hub
Browse files- 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)
|