dreamvoice / indic_text.py
trainig's picture
DreamVoice app files
cc87459 verified
Raw
History Blame Contribute Delete
2.41 kB
"""English -> Kannada translation via AI4Bharat IndicTrans2 — local GPU for HF Spaces."""
from __future__ import annotations
import os
import re
import torch
INDICTRANS_ID = "ai4bharat/indictrans2-en-indic-1B"
_tok = None
_model = None
def _get_model():
global _tok, _model
if _tok is None or _model is None:
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
token = os.environ.get("HF_TOKEN") or None
_tok = AutoTokenizer.from_pretrained(
INDICTRANS_ID, trust_remote_code=True, token=token)
_model = AutoModelForSeq2SeqLM.from_pretrained(
INDICTRANS_ID, trust_remote_code=True, token=token)
_model = _model.to("cuda")
_model.eval()
return _tok, _model
# Load at module level for ZeroGPU (CUDA emulation outside @spaces.GPU)
try:
_get_model()
except Exception:
pass
def _split_sentences(text: str, max_chars: int = 180):
parts = re.split(r"(?<=[.!?।])\s+|\n+", text.strip())
out = []
for p in parts:
p = p.strip()
if not p:
continue
while len(p) > max_chars:
cut = p.rfind(" ", 0, max_chars)
cut = cut if cut > 0 else max_chars
out.append(p[:cut].strip())
p = p[cut:].strip()
out.append(p)
return out or [text.strip()]
def translate_to_kannada(en_text: str) -> str:
"""Translate English story text to Kannada (Kannada script)."""
text = (en_text or "").strip()
if not text:
raise ValueError("Nothing to translate.")
from IndicTransToolkit.processor import IndicProcessor
tok, model = _get_model()
ip = IndicProcessor(inference=True)
sents = _split_sentences(text, max_chars=180)
batch = ip.preprocess_batch(sents, src_lang="eng_Latn", tgt_lang="kan_Knda")
inputs = tok(batch, truncation=True, padding="longest", return_tensors="pt").to(model.device)
with torch.inference_mode():
generated = model.generate(
**inputs, max_length=512, num_beams=5,
num_return_sequences=1, length_penalty=1.0,
)
decoded = tok.batch_decode(generated, skip_special_tokens=True)
translations = ip.postprocess_batch(decoded, lang="kan_Knda")
kn = " ".join(t.strip() for t in translations if t.strip())
if not kn:
raise RuntimeError("Translation returned empty Kannada text.")
return kn