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

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +110 -0
app.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time
2
+ import gradio as gr
3
+
4
+ # --- ์ŠคํŠธ๋ฆฌ๋ฐ ํ•จ์ˆ˜: ํ•œ ๊ธ€์ž์”ฉ ์ถœ๋ ฅ (ํƒ€์ดํ•‘ ํšจ๊ณผ)
5
+ def stream_text(text):
6
+ out = ""
7
+ for ch in text:
8
+ out += ch
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
63
+ if index > current_cut:
64
+ new_cut = index
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
+
84
+ # ์›๋ณธ ๋ฌธ์žฅ๊ณผ ํ˜„์žฌ ์ปท ์ธ๋ฑ์Šค๋ฅผ ์ƒํƒœ๋กœ ์ €์žฅ
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()