Views
No views yet
| Feature | Value |
|---|---|
| Architecture | Transformer (BART-style) |
| Tokenizer | Character-level |
| Embedding Size | 256 |
| Hidden Size | 256 (d_model) |
| Feedforward Size | 512 (dim_feedforward) |
| Encoder Layers | 3 (num_layers) |
| Decoder Layers | 3 (num_layers) |
| Attention Heads | 4 (nhead) |
| Max Sequence Length | 128 (max_len) |
1from huggingface_hub import snapshot_download
2
3path = snapshot_download(
4 repo_id="rekhtalabs/hi-2-ur-translit",
5 local_dir="./hi-2-ur-translit",
6 local_dir_use_symlinks=False
7)
8
9cd hi-2-ur-translitpip install -r requirements.txt1import torch
2import sentencepiece as spm
3from torch import nn
4from collections import OrderedDict
5
6
7class PositionalEncoding(nn.Module):
8 def __init__(self, d_model, max_len=5000):
9 super().__init__()
10 pe = torch.zeros(max_len, d_model)
11 position = torch.arange(0, max_len).unsqueeze(1)
12 div_term = torch.exp(torch.arange(0, d_model, 2) * (-torch.log(torch.tensor(10000.0)) / d_model))
13 pe[:, 0::2] = torch.sin(position.float() * div_term)
14 pe[:, 1::2] = torch.cos(position.float() * div_term)
15 self.pe = pe.unsqueeze(0)
16
17 def forward(self, x):
18 return x + self.pe[:, :x.size(1)].to(x.device)
19
20
21class Transformer(nn.Module):
22 def __init__(self, src_vocab_size, tgt_vocab_size, d_model=256, nhead=4, num_layers=3, dim_feedforward=512, max_len=128):
23 super().__init__()
24 self.src_tok_emb = nn.Embedding(src_vocab_size, d_model)
25 self.tgt_tok_emb = nn.Embedding(tgt_vocab_size, d_model)
26 self.pos_encoder = PositionalEncoding(d_model, max_len)
27 self.transformer = nn.Transformer(
28 d_model=d_model,
29 nhead=nhead,
30 num_encoder_layers=num_layers,
31 num_decoder_layers=num_layers,
32 dim_feedforward=dim_feedforward,
33 batch_first=True
34 )
35 self.out = nn.Linear(d_model, tgt_vocab_size)
36
37 def forward(self, src, tgt):
38 src = self.pos_encoder(self.src_tok_emb(src))
39 tgt = self.pos_encoder(self.tgt_tok_emb(tgt))
40 tgt_mask = nn.Transformer.generate_square_subsequent_mask(tgt.size(1)).to(src.device)
41 out = self.transformer(src, tgt, tgt_mask=tgt_mask)
42 return self.out(out)
43
44
45sp_nastaaliq = spm.SentencePieceProcessor(model_file='nastaaliq_bpe.model')
46sp_devanagari = spm.SentencePieceProcessor(model_file='devanagari_bpe.model')
47
48
49device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
50model = Transformer(
51 src_vocab_size=sp_devanagari.get_piece_size(),
52 tgt_vocab_size=sp_nastaaliq.get_piece_size()
53).to(device)
54
55
56checkpoint = torch.load("h2u_2.0.pt", map_location=device)
57state_dict = checkpoint["model_state_dict"]
58new_state_dict = OrderedDict()
59for k, v in state_dict.items():
60 new_k = k.replace("module.", "")
61 new_state_dict[new_k] = v
62model.load_state_dict(new_state_dict)
63model.eval()
64
65
66def transliterate_urdu_to_hindi(text_urdu, max_len=128):
67 src_ids = [2] + sp_devanagari.encode(text_urdu)[:max_len - 2] + [3]
68 src_tensor = torch.tensor(src_ids).unsqueeze(0).to(device)
69
70 tgt_ids = [2] # BOS token
71 for _ in range(max_len):
72 tgt_tensor = torch.tensor(tgt_ids).unsqueeze(0).to(device)
73 with torch.no_grad():
74 output = model(src_tensor, tgt_tensor)
75 next_token_logits = output[0, -1, :]
76 next_token_id = torch.argmax(next_token_logits).item()
77
78 if next_token_id == 3:
79 break
80 tgt_ids.append(next_token_id)
81
82 return sp_nastaaliq.decode(tgt_ids[1:])
83
84
85res=transliterate_urdu_to_hindi("थम गए हों बहते बहते चम्पई रुख़्सार पर")
86print(res)
87
88
89تھم گئے ہوں بہتے بہتے چمپئی رخسار پر