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.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"<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: 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(""" | |
<div style="text-align: center;"> | |
<a href="https://litt.ly/goverse" target="_blank" style="color: #2980b9; text-decoration: underline;">κ³ λ²μ€TV</a> | |
</div> | |
""") | |
gr.Markdown("μ μμ: κ³ λ²μ€TV", elem_classes="creator-info") | |
# μ± μ€ν | |
demo.launch(share=False) | |