Views
No views yet

| Feature | Value |
|---|---|
| Architecture | Transformer (BART-style) |
| Tokenizer | Character-level |
| Total Parameters | 4M |
| Source Vocab Size | 87 (Urdu characters) |
| Target Vocab Size | 109 (Hindi characters) |
| Embedding Size | 256 |
| Hidden Size | 256 (d_model) |
| Feedforward Size | 512 |
| Encoder Layers | 3 |
| Decoder Layers | 3 |
| Attention Heads | 4 |
| Max Sequence Length | 128 characters |
1from huggingface_hub import snapshot_download
2
3path = snapshot_download(
4 repo_id="rekhtalabs/ur-2-hi-translit",
5 local_dir="./ur-2-hi-translit",
6 local_dir_use_symlinks=False
7)
8
9cd ur-2-hi-translitpip install -r requirements.txt1import torch
2import sentencepiece as spm
3from torch import nn
4
5
6class PositionalEncoding(nn.Module):
7 def __init__(self, d_model, max_len=5000):
8 super().__init__()
9 pe = torch.zeros(max_len, d_model)
10 position = torch.arange(0, max_len).unsqueeze(1)
11 div_term = torch.exp(torch.arange(0, d_model, 2) * (-torch.log(torch.tensor(10000.0)) / d_model))
12 pe[:, 0::2] = torch.sin(position.float() * div_term)
13 pe[:, 1::2] = torch.cos(position.float() * div_term)
14 self.pe = pe.unsqueeze(0)
15
16 def forward(self, x):
17 return x + self.pe[:, :x.size(1)].to(x.device)
18
19class Transformer(nn.Module):
20 def __init__(self, src_vocab_size, tgt_vocab_size, d_model=256, nhead=4, num_layers=3, dim_feedforward=512, max_len=128):
21 super().__init__()
22 self.src_tok_emb = nn.Embedding(src_vocab_size, d_model)
23 self.tgt_tok_emb = nn.Embedding(tgt_vocab_size, d_model)
24 self.pos_encoder = PositionalEncoding(d_model, max_len)
25 self.transformer = nn.Transformer(
26 d_model=d_model,
27 nhead=nhead,
28 num_encoder_layers=num_layers,
29 num_decoder_layers=num_layers,
30 dim_feedforward=dim_feedforward,
31 batch_first=True
32 )
33 self.out = nn.Linear(d_model, tgt_vocab_size)
34
35 def forward(self, src, tgt):
36 src = self.pos_encoder(self.src_tok_emb(src))
37 tgt = self.pos_encoder(self.tgt_tok_emb(tgt))
38 tgt_input = tgt
39 tgt_mask = nn.Transformer.generate_square_subsequent_mask(tgt_input.size(1)).to(src.device)
40 out = self.transformer(src, tgt_input, tgt_mask=tgt_mask)
41 return self.out(out)
42
43
44device = torch.device("cpu")
45sp_nastaaliq = spm.SentencePieceProcessor(model_file='nastaaliq_char.model')
46sp_devanagari = spm.SentencePieceProcessor(model_file='devanagari_char.model')
47
48model = Transformer(
49 src_vocab_size=sp_nastaaliq.get_piece_size(),
50 tgt_vocab_size=sp_devanagari.get_piece_size()
51)
52checkpoint = torch.load("transformer_transliteration_final.pt", map_location=device)
53model.load_state_dict(checkpoint['model_state_dict'])
54model.eval()
55model.to(device)
56
57
58def transliterate_urdu_to_hindi(text_urdu, max_len=128):
59
60 src_ids = [2] + sp_nastaaliq.encode(text_urdu)[:max_len - 2] + [3]
61 src_tensor = torch.tensor(src_ids).unsqueeze(0).to(device) # shape: (1, seq_len)
62
63
64 tgt_ids = [2]
65 tgt_tensor = torch.tensor(tgt_ids).unsqueeze(0).to(device)
66
67 for _ in range(max_len):
68 output = model(src_tensor, tgt_tensor)
69 next_token_logits = output[0, -1, :]
70 next_token_id = torch.argmax(next_token_logits).item()
71
72 if next_token_id == 3:
73 break
74
75 tgt_ids.append(next_token_id)
76 tgt_tensor = torch.tensor(tgt_ids).unsqueeze(0).to(device)
77
78
79 return sp_devanagari.decode(tgt_ids[1:])
80
81res=transliterate_urdu_to_hindi("وسوسے دل میں نہ رکھ خوف رسن لے کے نہ چل")
82print(res)
83
84
85वसवसे दिल में न रख ख़ौफ़-ए-रसन ले के न चल