goversetv's picture
Update app.py
033c24d verified
raw
history blame
No virus
6.23 kB
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)