Spaces:
Sleeping
Sleeping
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.10" # ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ผ ๋ฒ์ ๊ฐฑ์ | |
# 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"<a href='{url}' target='_blank'>๊ฒ์ ๊ฒฐ๊ณผ ๋ณด๊ธฐ (์ ํญ์์ ์ด๊ธฐ)</a>\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: 50%; /* ๊ฐ๋ก ํญ์ ์ ๋ฐ์ผ๋ก ์ค์ */ | |
margin: auto; | |
padding: 10px; | |
} | |
.input-box { | |
width: 100%; /* ๊ฐ๋ก ๋๋น ์ต๋ํ */ | |
height: auto; /* ๋์ด๋ฅผ ์๋์ผ๋ก ์ค์ */ | |
padding: 12px 20px; /* ํจ๋ฉ ์ถ๊ฐ */ | |
border: 2px solid #ddd; | |
border-radius: 4px; | |
font-size: 18px; | |
box-sizing: border-box; | |
} | |
.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; | |
box-sizing: border-box; | |
} | |
.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(""" | |
<div style="text-align: center;"> | |
<a href="https://litt.ly/goverse" target="_blank" style="color: #2980b9; text-decoration: underline;">๊ณ ๋ฒ์ค์๊ฒ ํผ๋๋ฐฑํ๊ธฐ</a> | |
</div> | |
""") | |
gr.Markdown("์ ์์: ๊ณ ๋ฒ์คTV", elem_classes="creator-info") | |
# ์ฑ ์คํ | |
demo.launch(share=False) | |