import os import sys import cv2 import numpy as np import gradio as gr import plotly.graph_objects as go from ultralytics import YOLO import google.generativeai as genai from PIL import Image from gtts import gTTS import tempfile import datetime import requests import shutil # --- ReportLab Imports (PDF) --- from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from reportlab.lib.units import cm, mm from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont # ============================================ # 1) Configuration & Setup # ============================================ # 🔑 API KEY GOOGLE_API_KEY = os.getenv("AIzaSyBYksOq03N5V2MjSYicHdsk4ESdyR9FABw") if GOOGLE_API_KEY: genai.configure(api_key=GOOGLE_API_KEY) # 📂 Model Path MODEL_PATH = "otu_multiclass_yolo11s_v2.pt" LOGO_KMUTNB_URL = "https://www.mou.kmutnb.ac.th/logo_kmutnb.png" LOGO_RAMA_URL ="https://www.rama.mahidol.ac.th/nursing/sites/default/files/public/Rama_Logo.png" INTRO_SOUND_URL = "https://cdn.pixabay.com/download/audio/2022/03/24/audio_c8c8a73467.mp3?filename=cinematic-atmosphere-score-2-22136.mp3" CLASS_NAMES = { 0: "Chocolate cyst", 1: "Serous cystadenoma", 2: "Teratoma", 3: "Theca cell tumor", 4: "Simple cyst", 5: "Normal ovary", 6: "Mucinous cystadenoma", 7: "High grade serous" } # --------------------------------------------------------- # 🛠️ AUTO-DOWNLOAD FONTS # --------------------------------------------------------- def force_download_font(url, filename): if not os.path.exists(filename): print(f"📥 Downloading {filename}...") try: r = requests.get(url, allow_redirects=True) with open(filename, 'wb') as f: f.write(r.content) except Exception as e: print(f"❌ Error downloading {filename}: {e}") return False return True font_urls = [ ("https://github.com/nutjunkie/thaifonts_sipa/raw/master/sipa_fonts/THSarabunNew/THSarabunNew.ttf", "THSarabunNew.ttf"), ("https://github.com/nutjunkie/thaifonts_sipa/raw/master/sipa_fonts/THSarabunNew/THSarabunNew%20Bold.ttf", "THSarabunNew-Bold.ttf") ] for url, fname in font_urls: force_download_font(url, fname) try: if os.path.exists("THSarabunNew.ttf"): pdfmetrics.registerFont(TTFont('THSarabun', 'THSarabunNew.ttf')) if os.path.exists("THSarabunNew-Bold.ttf"): pdfmetrics.registerFont(TTFont('THSarabun-Bold', 'THSarabunNew-Bold.ttf')) except Exception as e: print(f"⚠️ Font Registration Error: {e}") # ============================================ # 2) Helper Functions # ============================================ def text_to_speech(text): try: tts = gTTS(text, lang='th') f = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") tts.save(f.name) return f.name except: return None def generate_led_html(score, diagnosis): color = "#ff4444" if "High grade" in diagnosis else "#00C851" if "Normal" in diagnosis else "#ffbb33" return f"""