goversetv commited on
Commit
8d3b576
โ€ข
1 Parent(s): 1fb4450

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +63 -106
app.py CHANGED
@@ -3,25 +3,31 @@ from deep_translator import GoogleTranslator
3
  from gtts import gTTS
4
  import pykakasi
5
  import os
6
- import webbrowser
7
- from datetime import datetime
8
 
9
  # ๋ฒ„์ „ ์ •๋ณด
10
- __version__ = "1.7.20" # ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋ฒ„์ „ ๊ฐฑ์‹ 
11
 
12
- # Kakasi ์„ค์ • (๋กœ๋งˆ์ž ๋ณ€ํ™˜)
13
  kakasi = pykakasi.kakasi()
14
- conv = kakasi.convert
15
 
16
- # ๋กœ๋งˆ์ž ๋ณ€ํ™˜ ํ•จ์ˆ˜
17
- def to_romaji(japanese_text):
18
- result = conv(japanese_text)
19
- romaji = ''.join([item['hepburn'] for item in result])
20
- return romaji
21
-
22
- # ๊ฒ€์ƒ‰ ๋ฐ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ํ•จ์ˆ˜
23
- def search_and_update_history(keyword):
24
- result, japanese_keyword = search(keyword)
 
 
 
 
 
 
 
 
 
25
 
26
  if japanese_keyword:
27
  audio_path = generate_audio_file(japanese_keyword)
@@ -29,25 +35,24 @@ def search_and_update_history(keyword):
29
  else:
30
  return result, gr.update(visible=False)
31
 
32
- # ๊ฒ€์ƒ‰ ํ•จ์ˆ˜
33
- def search(keyword):
34
  try:
35
  translator = GoogleTranslator(source='ko', target='ja')
36
  japanese_keyword = translator.translate(keyword)
 
 
37
 
38
- url = f"https://www.irasutoya.com/search?q={japanese_keyword}"
39
- romaji = to_romaji(japanese_keyword)
40
  result_text = (
41
  f"**๊ฒ€์ƒ‰์–ด:** {keyword}\n"
42
- f"**์ผ๋ณธ์–ด ๋ฒˆ์—ญ:** {japanese_keyword} ({romaji})\n"
43
- f"<a href='{url}' target='_blank'>๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ณด๊ธฐ (์ƒˆ ํƒญ์—์„œ ์—ด๊ธฐ)</a>\n\n"
44
- f"**์•ˆ๋‚ด:** ๋กœ๋งˆ์ž ํ‘œ๊ธฐ์™€ ์Œ์„ฑ์€ ์‹ค์ œ ๋ฐœ์Œ๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
45
  )
46
- return result_text, japanese_keyword
47
  except Exception as e:
48
  return f"๋ฒˆ์—ญ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {e}", None
49
 
50
- # ์ผ๋ณธ์–ด ์Œ์„ฑ ์ƒ์„ฑ ํ•จ์ˆ˜
51
  def generate_audio_file(japanese_text):
52
  try:
53
  tts = gTTS(japanese_text, lang='ja')
@@ -57,101 +62,53 @@ def generate_audio_file(japanese_text):
57
  except Exception as e:
58
  return None
59
 
60
- # Gradio ์ธํ„ฐํŽ˜์ด์Šค ์„ค์ •
 
 
61
  with gr.Blocks(css="""
62
- .container {
63
- max-width: 50%; /* ๊ธฐ๋ณธ ๊ฐ€๋กœ ํญ ์ ˆ๋ฐ˜ */
64
  margin: auto;
65
- padding: 10px;
66
- }
67
- .input-box {
68
- width: 100%; /* ๊ธฐ๋ณธ ๊ฐ€๋กœ ๊ธธ์ด */
69
- height: auto; /* ๋†’์ด๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ • */
70
- padding: 12px 20px; /* ํŒจ๋”ฉ ์ถ”๊ฐ€ */
71
- border: 2px solid #ddd;
72
- border-radius: 4px;
73
- font-size: 18px;
74
- box-sizing: border-box;
75
- }
76
- .result-output {
77
- background-color: #fff;
78
- padding: 10px;
79
- border: 1px solid #ddd;
80
- border-radius: 4px;
81
- font-size: 16px;
82
- width: 100%;
83
- margin-top: 15px;
84
- }
85
- .title {
86
- font-size: 24px;
87
- font-weight: bold;
88
- color: #2C3E50;
89
- margin-bottom: 10px;
90
- text-align: center;
91
  }
92
- button.btn-large {
93
- font-size: 16px;
94
- padding: 10px 20px;
95
- border-radius: 4px;
96
- margin-top: 10px;
97
- cursor: pointer;
98
  width: 100%;
99
- box-sizing: border-box;
100
- border: none;
101
  }
102
- button.btn-search {
103
- background-color: #28a745; /* ์ดˆ๋ก์ƒ‰ ๋ฒ„ํŠผ */
104
- color: white;
105
- }
106
- button.btn-clear {
107
- background-color: #dc3545; /* ๋นจ๊ฐ„์ƒ‰ ๋ฒ„ํŠผ */
108
- color: white;
109
- }
110
- .creator-info {
111
- font-size: 12px;
112
- color: #7f8c8d;
113
- text-align: center;
114
- margin-top: 20px;
115
- }
116
- @media (max-width: 768px) {
117
- .container {
118
- max-width: 100%; /* ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ์ „์ฒด ๊ฐ€๋กœ ํญ ์‚ฌ์šฉ */
119
- }
120
- .input-box {
121
- width: 100%; /* ๋ชจ๋ฐ”์ผ์—์„œ ๊ฐ€๋กœ ๊ธธ์ด 100% */
122
- }
123
- }
124
- """) as demo:
125
-
126
- with gr.Column(elem_classes="container"):
127
- gr.Markdown(f"## Irasutoya ํ•œ๊ธ€ ๊ฒ€์ƒ‰๊ธฐ - ๋ฒ„์ „ {__version__}", elem_classes="title")
128
-
129
- keyword_input = gr.Textbox(label="ํ•œ๊ธ€ ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ", placeholder="ํ•œ๊ธ€๋กœ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", elem_classes="input-box")
130
-
131
- search_button = gr.Button("๊ฒ€์ƒ‰", elem_classes="btn-large btn-search")
132
- clear_button = gr.Button("์ง€์šฐ๊ธฐ", elem_classes="btn-large btn-clear")
133
-
134
- result_output = gr.Markdown(elem_classes="result-output")
135
- play_audio = gr.Audio(visible=False) # ์Œ์„ฑ ํŒŒ์ผ์„ ์žฌ์ƒํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
136
 
137
- search_button.click(
 
138
  fn=search_and_update_history,
139
- inputs=[keyword_input],
140
  outputs=[result_output, play_audio],
141
  )
142
-
143
- keyword_input.submit(
144
  fn=search_and_update_history,
145
- inputs=[keyword_input],
146
  outputs=[result_output, play_audio],
147
  )
148
-
149
  clear_button.click(
150
- fn=lambda: ("", "", gr.update(visible=False)),
151
  outputs=[keyword_input, result_output, play_audio],
152
  )
153
 
154
- # ์•ˆ๋‚ด ๋ฌธ๊ตฌ ์ถ”๊ฐ€
155
  gr.Markdown("""
156
  **โœจ ์ด๋ผ์Šคํ† ์•ผ(Irasutoya.com)** ๋Š” ์ผ๋ณธ์˜ ์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ดํ„ฐ ๋ฏธ์ฆˆํƒ€๋‹ˆ ํƒ€์นด์‹œ(Takashi Mizutani)๊ฐ€ ์šด์˜ํ•˜๋Š” ๋ฌด๋ฃŒ ์ผ๋Ÿฌ์ŠคํŠธ ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.
157
  ๊ท€์—ฝ๊ณ  ๋‹จ์ˆœํ•œ ์Šคํƒ€์ผ์˜ ์ผ๋Ÿฌ์ŠคํŠธ๋ฅผ ์›น์‚ฌ์ดํŠธ, ๋ธ”๋กœ๊ทธ, ํ”„๋ ˆ์  ํ…Œ์ด์…˜, ์ธ์‡„๋ฌผ ๋“ฑ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ผ๋ณธ ๋‚ด์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
@@ -170,14 +127,14 @@ with gr.Blocks(css="""
170
  - ๊ฒ€์ƒ‰๋œ ์ด๋ฏธ์ง€์˜ ์‚ฌ์šฉ ์กฐ๊ฑด์€ ์ด๋ผ์Šคํ† ์•ผ์˜ ๊ทœ์ •์„ ๋”ฐ๋ฅด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
171
  """)
172
 
173
- # ์ œ์ž‘์ž ์ •๋ณด ์„น์…˜ ์ถ”๊ฐ€
174
  gr.Markdown("""
175
  <div style="text-align: center;">
176
  <a href="https://litt.ly/goverse" target="_blank" style="color: #2980b9; text-decoration: underline;">๊ณ ๋ฒ„์Šค์—๊ฒŒ ํ”ผ๋“œ๋ฐฑํ•˜๊ธฐ</a>
177
  </div>
178
  """)
179
-
180
- gr.Markdown("์ œ์ž‘์ž: ๊ณ ๋ฒ„์ŠคTV", elem_classes="creator-info")
181
 
182
  # ์•ฑ ์‹คํ–‰
183
- demo.launch(share=False)
 
 
3
  from gtts import gTTS
4
  import pykakasi
5
  import os
 
 
6
 
7
  # ๋ฒ„์ „ ์ •๋ณด
8
+ __version__ = "1.8.10"
9
 
10
+ # Kakasi ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐ ์„ค์ •
11
  kakasi = pykakasi.kakasi()
 
12
 
13
+ def convert_text(japanese_text, conversion_type):
14
+ if conversion_type == "ํžˆ๋ผ๊ฐ€๋‚˜":
15
+ kakasi.setMode("H", "H") # ํžˆ๋ผ๊ฐ€๋‚˜ ์œ ์ง€
16
+ kakasi.setMode("K", "H") # ๊ฐ€ํƒ€์นด๋‚˜๋ฅผ ํžˆ๋ผ๊ฐ€๋‚˜๋กœ ๋ณ€ํ™˜
17
+ kakasi.setMode("J", "H") # ํ•œ์ž๋ฅผ ํžˆ๋ผ๊ฐ€๋‚˜๋กœ ๋ณ€ํ™˜
18
+ elif conversion_type == "๊ฐ€ํƒ€์นด๋‚˜":
19
+ kakasi.setMode("H", "K") # ํžˆ๋ผ๊ฐ€๋‚˜๋ฅผ ๊ฐ€ํƒ€์นด๋‚˜๋กœ ๋ณ€ํ™˜
20
+ kakasi.setMode("K", "K") # ๊ฐ€ํƒ€์นด๋‚˜ ์œ ์ง€
21
+ kakasi.setMode("J", "K") # ํ•œ์ž๋ฅผ ๊ฐ€ํƒ€์นด๋‚˜๋กœ ๋ณ€ํ™˜
22
+ else: # ๊ธฐ๋ณธ ๋˜๋Š” ํ•œ์ž
23
+ return japanese_text # ๋ณ€ํ™˜ ์—†์ด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
24
+
25
+ converter = kakasi.getConverter()
26
+ converted = converter.do(japanese_text)
27
+ return converted
28
+
29
+ def search_and_update_history(keyword, conversion_type):
30
+ result, japanese_keyword = search(keyword, conversion_type)
31
 
32
  if japanese_keyword:
33
  audio_path = generate_audio_file(japanese_keyword)
 
35
  else:
36
  return result, gr.update(visible=False)
37
 
38
+ def search(keyword, conversion_type):
 
39
  try:
40
  translator = GoogleTranslator(source='ko', target='ja')
41
  japanese_keyword = translator.translate(keyword)
42
+
43
+ converted_keyword = convert_text(japanese_keyword, conversion_type)
44
 
45
+ url = f"https://www.irasutoya.com/search?q={converted_keyword}"
 
46
  result_text = (
47
  f"**๊ฒ€์ƒ‰์–ด:** {keyword}\n"
48
+ f"**์ผ๋ณธ์–ด ๋ฒˆ์—ญ ({conversion_type}):** {converted_keyword}\n"
49
+ f"[๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ณด๊ธฐ]({url})\n\n"
50
+ f"**์•ˆ๋‚ด:** ์„ ํƒํ•œ ๋ณ€ํ™˜ ์œ ํ˜•์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
51
  )
52
+ return result_text, converted_keyword
53
  except Exception as e:
54
  return f"๋ฒˆ์—ญ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {e}", None
55
 
 
56
  def generate_audio_file(japanese_text):
57
  try:
58
  tts = gTTS(japanese_text, lang='ja')
 
62
  except Exception as e:
63
  return None
64
 
65
+ def clear_inputs():
66
+ return "", "", gr.update(visible=False)
67
+
68
  with gr.Blocks(css="""
69
+ #container {
70
+ width: 50%;
71
  margin: auto;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  }
73
+ #search_button, #clear_button {
 
 
 
 
 
74
  width: 100%;
 
 
75
  }
76
+ """) as demo:
77
+ with gr.Column(elem_id="container"):
78
+ gr.Markdown(f"## Irasutoya ํ•œ๊ธ€ ๊ฒ€์ƒ‰๊ธฐ - ๋ฒ„์ „ {__version__}")
79
+
80
+ keyword_input = gr.Textbox(label="ํ•œ๊ธ€ ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ", placeholder="ํ•œ๊ธ€๋กœ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", elem_id="keyword_input")
81
+ conversion_type = gr.Radio(
82
+ label="๋ณ€ํ™˜ ์œ ํ˜• ์„ ํƒ",
83
+ choices=["๊ธฐ๋ณธ", "ํžˆ๋ผ๊ฐ€๋‚˜", "๊ฐ€ํƒ€์นด๋‚˜", "ํ•œ์ž"],
84
+ value="๊ธฐ๋ณธ",
85
+ elem_id="conversion_type"
86
+ )
87
+ search_button = gr.Button("๊ฒ€์ƒ‰", elem_id="search_button")
88
+ clear_button = gr.Button("์ง€์šฐ๊ธฐ", elem_id="clear_button")
89
+
90
+ result_output = gr.Markdown()
91
+ play_audio = gr.Audio(visible=False, label="์ผ๋ณธ์–ด ๋ฐœ์Œ ๋“ฃ๊ธฐ")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
 
93
+ # ์—”ํ„ฐํ‚ค๋กœ ๊ฒ€์ƒ‰ ์‹คํ–‰ ์ถ”๊ฐ€
94
+ keyword_input.submit(
95
  fn=search_and_update_history,
96
+ inputs=[keyword_input, conversion_type],
97
  outputs=[result_output, play_audio],
98
  )
99
+
100
+ search_button.click(
101
  fn=search_and_update_history,
102
+ inputs=[keyword_input, conversion_type],
103
  outputs=[result_output, play_audio],
104
  )
105
+
106
  clear_button.click(
107
+ fn=clear_inputs,
108
  outputs=[keyword_input, result_output, play_audio],
109
  )
110
 
111
+ # ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋ฅผ UI ๋‚ด๋ถ€๋กœ ์ด๋™
112
  gr.Markdown("""
113
  **โœจ ์ด๋ผ์Šคํ† ์•ผ(Irasutoya.com)** ๋Š” ์ผ๋ณธ์˜ ์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ดํ„ฐ ๋ฏธ์ฆˆํƒ€๋‹ˆ ํƒ€์นด์‹œ(Takashi Mizutani)๊ฐ€ ์šด์˜ํ•˜๋Š” ๋ฌด๋ฃŒ ์ผ๋Ÿฌ์ŠคํŠธ ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.
114
  ๊ท€์—ฝ๊ณ  ๋‹จ์ˆœํ•œ ์Šคํƒ€์ผ์˜ ์ผ๋Ÿฌ์ŠคํŠธ๋ฅผ ์›น์‚ฌ์ดํŠธ, ๋ธ”๋กœ๊ทธ, ํ”„๋ ˆ์  ํ…Œ์ด์…˜, ์ธ์‡„๋ฌผ ๋“ฑ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ผ๋ณธ ๋‚ด์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
 
127
  - ๊ฒ€์ƒ‰๋œ ์ด๋ฏธ์ง€์˜ ์‚ฌ์šฉ ์กฐ๊ฑด์€ ์ด๋ผ์Šคํ† ์•ผ์˜ ๊ทœ์ •์„ ๋”ฐ๋ฅด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
128
  """)
129
 
 
130
  gr.Markdown("""
131
  <div style="text-align: center;">
132
  <a href="https://litt.ly/goverse" target="_blank" style="color: #2980b9; text-decoration: underline;">๊ณ ๋ฒ„์Šค์—๊ฒŒ ํ”ผ๋“œ๋ฐฑํ•˜๊ธฐ</a>
133
  </div>
134
  """)
135
+
136
+ gr.Markdown("<p style='text-align: center;'>์ œ์ž‘์ž: ๊ณ ๋ฒ„์ŠคTV</p>")
137
 
138
  # ์•ฑ ์‹คํ–‰
139
+ if __name__ == "__main__":
140
+ demo.launch(share=False)