import gradio as gr import google.generativeai as genai from PIL import Image import io import base64 import json from typing import Optional, Tuple class KoreanOCRApp: def __init__(self): self.model = None self.api_key = None def configure_api(self, api_key: str) -> str: """API 키를 설정하고 모델을 초기화합니다.""" try: if not api_key or api_key.strip() == "": return "❌ API 키를 입력해주세요." genai.configure(api_key=api_key.strip()) self.model = genai.GenerativeModel('gemini-2.5-flash') self.api_key = api_key.strip() return "✅ API 키가 성공적으로 설정되었습니다." except Exception as e: return f"❌ API 키 설정 중 오류가 발생했습니다: {str(e)}" def extract_korean_text(self, image: Image.Image, api_key: str) -> Tuple[str, Image.Image]: """이미지에서 한국어 텍스트를 추출합니다.""" try: # API 키가 변경되었거나 처음 설정하는 경우 if not self.model or self.api_key != api_key.strip(): config_result = self.configure_api(api_key) if "❌" in config_result: return config_result, image if not image: return "❌ 이미지를 업로드해주세요.", None # 이미지 전처리 (선택사항) if image.mode != 'RGB': image = image.convert('RGB') # 이미지 크기 최적화 (너무 큰 경우) max_size = 1024 if max(image.size) > max_size: ratio = max_size / max(image.size) new_size = tuple(int(dim * ratio) for dim in image.size) image = image.resize(new_size, Image.Resampling.LANCZOS) # 한국어 텍스트 추출을 위한 프롬프트 prompt = """ 이 이미지에서 모든 한국어 텍스트를 추출해주세요. 다음 규칙을 따라주세요: 1. 이미지에 있는 모든 한국어 텍스트를 정확하게 읽어주세요 2. 텍스트의 위치나 순서를 고려하여 자연스럽게 배열해주세요 3. 줄바꿈이나 문단 구분이 있다면 그대로 유지해주세요 4. 영어나 숫자가 함께 있다면 그것도 포함해주세요 5. 읽을 수 없거나 불분명한 부분이 있다면 [불분명]으로 표시해주세요 추출된 텍스트만 출력해주세요: """ # Gemini API 호출 response = self.model.generate_content([prompt, image]) if response.text: extracted_text = response.text.strip() success_message = f"✅ 텍스트 추출 완료:\n\n{extracted_text}" return success_message, image else: return "❌ 텍스트를 추출할 수 없습니다.", image except Exception as e: error_message = f"❌ 오류가 발생했습니다: {str(e)}" return error_message, image def verify_image_display(self, image: Image.Image) -> Tuple[str, Image.Image]: """업로드된 이미지와 출력창의 이미지가 같은지 확인합니다.""" if image is None: return "❌ 이미지를 먼저 업로드해주세요.", None try: # 이미지 정보 확인 width, height = image.size format_info = image.format if hasattr(image, 'format') else "Unknown" mode = image.mode verification_text = f""" ✅ 이미지 검증 완료 📊 이미지 정보: - 크기: {width} x {height} 픽셀 - 포맷: {format_info} - 색상 모드: {mode} - 파일 크기: 약 {width * height * (3 if mode == 'RGB' else 1)} 바이트 🔍 이미지가 올바르게 표시되고 있습니다. """ return verification_text, image except Exception as e: return f"❌ 이미지 검증 중 오류가 발생했습니다: {str(e)}", image def create_app(): """그라디오 앱을 생성합니다.""" ocr_app = KoreanOCRApp() with gr.Blocks( title="한국어 OCR 텍스트 추출기", theme=gr.themes.Soft(), css=""" .container { max-width: 1200px; margin: auto; } .header { text-align: center; padding: 20px; background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px; margin-bottom: 20px; } """ ) as app: # 헤더 gr.HTML("""
Google Gemini를 사용한 고성능 한국어 텍스트 인식