| | import gradio as gr |
| | import torch |
| | import os |
| | from transformers import AutoTokenizer, AutoModelForCausalLM |
| |
|
| | |
| | model_id = "google/translategemma-4b-it" |
| | hf_token = os.environ.get("HF_TOKEN") |
| |
|
| | print("Đang tải mô hình, vui lòng đợi... (có thể mất vài phút trên CPU)") |
| | tokenizer = AutoTokenizer.from_pretrained(model_id, token=hf_token) |
| | model = AutoModelForCausalLM.from_pretrained( |
| | model_id, |
| | torch_dtype=torch.bfloat16, |
| | device_map="cpu", |
| | token=hf_token |
| | ) |
| | print("Tải mô hình thành công!") |
| |
|
| | def translate_text(text, direction): |
| | if not text.strip(): |
| | return "Vui lòng nhập văn bản cần dịch." |
| | |
| | |
| | if direction == "🇨🇳 Trung sang 🇻🇳 Việt": |
| | source_lang = "zh" |
| | target_lang = "vi" |
| | else: |
| | source_lang = "vi" |
| | target_lang = "zh" |
| | |
| | |
| | messages = [ |
| | { |
| | "role": "user", |
| | "content": [ |
| | { |
| | "type": "text", |
| | "source_lang_code": source_lang, |
| | "target_lang_code": target_lang, |
| | "text": text.strip() |
| | } |
| | ] |
| | } |
| | ] |
| | |
| | try: |
| | |
| | prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) |
| | inputs = tokenizer(prompt, return_tensors="pt").to("cpu") |
| |
|
| | |
| | with torch.no_grad(): |
| | outputs = model.generate( |
| | **inputs, |
| | max_new_tokens=512, |
| | do_sample=False |
| | ) |
| | |
| | |
| | input_length = inputs['input_ids'].shape[1] |
| | translated_text = tokenizer.decode(outputs[0][input_length:], skip_special_tokens=True) |
| | |
| | return translated_text |
| | |
| | except Exception as e: |
| | return f"⚠️ Đã xảy ra lỗi: {str(e)}" |
| |
|
| | |
| | with gr.Blocks(title="Dịch Trung - Việt | TranslateGemma") as demo: |
| | gr.Markdown("## 🇨🇳🇻🇳 Công cụ dịch Trung - Việt (TranslateGemma-4b-it)") |
| | gr.Markdown("*Hệ thống chạy trên CPU nên sẽ mất khoảng 10-30s cho mỗi lần dịch.*") |
| | |
| | with gr.Row(): |
| | with gr.Column(): |
| | |
| | direction_radio = gr.Radio( |
| | choices=["🇨🇳 Trung sang 🇻🇳 Việt", "🇻🇳 Việt sang 🇨🇳 Trung"], |
| | value="🇨🇳 Trung sang 🇻🇳 Việt", |
| | label="Chọn chiều dịch" |
| | ) |
| | input_text = gr.Textbox(label="Văn bản cần dịch", lines=6, placeholder="Nhập văn bản vào đây...") |
| | translate_btn = gr.Button("Dịch", variant="primary") |
| | |
| | with gr.Column(): |
| | output_text = gr.Textbox(label="Kết quả", lines=9, interactive=False) |
| |
|
| | translate_btn.click( |
| | fn=translate_text, |
| | inputs=[input_text, direction_radio], |
| | outputs=output_text |
| | ) |
| |
|
| | if __name__ == "__main__": |
| | demo.launch() |