Fine-tuned and quantized
small-100 seq2seq model for translating Roman-script Sinhala (Singlish) mixed with English into pure Sinhala Unicode script. Exported to ONNX and quantized to INT8 for fast CPU inference.
Takes informal Singlish text typed by Sri Lankans on social media and converts it to Sinhala script. English words are translated to their Sinhala meaning — not transliterated phonetically.
1from optimum.onnxruntime import ORTModelForSeq2SeqLM
2from transformers import AutoTokenizer
3
4model_id = "savinugunarathna/small-100-Singlish-Sinhala-CodeMix2-ONNX-INT8"
5
6model = ORTModelForSeq2SeqLM.from_pretrained(model_id)
7tokenizer = AutoTokenizer.from_pretrained(model_id)
8tokenizer.src_lang = "en"
9tgt_lang_id = tokenizer.lang_code_to_id["si"]
10
11def translate(text):
12 inputs = tokenizer(
13 text,
14 return_tensors="pt",
15 truncation=True,
16 max_length=128,
17 )
18 outputs = model.generate(
19 **inputs,
20 max_new_tokens=64,
21 num_beams=1, # greedy — fastest on CPU
22 forced_bos_token_id=tgt_lang_id,
23 )
24 return tokenizer.decode(outputs[0], skip_special_tokens=True).strip()
25
26print(translate("mama hungry, kanna yamu"))
27# → මම බඩගිනියි, කෑම කමු
1texts = [
2 "mama hungry, kanna yamu",
3 "bro API eka call karanna puluwanda",
4 "today weather eka honda ne",
5]
6
7inputs = tokenizer(
8 texts,
9 return_tensors="pt",
10 padding=True,
11 truncation=True,
12 max_length=128,
13)
14outputs = model.generate(
15 **inputs,
16 max_new_tokens=64,
17 num_beams=1,
18 forced_bos_token_id=tgt_lang_id,
19)
20for out in outputs:
21 print(tokenizer.decode(out, skip_special_tokens=True).strip())
1from fastapi import FastAPI
2from pydantic import BaseModel
3from optimum.onnxruntime import ORTModelForSeq2SeqLM
4from transformers import AutoTokenizer
5
6app = FastAPI()
7model_id = "savinugunarathna/small-100-Singlish-Sinhala-CodeMix2-ONNX-INT8"
8model = ORTModelForSeq2SeqLM.from_pretrained(model_id)
9tokenizer = AutoTokenizer.from_pretrained(model_id)
10tokenizer.src_lang = "en"
11tgt_lang_id = tokenizer.lang_code_to_id["si"]
12
13class Request(BaseModel):
14 text: str
15
16@app.post("/translate")
17def translate(req: Request):
18 inputs = tokenizer(req.text, return_tensors="pt", truncation=True, max_length=128)
19 outputs = model.generate(
20 **inputs,
21 max_new_tokens=128,
22 num_beams=3,
23 forced_bos_token_id=tgt_lang_id,
24 )
25 result = tokenizer.decode(outputs[0], skip_special_tokens=True).strip()
26 return {"input": req.text, "output": result}