Spaces:
Sleeping
Sleeping
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("<h2 style='text-align: center;'>์ด๋ผ์คํ ์ผ ์ผ๋ฌ์คํธ ๊ฒ์๊ธฐ</h2>") | |
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(""" | |
<div style="text-align: center;"> | |
<a href="https://litt.ly/goverse" target="_blank" style="color: #2980b9; text-decoration: underline;">๊ณ ๋ฒ์ค์๊ฒ ํผ๋๋ฐฑํ๊ธฐ</a> | |
</div> | |
""") | |
gr.Markdown("<p style='text-align: center;'>์ ์์: ๊ณ ๋ฒ์คTV</p>") | |
gr.Markdown(f"<p style='text-align: center;'>๋ฒ์ : {__version__}</p>") | |
# ์ฑ ์คํ | |
if __name__ == "__main__": | |
demo.launch(share=False) | |