import gradio as gr from deep_translator import GoogleTranslator from gtts import gTTS import pykakasi import os import webbrowser from datetime import datetime # 버전 정보 __version__ = "1.7.2" # 버전이 필요할 때마다 제가 판단해서 업데이트합니다. # Kakasi 설정 (로마자 변환) kakasi = pykakasi.kakasi() conv = kakasi.convert # 로마자 변환 함수 def to_romaji(japanese_text): result = conv(japanese_text) romaji = ''.join([item['hepburn'] for item in result]) return romaji # 검색 및 결과 출력 함수 def search_and_update_history(keyword): result, japanese_keyword = search(keyword) if japanese_keyword: audio_path = generate_audio_file(japanese_keyword) return result, gr.update(value=audio_path, visible=True) else: return result, gr.update(visible=False) # 검색 함수 def search(keyword): try: translator = GoogleTranslator(source='ko', target='ja') japanese_keyword = translator.translate(keyword) url = f"https://www.irasutoya.com/search?q={japanese_keyword}" romaji = to_romaji(japanese_keyword) result_text = ( f"**검색어:** {keyword}\n" f"**일본어 번역:** {japanese_keyword} ({romaji})\n" f"검색 결과 보기 (새 탭에서 열기)\n\n" f"**안내:** 로마자 표기와 음성은 실제 발음과 다를 수 있습니다." ) return result_text, japanese_keyword except Exception as e: return f"번역 중 오류가 발생했습니다: {e}", None # 일본어 음성 생성 함수 def generate_audio_file(japanese_text): try: tts = gTTS(japanese_text, lang='ja') file_path = "japanese_audio.mp3" tts.save(file_path) return file_path except Exception as e: return None # Gradio 인터페이스 설정 with gr.Blocks(css=""" .container { max-width: 100%; margin: auto; padding: 10px; } .input-box { padding: 10px; border: 2px solid #ddd; border-radius: 4px; font-size: 16px; width: 100%; } .result-output { background-color: #fff; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 16px; width: 100%; margin-top: 15px; } .title { font-size: 24px; font-weight: bold; color: #2C3E50; margin-bottom: 10px; text-align: center; } .btn-large { font-size: 16px; padding: 8px; border-radius: 4px; width: 100%; margin-top: 5px; } .btn-search { background-color: #4CAF50; color: white; } .btn-clear { background-color: #f39c12; color: white; } .creator-info { font-size: 12px; color: #7f8c8d; text-align: center; margin-top: 20px; } """) as demo: with gr.Column(elem_classes="container"): gr.Markdown(f"## Irasutoya 한글 검색기 - 버전 {__version__}", elem_classes="title") keyword_input = gr.Textbox(label="한글 검색어 입력", placeholder="한글로 검색어를 입력하세요", elem_classes="input-box") search_button = gr.Button("검색", elem_classes="btn-large btn-search") clear_button = gr.Button("지우기", elem_classes="btn-large btn-clear") result_output = gr.Markdown(elem_classes="result-output") play_audio = gr.Audio(visible=False) # 음성 파일을 재생하는 컴포넌트 search_button.click( fn=search_and_update_history, inputs=[keyword_input], outputs=[result_output, play_audio], ) keyword_input.submit( fn=search_and_update_history, inputs=[keyword_input], outputs=[result_output, play_audio], ) clear_button.click( fn=lambda: ("", "", gr.update(visible=False)), outputs=[keyword_input, result_output, play_audio], ) # 안내 문구 추가 gr.Markdown(""" **✨ 이라스토야(Irasutoya.com)** 는 일본의 일러스트레이터 미즈타니 타카시(Takashi Mizutani)가 운영하는 무료 일러스트 사이트입니다. 귀엽고 단순한 스타일의 일러스트를 웹사이트, 블로그, 프레젠테이션, 인쇄물 등에 사용할 수 있으며, 일본 내에서 널리 사용되고 있습니다. **🎥 유튜브 쇼츠와 영상 제작에 필요한 이미지를 쉽게 찾을 수 있지만,** 일본어로 되어 있어 불편할 수 있습니다. 이를 해결하기 위해 한글로 입력해도 번역과 이미지를 한 번에 가져올 수 있는 툴을 개발했습니다. **🎓 이 툴은 이미지 검색뿐만 아니라 일본어 발음을 들으며 간단한 일본어 공부도 가능합니다.** 이 툴이 도움이 되셨다면, 아래 링크를 통해 후원해 주세요. 여러분의 후원이 더 나은 서비스를 제공하는 데 큰 힘이 됩니다. 💖 **⚠️ 이용 주의 사항:** - 개인, 법인, 상업적 사용 모두 무료입니다. - 단, 한 저작물당 20개까지만 무료로 사용할 수 있으며, 21개 이상 사용 시 유상으로 전환됩니다. - 저작권 표기 의무는 없으며, 자유롭게 편집 및 가공이 가능합니다. - 이 사이트는 단순히 이라스토야의 이미지를 검색할 수 있도록 일본어로 번역해 전달하는 기능만 제공합니다. - 검색된 이미지의 사용 조건은 이라스토야의 규정을 따르시기 바랍니다. """) # 제작자 정보 섹션 추가 gr.Markdown("""
""") gr.Markdown("제작자: 고버스TV", elem_classes="creator-info") # 앱 실행 demo.launch(share=False)