import gradio as gr from transformers import pipeline import torch from PIL import Image import requests from io import BytesIO import os # Language options LANGUAGES = { "English": "en", "Spanish": "es", "German": "de", "French": "fr", "Italian": "it", "Portuguese": "pt", "Hindi": "hi", "Chinese": "zh", "Japanese": "ja", "Korean": "ko", "Arabic": "ar", "Russian": "ru", "Dutch": "nl", "Polish": "pl", "Turkish": "tr", "Vietnamese": "vi", "Thai": "th", "Indonesian": "id", "Bengali": "bn", "Tamil": "ta", } # Load model print("Loading TranslateGemma model...") pipe = pipeline( "image-text-to-text", model="google/translategemma-4b-it", device="cuda" if torch.cuda.is_available() else "cpu", torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32, token=os.environ.get("HF_TOKEN"), ) print("Model loaded!") def translate_text(text, source_lang, target_lang): """Translate text from source to target language""" if not text.strip(): return "Please enter text to translate." src_code = LANGUAGES.get(source_lang, "en") tgt_code = LANGUAGES.get(target_lang, "es") messages = [ { "role": "user", "content": [ { "type": "text", "source_lang_code": src_code, "target_lang_code": tgt_code, "text": text, } ], } ] output = pipe(text=messages, max_new_tokens=1000, generate_kwargs={"do_sample": False}) return output[0]["generated_text"][-1]["content"] def translate_image(image_url, source_lang, target_lang): """Translate text in an image""" if not image_url.strip(): return "Please enter an image URL." src_code = LANGUAGES.get(source_lang, "en") tgt_code = LANGUAGES.get(target_lang, "de") messages = [ { "role": "user", "content": [ { "type": "image", "source_lang_code": src_code, "target_lang_code": tgt_code, "url": image_url, }, ], } ] output = pipe(text=messages, max_new_tokens=500, generate_kwargs={"do_sample": False}) return output[0]["generated_text"][-1]["content"] def load_image_preview(url): """Load image from URL for preview""" if not url.strip(): return None try: response = requests.get(url, timeout=10) img = Image.open(BytesIO(response.content)) return img except: return None def translate_batch(texts, source_lang, target_lang): """Translate multiple texts""" if not texts.strip(): return "Please enter texts to translate (one per line)." lines = [line.strip() for line in texts.split("\n") if line.strip()] results = [] for line in lines: result = translate_text(line, source_lang, target_lang) results.append(result) return "\n".join(results) # Custom CSS css = """ .gradio-container { font-family: 'Inter', sans-serif; } .header { text-align: center; margin-bottom: 20px; } .footer { text-align: center; margin-top: 20px; padding: 10px; color: #666; } """ # Build Gradio interface with gr.Blocks(css=css, title="TranslateGemma - AI Translator", theme=gr.themes.Soft()) as demo: # Header gr.HTML("""
Google's AI-powered translation model supporting 55+ languages
Built by Build Fast with AI