import gradio as gr from deep_translator import GoogleTranslator from gtts import gTTS import pykakasi import os # 버전 정보 __version__ = "1.8.13" # Kakasi 인스턴스 생성 및 설정 kakasi = pykakasi.kakasi() def convert_text(japanese_text, conversion_type): if conversion_type == "히라가나": kakasi.setMode("H", "H") # 히라가나 유지 kakasi.setMode("K", "H") # 가타카나를 히라가나로 변환 kakasi.setMode("J", "H") # 한자를 히라가나로 변환 elif conversion_type == "가타카나": kakasi.setMode("H", "K") # 히라가나를 가타카나로 변환 kakasi.setMode("K", "K") # 가타카나 유지 kakasi.setMode("J", "K") # 한자를 가타카나로 변환 else: # 기본 또는 한자 return japanese_text # 변환 없이 그대로 반환 converter = kakasi.getConverter() converted = converter.do(japanese_text) return converted def search_and_update_history(keyword, conversion_type): result, japanese_keyword = search(keyword, conversion_type) 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, conversion_type): try: translator = GoogleTranslator(source='ko', target='ja') japanese_keyword = translator.translate(keyword) converted_keyword = convert_text(japanese_keyword, conversion_type) url = f"https://www.irasutoya.com/search?q={converted_keyword}" result_text = ( f"**검색어:** {keyword}\n" f"**일본어 번역 ({conversion_type}):** {converted_keyword}\n" f"[검색 결과 보기]({url})\n\n" f"**안내:** 선택한 변환 유형에 따라 검색 결과가 달라질 수 있습니다." ) return result_text, converted_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 def clear_inputs(): return "", "", gr.update(visible=False) with gr.Blocks(css=""" #container { width: 50%; margin: auto; } #search_button, #clear_button { width: 100%; } """) as demo: with gr.Column(elem_id="container"): gr.Markdown("

이라스토야 일러스트 검색기

") keyword_input = gr.Textbox(label="한글 검색어 입력", placeholder="한글로 검색어를 입력하세요", elem_id="keyword_input") conversion_type = gr.Radio( label="변환 유형 선택", choices=["기본", "히라가나", "가타카나", "한자"], value="기본", elem_id="conversion_type" ) search_button = gr.Button("검색", elem_id="search_button") clear_button = gr.Button("지우기", elem_id="clear_button") result_output = gr.Markdown() play_audio = gr.Audio(visible=False, label="일본어 발음 듣기") # 엔터키로 검색 실행 추가 keyword_input.submit( fn=search_and_update_history, inputs=[keyword_input, conversion_type], outputs=[result_output, play_audio], ) search_button.click( fn=search_and_update_history, inputs=[keyword_input, conversion_type], outputs=[result_output, play_audio], ) clear_button.click( fn=clear_inputs, outputs=[keyword_input, result_output, play_audio], ) # 안내 문구를 UI 내부로 이동 gr.Markdown(""" **✨ 이라스토야(Irasutoya.com)** 는 일본의 일러스트레이터 미즈타니 타카시(Takashi Mizutani)가 운영하는 무료 일러스트 사이트입니다. 귀엽고 단순한 스타일의 일러스트를 웹사이트, 블로그, 프레젠테이션, 인쇄물 등에 사용할 수 있으며, 일본 내에서 널리 사용되고 있습니다. **🎥 유튜브 쇼츠와 영상 제작에 필요한 이미지를 쉽게 찾을 수 있지만,** 일본어로 되어 있어 불편할 수 있습니다. 이를 해결하기 위해 한글로 입력해도 번역과 이미지를 한 번에 가져올 수 있는 툴을 개발했습니다. **🎓 이 툴은 이미지 검색뿐만 아니라 일본어 발음을 들으며 간단한 일본어 공부도 가능합니다.** 이 툴이 도움이 되셨다면, 아래 링크를 통해 후원해 주세요. 여러분의 후원이 더 나은 서비스를 제공하는 데 큰 힘이 됩니다. 💖 **⚠️ 이라스토야 일러스트 이용 주의 사항:** - 개인, 법인, 상업적 사용 모두 무료입니다. - 단, 한 저작물당 20개까지만 무료로 사용할 수 있으며, 21개 이상 사용 시 유상으로 전환됩니다. - 저작권 표기 의무는 없으며, 자유롭게 편집 및 가공이 가능합니다. - 이 사이트는 단순히 이라스토야의 이미지를 검색할 수 있도록 일본어로 번역해 전달하는 기능만 제공합니다. - 검색된 이미지의 사용 조건은 이라스토야의 규정을 따르시기 바랍니다. """) gr.Markdown("""
고버스에게 피드백하기
""") gr.Markdown("

제작자: 고버스TV

") gr.Markdown(f"

버전: {__version__}

") # 앱 실행 if __name__ == "__main__": demo.launch(share=False)