| |
| import google.generativeai as genai |
| from PIL import Image |
| import config |
| import os |
| import json |
|
|
| def extract_and_translate(image_path, tribe): |
| """ |
| 💡 視覺翻譯一體化:辨識 + 翻譯一次完成,節省 80% 時間 |
| """ |
| if not config.GEMINI_KEY: return None |
|
|
| optimized_path = f"{image_path}_opt.jpg" |
| try: |
| with Image.open(image_path) as img: |
| if img.mode != 'RGB': img = img.convert('RGB') |
| if img.width > 1024: |
| ratio = 1024 / float(img.width) |
| img = img.resize((1024, int(img.height * ratio)), Image.Resampling.LANCZOS) |
| img.save(optimized_path, "JPEG", quality=70) |
|
|
| genai.configure(api_key=config.GEMINI_KEY) |
| |
| model = genai.GenerativeModel( |
| 'models/gemini-3-flash-preview', |
| generation_config={"temperature": 0.0, "response_mime_type": "application/json"} |
| ) |
| |
| prompt = f""" |
| 你是視覺翻譯專家。請辨識圖中文字並翻譯成{tribe}語。 |
| 1. 排除重複內容。 |
| 2. 輸出格式必須為 JSON:{{"items": [{{"original": "原文", "translated": "翻譯"}}]}} |
| 3. 遵守書寫憲法 2.0 (o轉u)。 |
| """ |
| |
| img_opt = Image.open(optimized_path) |
| response = model.generate_content([prompt, img_opt]) |
| |
| if os.path.exists(optimized_path): os.remove(optimized_path) |
| return json.loads(response.text) |
| except Exception as e: |
| if os.path.exists(optimized_path): os.remove(optimized_path) |
| return None |