gaeunseo commited on
Commit
98bcf73
ยท
verified ยท
1 Parent(s): 5d3b12e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +20 -28
app.py CHANGED
@@ -1,7 +1,7 @@
1
  import time
2
  import gradio as gr
3
 
4
- # --- ์ŠคํŠธ๋ฆฌ๋ฐ ํ•จ์ˆ˜: ํ•œ ๊ธ€์ž์”ฉ ์ถœ๋ ฅ (ํƒ€์ดํ•‘ ํšจ๊ณผ)
5
  def stream_text(text):
6
  out = ""
7
  for ch in text:
@@ -9,54 +9,45 @@ def stream_text(text):
9
  time.sleep(0.05) # ๊ธ€์ž๋‹น ์ง€์—ฐ (0.05์ดˆ)
10
  yield out
11
 
12
- # --- ํ•˜๋‹จ์˜ ์›๋ณธ ๋ฌธ์žฅ์„ HTML๋กœ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
13
- # ํ˜„์žฌ ์ปท ์ธ๋ฑ์Šค(cut_index)๋ณด๋‹ค ์•ž์ชฝ์€ ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ(์ด๋ฏธ ์ž˜๋ฆฐ ๋ถ€๋ถ„),
14
- # ํ˜„์žฌ ์ปท ์ธ๋ฑ์Šค ๊ธ€์ž์—๋Š” โœ‚๏ธ ์ด๋ชจํ‹ฐ์ฝ˜์„ ๋ถ™์—ฌ ํ‘œ์‹œํ•˜๊ณ , ๊ทธ ์ดํ›„์˜ ๊ธ€์ž๋Š” ๊ธฐ๋ณธ ์Šคํƒ€์ผ๋กœ ํ‘œ์‹œ
15
  def get_clickable_html(sentence, cut_index=0):
16
  html = "<div style='font-size:24px; font-family: monospace;'>"
17
  for i, ch in enumerate(sentence):
18
  if i < cut_index:
19
- # ์ด๋ฏธ ์ž˜๋ฆฐ ๋ถ€๋ถ„์€ ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•˜๋ฉฐ ํด๋ฆญ ๋ถˆ๊ฐ€
20
  html += f"<span style='color:gray;'>{ch}</span>"
21
  elif i == cut_index:
22
- # ํ˜„์žฌ ์ปท ์œ„์น˜: ํŒŒ๋ž€์ƒ‰๊ณผ ํ•จ๊ป˜ โœ‚๏ธ ์ด๋ชจํ‹ฐ์ฝ˜ ํ‘œ์‹œ
23
  html += f"<span style='cursor:pointer; color:blue;' onclick='handleClick({i})'>{ch}โœ‚๏ธ</span>"
24
  else:
25
- # ์•„์ง ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„: ํด๋ฆญ ์‹œ handleClick(i) ํ˜ธ์ถœ
26
  html += f"<span style='cursor:pointer;' onclick='handleClick({i})'>{ch}</span>"
27
  html += "</div>"
28
  return html
29
 
30
- # --- HTML์— ์‚ฝ์ž…ํ•  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ (์ˆจ๊ฒจ์ง„ Textbox์™€ Button์„ ํ™œ์šฉ)
31
  custom_js = """
32
  <script>
33
  function handleClick(index) {
34
- // ํด๋ฆญํ•œ ๊ธ€์ž์˜ ์ธ๋ฑ์Šค๋ฅผ ์ˆจ๊ฒจ์ง„ input์— ์ €์žฅํ•œ ํ›„,
35
- // ์ˆจ๊ฒจ์ง„ ๋ฒ„ํŠผ์„ ๊ฐ•์ œ๋กœ ํด๋ฆญํ•ด Python ์ฝœ๋ฐฑ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
36
  document.getElementById("click_index").value = index;
37
  document.getElementById("trigger_button").click();
38
  }
39
  </script>
40
  """
41
 
42
- # --- "Start" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ:
43
- # ์›๋ณธ ๋ฌธ์žฅ๊ณผ ํ˜„์žฌ ์ปท ์ธ๋ฑ์Šค(0)๋ฅผ ์ƒํƒœ๋กœ ์ €์žฅํ•˜๊ณ ,
44
- # ์ƒ๋‹จ์—๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ์šฉ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ, ํ•˜๋‹จ์—๋Š” HTML ํ‘œ์‹œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
45
  def start_sentence(text):
46
  current_cut = 0
47
  clickable = get_clickable_html(text, current_cut) + custom_js
48
- # ์ƒ๋‹จ ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์ „์ฒด ๋ฌธ์žฅ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ถœ๋ ฅ
49
  return stream_text(text), text, current_cut, clickable
50
 
51
- # --- "Restart Streaming" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ:
52
- # ํ˜„์žฌ ์ƒํƒœ(์›๋ณธ ๋ฌธ์žฅ์™€ ํ˜„์žฌ ์ปท ์ธ๋ฑ์Šค)์—์„œ ์ž˜๋ฆฐ ํ›„์˜ ๋ฌธ์žฅ์„ ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ถœ๋ ฅ
53
  def stream_current(original_sentence, current_cut):
54
  new_text = original_sentence[current_cut:]
55
  return stream_text(new_text)
56
 
57
- # --- HTML์˜ ํŠน์ • ๊ธ€์ž๋ฅผ ํด๋ฆญ(์ˆจ์€ ๋ฒ„ํŠผ์„ ํ†ตํ•ด)ํ•˜๋ฉด ์‹คํ–‰๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜
58
- # ํด๋ฆญํ•œ ์ธ๋ฑ์Šค(index)๊ฐ€ ํ˜„์žฌ ์ปท ์ธ๋ฑ์Šค๋ณด๋‹ค ํฌ๋ฉด(์ฆ‰, ์•„์ง ์ž˜๋ฆฌ์ง€ ์•Š์€ ๋ถ€๋ถ„์—์„œ ํด๋ฆญ๋˜๋ฉด)
59
- # ํ˜„์žฌ ์ปท ์ธ๋ฑ์Šค๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ , ํ•˜๋‹จ HTML ํ‘œ์‹œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
60
  def update_cut(index, original_sentence, current_cut):
61
  index = int(index)
62
  new_cut = current_cut
@@ -65,19 +56,19 @@ def update_cut(index, original_sentence, current_cut):
65
  clickable = get_clickable_html(original_sentence, new_cut) + custom_js
66
  return original_sentence, new_cut, clickable
67
 
68
- # --- Gradio ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ
69
  with gr.Blocks() as demo:
70
  with gr.Row():
71
  inp = gr.Textbox(label="Enter text", placeholder="๋ฌธ์žฅ์„ ์ž…๋ ฅํ•˜์„ธ์š”...")
72
  start_btn = gr.Button("Start")
73
  # ์ƒ๋‹จ ์ŠคํŠธ๋ฆฌ๋ฐ ํ…์ŠคํŠธ ์ถœ๋ ฅ ์˜์—ญ
74
  stream_box = gr.Textbox(label="Streaming Text", interactive=False)
75
- # ํ˜„์žฌ ์ƒํƒœ(์ž˜๋ฆฐ ํ›„์˜ ๋ฌธ์žฅ)๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋ฒ„ํŠผ
76
  stream_btn = gr.Button("Restart Streaming")
77
- # ํ•˜๋‹จ ์›๋ณธ ๋ฌธ์žฅ์„ HTML๋กœ ํ‘œ์‹œ (๊ฐ ๊ธ€์ž๊ฐ€ ํด๋ฆญ ๊ฐ€๋Šฅ)
78
  clickable_display = gr.HTML(label="Clickable Text")
79
 
80
- # ์•„๋ž˜ ๋‘ ์ปดํฌ๋„ŒํŠธ๋Š” HTML ๋‚ด JavaScript์™€ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉ (์ˆจ๊น€)
81
  click_index = gr.Textbox(visible=False, elem_id="click_index")
82
  trigger_button = gr.Button("trigger", visible=False, elem_id="trigger_button")
83
 
@@ -85,26 +76,27 @@ with gr.Blocks() as demo:
85
  original_sentence_state = gr.State("")
86
  current_cut_state = gr.State(0)
87
 
88
- # โ‘  "Start" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ: ์ž…๋ ฅ ๋ฌธ์žฅ์„ ์ƒํƒœ์— ์ €์žฅํ•˜๊ณ  ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ํ•˜๋‹จ HTML์„ ์ดˆ๊ธฐํ™”
89
  start_btn.click(
90
  start_sentence,
91
  inputs=inp,
92
  outputs=[stream_box, original_sentence_state, current_cut_state, clickable_display]
93
  )
94
 
95
- # โ‘ก HTML ๋‚ด ๊ธ€์ž ํด๋ฆญ โ†’ ์ˆจ๊ฒจ์ง„ trigger_button ํด๋ฆญ ์‹œ: update_cut ํ•จ์ˆ˜ ์‹คํ–‰
96
  trigger_button.click(
97
  update_cut,
98
  inputs=[click_index, original_sentence_state, current_cut_state],
99
  outputs=[original_sentence_state, current_cut_state, clickable_display]
100
  )
101
 
102
- # โ‘ข "Restart Streaming" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ: ํ˜„์žฌ ์ƒํƒœ์˜ ๋ฌธ์žฅ(์ž˜๋ฆฐ ํ›„)์„ ์ŠคํŠธ๋ฆฌ๋ฐ
 
103
  stream_btn.click(
104
  stream_current,
105
  inputs=[original_sentence_state, current_cut_state],
106
- outputs=stream_box,
107
- stream=True
108
  )
109
 
110
  demo.launch()
 
 
1
  import time
2
  import gradio as gr
3
 
4
+ # ํ•œ ๊ธ€์ž์”ฉ ์ŠคํŠธ๋ฆฌ๋ฐ ์ถœ๋ ฅ (ํƒ€์ดํ•‘ ํšจ๊ณผ)
5
  def stream_text(text):
6
  out = ""
7
  for ch in text:
 
9
  time.sleep(0.05) # ๊ธ€์ž๋‹น ์ง€์—ฐ (0.05์ดˆ)
10
  yield out
11
 
12
+ # ์›๋ณธ ๋ฌธ์žฅ์„ HTML๋กœ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
 
 
13
  def get_clickable_html(sentence, cut_index=0):
14
  html = "<div style='font-size:24px; font-family: monospace;'>"
15
  for i, ch in enumerate(sentence):
16
  if i < cut_index:
17
+ # ์ด๋ฏธ ์ž˜๋ฆฐ ๋ถ€๋ถ„: ํšŒ์ƒ‰ ํ‘œ์‹œ
18
  html += f"<span style='color:gray;'>{ch}</span>"
19
  elif i == cut_index:
20
+ # ํ˜„์žฌ ์ปท ์œ„์น˜: ํŒŒ๋ž€์ƒ‰์— โœ‚๏ธ ์ด๋ชจํ‹ฐ์ฝ˜ ํ‘œ์‹œ
21
  html += f"<span style='cursor:pointer; color:blue;' onclick='handleClick({i})'>{ch}โœ‚๏ธ</span>"
22
  else:
23
+ # ์•„์ง ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„
24
  html += f"<span style='cursor:pointer;' onclick='handleClick({i})'>{ch}</span>"
25
  html += "</div>"
26
  return html
27
 
28
+ # HTML์— ์‚ฝ์ž…ํ•  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
29
  custom_js = """
30
  <script>
31
  function handleClick(index) {
 
 
32
  document.getElementById("click_index").value = index;
33
  document.getElementById("trigger_button").click();
34
  }
35
  </script>
36
  """
37
 
38
+ # "Start" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
 
 
39
  def start_sentence(text):
40
  current_cut = 0
41
  clickable = get_clickable_html(text, current_cut) + custom_js
42
+ # ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์ „์ฒด ๋ฌธ์žฅ์„ ํ•œ ๊ธ€์ž์”ฉ ์ถœ๋ ฅ
43
  return stream_text(text), text, current_cut, clickable
44
 
45
+ # "Restart Streaming" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
 
46
  def stream_current(original_sentence, current_cut):
47
  new_text = original_sentence[current_cut:]
48
  return stream_text(new_text)
49
 
50
+ # HTML์˜ ํŠน์ • ๊ธ€์ž๋ฅผ ํด๋ฆญํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜
 
 
51
  def update_cut(index, original_sentence, current_cut):
52
  index = int(index)
53
  new_cut = current_cut
 
56
  clickable = get_clickable_html(original_sentence, new_cut) + custom_js
57
  return original_sentence, new_cut, clickable
58
 
59
+ # Gradio ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ
60
  with gr.Blocks() as demo:
61
  with gr.Row():
62
  inp = gr.Textbox(label="Enter text", placeholder="๋ฌธ์žฅ์„ ์ž…๋ ฅํ•˜์„ธ์š”...")
63
  start_btn = gr.Button("Start")
64
  # ์ƒ๋‹จ ์ŠคํŠธ๋ฆฌ๋ฐ ํ…์ŠคํŠธ ์ถœ๋ ฅ ์˜์—ญ
65
  stream_box = gr.Textbox(label="Streaming Text", interactive=False)
66
+ # ํ˜„์žฌ ์ƒํƒœ์˜ ๋ฌธ์žฅ์„ ๋‹ค์‹œ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋ฒ„ํŠผ
67
  stream_btn = gr.Button("Restart Streaming")
68
+ # ํ•˜๋‹จ ์›๋ณธ ๋ฌธ์žฅ์„ HTML๋กœ ํ‘œ์‹œ (๊ฐ ๊ธ€์ž ํด๋ฆญ ๊ฐ€๋Šฅ)
69
  clickable_display = gr.HTML(label="Clickable Text")
70
 
71
+ # HTML ๋‚ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ์—ฐ๋™ํ•  ์ˆจ๊ฒจ์ง„ ์ปดํฌ๋„ŒํŠธ๋“ค
72
  click_index = gr.Textbox(visible=False, elem_id="click_index")
73
  trigger_button = gr.Button("trigger", visible=False, elem_id="trigger_button")
74
 
 
76
  original_sentence_state = gr.State("")
77
  current_cut_state = gr.State(0)
78
 
79
+ # โ‘  "Start" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ: ์ž…๋ ฅ ๋ฌธ์žฅ์„ ์ƒํƒœ์— ๏ฟฝ๏ฟฝ๏ฟฝ์žฅํ•˜๊ณ  ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ํ•˜๋‹จ HTML ์ดˆ๊ธฐํ™”
80
  start_btn.click(
81
  start_sentence,
82
  inputs=inp,
83
  outputs=[stream_box, original_sentence_state, current_cut_state, clickable_display]
84
  )
85
 
86
+ # โ‘ก HTML ๋‚ด ๊ธ€์ž ํด๋ฆญ โ†’ ์ˆจ๊ฒจ์ง„ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ: update_cut ํ•จ์ˆ˜ ์‹คํ–‰
87
  trigger_button.click(
88
  update_cut,
89
  inputs=[click_index, original_sentence_state, current_cut_state],
90
  outputs=[original_sentence_state, current_cut_state, clickable_display]
91
  )
92
 
93
+ # โ‘ข "Restart Streaming" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ: ํ˜„์žฌ ์ƒํƒœ(์ž˜๋ฆฐ ํ›„์˜ ๋ฌธ์žฅ)๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐ
94
+ # ์—ฌ๊ธฐ์„œ stream ์ธ์ˆ˜(stream=True)๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
95
  stream_btn.click(
96
  stream_current,
97
  inputs=[original_sentence_state, current_cut_state],
98
+ outputs=stream_box
 
99
  )
100
 
101
  demo.launch()
102
+