Spaces:
Sleeping
Sleeping
File size: 6,234 Bytes
2753efc 30d363f 3553f95 e255572 46b7ff2 033c24d 2753efc 30d363f 2753efc 30d363f 2753efc 30d363f 5c39a34 30d363f e255572 d2952aa e255572 d2952aa e255572 d2952aa e255572 d2952aa 033c24d e255572 30d363f 2753efc 30d363f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
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)
|