Tran commited on
Commit
3960baa
·
verified ·
1 Parent(s): bfb4592

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +210 -210
app.py CHANGED
@@ -1,210 +1,210 @@
1
- import spaces
2
- from kokoro import KModel, KPipeline
3
- import gradio as gr
4
- import os
5
- import random
6
- import torch
7
-
8
- IS_DUPLICATE = not os.getenv('SPACE_ID', '').startswith('testnhe/')
9
- CUDA_AVAILABLE = torch.cuda.is_available()
10
- if not IS_DUPLICATE:
11
- import kokoro
12
- import misaki
13
- print('DEBUG', kokoro.__version__, CUDA_AVAILABLE, misaki.__version__)
14
-
15
- CHAR_LIMIT = None if IS_DUPLICATE else 5000
16
- models = {gpu: KModel().to('cuda' if gpu else 'cpu').eval() for gpu in [False] + ([True] if CUDA_AVAILABLE else [])}
17
- pipelines = {lang_code: KPipeline(lang_code=lang_code, model=False) for lang_code in 'ab'}
18
- pipelines['a'].g2p.lexicon.golds['kokoro'] = 'kˈOkəɹO'
19
- pipelines['b'].g2p.lexicon.golds['kokoro'] = 'kˈQkəɹQ'
20
-
21
- @spaces.GPU(duration=30)
22
- def forward_gpu(ps, ref_s, speed):
23
- return models[True](ps, ref_s, speed)
24
-
25
- def generate_first(text, voice='af_heart', speed=1, use_gpu=CUDA_AVAILABLE):
26
- text = text if CHAR_LIMIT is None else text.strip()[:CHAR_LIMIT]
27
- pipeline = pipelines[voice[0]]
28
- pack = pipeline.load_voice(voice)
29
- use_gpu = use_gpu and CUDA_AVAILABLE
30
- for _, ps, _ in pipeline(text, voice, speed):
31
- ref_s = pack[len(ps)-1]
32
- try:
33
- if use_gpu:
34
- audio = forward_gpu(ps, ref_s, speed)
35
- else:
36
- audio = models[False](ps, ref_s, speed)
37
- except gr.exceptions.Error as e:
38
- if use_gpu:
39
- gr.Warning(str(e))
40
- gr.Info('Đang thử lại với CPU. Để tránh lỗi này, hãy đổi Hardware thành CPU.')
41
- audio = models[False](ps, ref_s, speed)
42
- else:
43
- raise gr.Error(e)
44
- return (24000, audio.numpy()), ps
45
- return None, ''
46
-
47
- # Arena API
48
- def predict(text, voice='af_heart', speed=1):
49
- return generate_first(text, voice, speed, use_gpu=False)[0]
50
-
51
- def tokenize_first(text, voice='af_heart'):
52
- pipeline = pipelines[voice[0]]
53
- for _, ps, _ in pipeline(text, voice):
54
- return ps
55
- return ''
56
-
57
- def generate_all(text, voice='af_heart', speed=1, use_gpu=CUDA_AVAILABLE):
58
- text = text if CHAR_LIMIT is None else text.strip()[:CHAR_LIMIT]
59
- pipeline = pipelines[voice[0]]
60
- pack = pipeline.load_voice(voice)
61
- use_gpu = use_gpu and CUDA_AVAILABLE
62
- first = True
63
- for _, ps, _ in pipeline(text, voice, speed):
64
- ref_s = pack[len(ps)-1]
65
- try:
66
- if use_gpu:
67
- audio = forward_gpu(ps, ref_s, speed)
68
- else:
69
- audio = models[False](ps, ref_s, speed)
70
- except gr.exceptions.Error as e:
71
- if use_gpu:
72
- gr.Warning(str(e))
73
- gr.Info('Chuyển sang CPU')
74
- audio = models[False](ps, ref_s, speed)
75
- else:
76
- raise gr.Error(e)
77
- yield 24000, audio.numpy()
78
- if first:
79
- first = False
80
- yield 24000, torch.zeros(1).numpy()
81
-
82
- with open('en.txt', 'r') as r:
83
- random_quotes = [line.strip() for line in r]
84
-
85
- def get_random_quote():
86
- return random.choice(random_quotes)
87
-
88
- def get_gatsby():
89
- with open('gatsby5k.md', 'r') as r:
90
- return r.read().strip()
91
-
92
- def get_frankenstein():
93
- with open('frankenstein5k.md', 'r') as r:
94
- return r.read().strip()
95
-
96
- CHOICES = {
97
- '🇺🇸 👩 Heart ❤️ (Mỹ)': 'af_heart',
98
- '🇺🇸 👩 Bella 🔥 (Mỹ)': 'af_bella',
99
- '🇺🇸 👩 Nicole 🎧 (Mỹ)': 'af_nicole',
100
- '🇺🇸 👩 Aoede (Mỹ)': 'af_aoede',
101
- '🇺🇸 👩 Kore (Mỹ)': 'af_kore',
102
- '🇺🇸 👩 Sarah (Mỹ)': 'af_sarah',
103
- '🇺🇸 👩 Nova (Mỹ)': 'af_nova',
104
- '🇺🇸 👩 Sky (Mỹ)': 'af_sky',
105
- '🇺🇸 👩 Alloy (Mỹ)': 'af_alloy',
106
- '🇺🇸 👩 Jessica (Mỹ)': 'af_jessica',
107
- '🇺🇸 👩 River (Mỹ)': 'af_river',
108
-
109
- '🇺🇸 👨 Michael (Mỹ)': 'am_michael',
110
- '🇺🇸 👨 Fenrir (Mỹ)': 'am_fenrir',
111
- '🇺🇸 👨 Puck (Mỹ)': 'am_puck',
112
- '🇺🇸 👨 Echo (Mỹ)': 'am_echo',
113
- '🇺🇸 👨 Eric (Mỹ)': 'am_eric',
114
- '🇺🇸 👨 Liam (Mỹ)': 'am_liam',
115
- '🇺🇸 👨 Onyx (Mỹ)': 'am_onyx',
116
- '🇺🇸 👨 Santa (Mỹ)': 'am_santa',
117
- '🇺🇸 👨 Adam (Mỹ)': 'am_adam',
118
-
119
- '🇬🇧 👩 Emma (Anh)': 'bf_emma',
120
- '🇬🇧 👩 Isabella (Anh)': 'bf_isabella',
121
- '🇬🇧 👩 Alice (Anh)': 'bf_alice',
122
- '🇬🇧 👩 Lily (Anh)': 'bf_lily',
123
-
124
- '🇬🇧 👨 George (Anh)': 'bm_george',
125
- '🇬🇧 👨 Fable (Anh)': 'bm_fable',
126
- '🇬🇧 👨 Lewis (Anh)': 'bm_lewis',
127
- '🇬🇧 👨 Daniel (Anh)': 'bm_daniel',
128
-
129
- }
130
- for v in CHOICES.values():
131
- pipelines[v[0]].load_voice(v)
132
-
133
- TOKEN_NOTE = '''
134
- 💡 Bạn có thể tùy chỉnh cách phát âm bằng cú pháp liên kết Markdown và các dấu gạch chéo, ví dụ như [Kokoro](/kˈOkəɹO/)
135
-
136
- 💬 Để điều chỉnh ngữ điệu, hãy thử thêm các dấu câu ;:,.!?—…"()“” hoặc ký hiệu nhấn trọng âm ˈ và ˌ
137
-
138
- ⬇️ Giảm mức độ nhấn trọng âm: [1 mức](-1) hoặc [2 mức](-2)
139
-
140
- ⬆️ Tăng mức độ nhấn trọng âm: [hoặc](+2) (tăng 1 cấp độ) hoặc 2 cấp độ (chỉ áp dụng cho những từ ít nhấn, thường là những từ ngắn)
141
- '''
142
-
143
- with gr.Blocks() as generate_tab:
144
- out_audio = gr.Audio(label='Đầu ra âm thanh', interactive=False, streaming=False, autoplay=True)
145
- generate_btn = gr.Button('Chuyển đổi', variant='primary')
146
- with gr.Accordion('Tokens đầu ra', open=True):
147
- out_ps = gr.Textbox(interactive=False, show_label=False, info='Tokens được sử dụng để tạo âm thanh, có độ dài ngữ cảnh 510 Tokens.')
148
- tokenize_btn = gr.Button('Tokenize', variant='secondary')
149
- gr.Markdown(TOKEN_NOTE)
150
- predict_btn = gr.Button('Predict', variant='secondary', visible=False)
151
-
152
- STREAM_NOTE = ['⚠️ Có một lỗi Gradio chưa xác định có thể khiến âm thanh không phát ra khi bạn nhấp vào `Trực Tiếp` lần đầu tiên.']
153
- if CHAR_LIMIT is not None:
154
- STREAM_NOTE.append(f'✂️ Mỗi luồng được giới hạn ở {CHAR_LIMIT} ký tự.')
155
- STREAM_NOTE.append('🚀 Bạn muốn có thêm nhân vật? Bạn có thể [sử dụng TTS-82M trực tiếp](https://huggingface.co/spaces/testnhe/TTS-82M) hoặc sao chép không gian này:')
156
- STREAM_NOTE = '\n\n'.join(STREAM_NOTE)
157
-
158
- with gr.Blocks() as stream_tab:
159
- out_stream = gr.Audio(label='Luồng âm thanh đầu ra', interactive=False, streaming=True, autoplay=True)
160
- with gr.Row():
161
- stream_btn = gr.Button('Trực Tiếp', variant='primary')
162
- stop_btn = gr.Button('Dừng', variant='stop')
163
- with gr.Accordion('Note', open=True):
164
- gr.Markdown(STREAM_NOTE)
165
- gr.DuplicateButton()
166
-
167
- BANNER_TEXT = '''
168
- [***TTS-82M*** **là mô hình TTS có trọng số mở với 82 triệu tham số.**](https://huggingface.co/spaces/testnhe/TTS-82M)
169
-
170
- Bản này chỉ tiếng Anh, nhưng bạn có thể sử dụng trực tiếp mô hình để truy cập các ngôn ngữ khác.
171
- '''
172
- API_OPEN = os.getenv('SPACE_ID') != 'testnhe/TTS-82M'
173
- API_NAME = None if API_OPEN else False
174
- with gr.Blocks() as app:
175
- with gr.Row():
176
- gr.Markdown(BANNER_TEXT, container=True)
177
- with gr.Row():
178
- with gr.Column():
179
- text = gr.Textbox(label='Văn bản đầu vào', info=f"Tối đa ~500 ký tự cho mỗi lần tạo hoặc {'∞' if CHAR_LIMIT is None else CHAR_LIMIT} ký tự trên mỗi luồng")
180
- with gr.Row():
181
- voice = gr.Dropdown(list(CHOICES.items()), value='af_heart', label='Giọng', info='Chất lượng và tính khả dụng thay đổi tùy theo ngôn ngữ')
182
- use_gpu = gr.Dropdown(
183
- [('ZeroGPU 🚀', True), ('CPU 🐌', False)],
184
- value=CUDA_AVAILABLE,
185
- label='Phần cứng',
186
- info='GPU thường nhanh hơn nhưng có hạn ngạch sử dụng',
187
- interactive=CUDA_AVAILABLE
188
- )
189
- speed = gr.Slider(minimum=0.5, maximum=2, value=1, step=0.1, label='Tốc độ')
190
- random_btn = gr.Button('🎲 Trích dẫn ngẫu nhiên 💬', variant='secondary')
191
- with gr.Row():
192
- gatsby_btn = gr.Button('🥂 Ngẫu nhiên văn bản dài (Có phát âm) 📕', variant='secondary')
193
- frankenstein_btn = gr.Button('💀 Ngẫu nhiên văn bản dài 📗', variant='secondary')
194
- with gr.Column():
195
- gr.TabbedInterface([generate_tab, stream_tab], ['Chuyển đổi', 'Trực Tiếp'])
196
- random_btn.click(fn=get_random_quote, inputs=[], outputs=[text], api_name=API_NAME)
197
- gatsby_btn.click(fn=get_gatsby, inputs=[], outputs=[text], api_name=API_NAME)
198
- frankenstein_btn.click(fn=get_frankenstein, inputs=[], outputs=[text], api_name=API_NAME)
199
- generate_btn.click(fn=generate_first, inputs=[text, voice, speed, use_gpu], outputs=[out_audio, out_ps], api_name=API_NAME)
200
- tokenize_btn.click(fn=tokenize_first, inputs=[text, voice], outputs=[out_ps], api_name=API_NAME)
201
- stream_event = stream_btn.click(fn=generate_all, inputs=[text, voice, speed, use_gpu], outputs=[out_stream], api_name=API_NAME)
202
- stop_btn.click(fn=None, cancels=stream_event)
203
- predict_btn.click(fn=predict, inputs=[text, voice, speed], outputs=[out_audio], api_name=API_NAME)
204
-
205
- if __name__ == '__main__':
206
- #Local
207
- #app.queue(api_open=API_OPEN).launch(show_api=API_OPEN, ssr_mode=True)
208
- #Colab
209
- app.queue(api_open=API_OPEN).launch(show_api=API_OPEN, ssr_mode=True, share=True)
210
-
 
1
+ import spaces
2
+ from kokoro import KModel, KPipeline
3
+ import gradio as gr
4
+ import os
5
+ import random
6
+ import torch
7
+
8
+ IS_DUPLICATE = not os.getenv('SPACE_ID', '').startswith('testnhe/')
9
+ CUDA_AVAILABLE = torch.cuda.is_available()
10
+ if not IS_DUPLICATE:
11
+ import kokoro
12
+ import misaki
13
+ print('DEBUG', kokoro.__version__, CUDA_AVAILABLE, misaki.__version__)
14
+
15
+ CHAR_LIMIT = None if IS_DUPLICATE else 5000
16
+ models = {gpu: KModel().to('cuda' if gpu else 'cpu').eval() for gpu in [False] + ([True] if CUDA_AVAILABLE else [])}
17
+ pipelines = {lang_code: KPipeline(lang_code=lang_code, model=False) for lang_code in 'ab'}
18
+ pipelines['a'].g2p.lexicon.golds['kokoro'] = 'kˈOkəɹO'
19
+ pipelines['b'].g2p.lexicon.golds['kokoro'] = 'kˈQkəɹQ'
20
+
21
+ @spaces.GPU(duration=30)
22
+ def forward_gpu(ps, ref_s, speed):
23
+ return models[True](ps, ref_s, speed)
24
+
25
+ def generate_first(text, voice='af_heart', speed=1, use_gpu=CUDA_AVAILABLE):
26
+ text = text if CHAR_LIMIT is None else text.strip()[:CHAR_LIMIT]
27
+ pipeline = pipelines[voice[0]]
28
+ pack = pipeline.load_voice(voice)
29
+ use_gpu = use_gpu and CUDA_AVAILABLE
30
+ for _, ps, _ in pipeline(text, voice, speed):
31
+ ref_s = pack[len(ps)-1]
32
+ try:
33
+ if use_gpu:
34
+ audio = forward_gpu(ps, ref_s, speed)
35
+ else:
36
+ audio = models[False](ps, ref_s, speed)
37
+ except gr.exceptions.Error as e:
38
+ if use_gpu:
39
+ gr.Warning(str(e))
40
+ gr.Info('Đang thử lại với CPU. Để tránh lỗi này, hãy đổi Hardware thành CPU.')
41
+ audio = models[False](ps, ref_s, speed)
42
+ else:
43
+ raise gr.Error(e)
44
+ return (24000, audio.numpy()), ps
45
+ return None, ''
46
+
47
+ # Arena API
48
+ def predict(text, voice='af_heart', speed=1):
49
+ return generate_first(text, voice, speed, use_gpu=False)[0]
50
+
51
+ def tokenize_first(text, voice='af_heart'):
52
+ pipeline = pipelines[voice[0]]
53
+ for _, ps, _ in pipeline(text, voice):
54
+ return ps
55
+ return ''
56
+
57
+ def generate_all(text, voice='af_heart', speed=1, use_gpu=CUDA_AVAILABLE):
58
+ text = text if CHAR_LIMIT is None else text.strip()[:CHAR_LIMIT]
59
+ pipeline = pipelines[voice[0]]
60
+ pack = pipeline.load_voice(voice)
61
+ use_gpu = use_gpu and CUDA_AVAILABLE
62
+ first = True
63
+ for _, ps, _ in pipeline(text, voice, speed):
64
+ ref_s = pack[len(ps)-1]
65
+ try:
66
+ if use_gpu:
67
+ audio = forward_gpu(ps, ref_s, speed)
68
+ else:
69
+ audio = models[False](ps, ref_s, speed)
70
+ except gr.exceptions.Error as e:
71
+ if use_gpu:
72
+ gr.Warning(str(e))
73
+ gr.Info('Chuyển sang CPU')
74
+ audio = models[False](ps, ref_s, speed)
75
+ else:
76
+ raise gr.Error(e)
77
+ yield 24000, audio.numpy()
78
+ if first:
79
+ first = False
80
+ yield 24000, torch.zeros(1).numpy()
81
+
82
+ with open('en.txt', 'r') as r:
83
+ random_quotes = [line.strip() for line in r]
84
+
85
+ def get_random_quote():
86
+ return random.choice(random_quotes)
87
+
88
+ def get_gatsby():
89
+ with open('gatsby5k.md', 'r') as r:
90
+ return r.read().strip()
91
+
92
+ def get_frankenstein():
93
+ with open('frankenstein5k.md', 'r') as r:
94
+ return r.read().strip()
95
+
96
+ CHOICES = {
97
+ '🇺🇸 👩 Heart ❤️ (Mỹ)': 'af_heart',
98
+ '🇺🇸 👩 Bella 🔥 (Mỹ)': 'af_bella',
99
+ '🇺🇸 👩 Nicole 🎧 (Mỹ)': 'af_nicole',
100
+ '🇺🇸 👩 Aoede (Mỹ)': 'af_aoede',
101
+ '🇺🇸 👩 Kore (Mỹ)': 'af_kore',
102
+ '🇺🇸 👩 Sarah (Mỹ)': 'af_sarah',
103
+ '🇺🇸 👩 Nova (Mỹ)': 'af_nova',
104
+ '🇺🇸 👩 Sky (Mỹ)': 'af_sky',
105
+ '🇺🇸 👩 Alloy (Mỹ)': 'af_alloy',
106
+ '🇺🇸 👩 Jessica (Mỹ)': 'af_jessica',
107
+ '🇺🇸 👩 River (Mỹ)': 'af_river',
108
+
109
+ '🇺🇸 👨 Michael (Mỹ)': 'am_michael',
110
+ '🇺🇸 👨 Fenrir (Mỹ)': 'am_fenrir',
111
+ '🇺🇸 👨 Puck (Mỹ)': 'am_puck',
112
+ '🇺🇸 👨 Echo (Mỹ)': 'am_echo',
113
+ '🇺🇸 👨 Eric (Mỹ)': 'am_eric',
114
+ '🇺🇸 👨 Liam (Mỹ)': 'am_liam',
115
+ '🇺🇸 👨 Onyx (Mỹ)': 'am_onyx',
116
+ '🇺🇸 👨 Santa (Mỹ)': 'am_santa',
117
+ '🇺🇸 👨 Adam (Mỹ)': 'am_adam',
118
+
119
+ '🇬🇧 👩 Emma (Anh)': 'bf_emma',
120
+ '🇬🇧 👩 Isabella (Anh)': 'bf_isabella',
121
+ '🇬🇧 👩 Alice (Anh)': 'bf_alice',
122
+ '🇬🇧 👩 Lily (Anh)': 'bf_lily',
123
+
124
+ '🇬🇧 👨 George (Anh)': 'bm_george',
125
+ '🇬🇧 👨 Fable (Anh)': 'bm_fable',
126
+ '🇬🇧 👨 Lewis (Anh)': 'bm_lewis',
127
+ '🇬🇧 👨 Daniel (Anh)': 'bm_daniel',
128
+
129
+ }
130
+ for v in CHOICES.values():
131
+ pipelines[v[0]].load_voice(v)
132
+
133
+ TOKEN_NOTE = '''
134
+ 💡 Bạn có thể tùy chỉnh cách phát âm bằng cú pháp liên kết Markdown và các dấu gạch chéo, ví dụ như [Kokoro](/kˈOkəɹO/)
135
+
136
+ 💬 Để điều chỉnh ngữ điệu, hãy thử thêm các dấu câu ;:,.!?—…"()“” hoặc ký hiệu nhấn trọng âm ˈ và ˌ
137
+
138
+ ⬇️ Giảm mức độ nhấn trọng âm: [1 mức](-1) hoặc [2 mức](-2)
139
+
140
+ ⬆️ Tăng mức độ nhấn trọng âm: [hoặc](+2) (tăng 1 cấp độ) hoặc 2 cấp độ (chỉ áp dụng cho những từ ít nhấn, thường là những từ ngắn)
141
+ '''
142
+
143
+ with gr.Blocks() as generate_tab:
144
+ out_audio = gr.Audio(label='Đầu ra âm thanh', interactive=False, streaming=False, autoplay=True)
145
+ generate_btn = gr.Button('Chuyển đổi', variant='primary')
146
+ with gr.Accordion('Tokens đầu ra', open=True):
147
+ out_ps = gr.Textbox(interactive=False, show_label=False, info='Tokens được sử dụng để tạo âm thanh, có độ dài ngữ cảnh 510 Tokens.')
148
+ tokenize_btn = gr.Button('Tokenize', variant='secondary')
149
+ gr.Markdown(TOKEN_NOTE)
150
+ predict_btn = gr.Button('Predict', variant='secondary', visible=False)
151
+
152
+ STREAM_NOTE = ['⚠️ Có một lỗi Gradio chưa xác định có thể khiến âm thanh không phát ra khi bạn nhấp vào `Trực Tiếp` lần đầu tiên.']
153
+ if CHAR_LIMIT is not None:
154
+ STREAM_NOTE.append(f'✂️ Mỗi luồng được giới hạn ở {CHAR_LIMIT} ký tự.')
155
+ STREAM_NOTE.append('🚀 Bạn muốn có thêm nhân vật? Bạn có thể [sử dụng TTS-82M trực tiếp](https://huggingface.co/spaces/testnhe/TTS-82M) hoặc sao chép không gian này:')
156
+ STREAM_NOTE = '\n\n'.join(STREAM_NOTE)
157
+
158
+ with gr.Blocks() as stream_tab:
159
+ out_stream = gr.Audio(label='Đầu ra âm thanh', interactive=False, streaming=True, autoplay=True)
160
+ with gr.Row():
161
+ stream_btn = gr.Button('Chuyển đổi', variant='primary')
162
+ stop_btn = gr.Button('Dừng', variant='stop')
163
+ with gr.Accordion('Note', open=True):
164
+ gr.Markdown(STREAM_NOTE)
165
+ gr.DuplicateButton()
166
+
167
+ BANNER_TEXT = '''
168
+ [***TTS-82M*** **là mô hình TTS có trọng số mở với 82 triệu tham số bởi LTTEAM.**](https://www.facebook.com/groups/622526090937760)
169
+
170
+ Bản này chỉ tiếng Anh phát triển bởi [**LTTEAM**](https://www.facebook.com/groups/622526090937760), nhưng bạn có thể sử dụng trực tiếp mô hình để truy cập các ngôn ngữ khác.
171
+ '''
172
+ API_OPEN = os.getenv('SPACE_ID') != 'testnhe/TTS-82M'
173
+ API_NAME = None if API_OPEN else False
174
+ with gr.Blocks() as app:
175
+ with gr.Row():
176
+ gr.Markdown(BANNER_TEXT, container=True)
177
+ with gr.Row():
178
+ with gr.Column():
179
+ text = gr.Textbox(label='Văn bản đầu vào', info=f"Tối đa ~500 ký tự cho mỗi lần tạo hoặc {'∞' if CHAR_LIMIT is None else CHAR_LIMIT} ký tự trên mỗi luồng")
180
+ with gr.Row():
181
+ voice = gr.Dropdown(list(CHOICES.items()), value='af_heart', label='Giọng', info='Chất lượng và tính khả dụng thay đổi tùy theo ngôn ngữ')
182
+ use_gpu = gr.Dropdown(
183
+ [('ZeroGPU (Nhanh)', True), ('CPU (Chậm)', False)],
184
+ value=CUDA_AVAILABLE,
185
+ label='Phần cứng',
186
+ info='GPU thường nhanh hơn nhưng có hạn ngạch sử dụng',
187
+ interactive=CUDA_AVAILABLE
188
+ )
189
+ speed = gr.Slider(minimum=0.5, maximum=2, value=1, step=0.1, label='Tốc độ')
190
+ random_btn = gr.Button('🎲 Trích dẫn ngẫu nhiên', variant='secondary')
191
+ with gr.Row():
192
+ gatsby_btn = gr.Button('🎲 Ngẫu nhiên văn bản dài (Có phát âm)', variant='secondary')
193
+ frankenstein_btn = gr.Button('🎲 Ngẫu nhiên văn bản dài', variant='secondary')
194
+ with gr.Column():
195
+ gr.TabbedInterface([generate_tab, stream_tab], ['Chuyển đổi', 'Trực Tiếp'])
196
+ random_btn.click(fn=get_random_quote, inputs=[], outputs=[text], api_name=API_NAME)
197
+ gatsby_btn.click(fn=get_gatsby, inputs=[], outputs=[text], api_name=API_NAME)
198
+ frankenstein_btn.click(fn=get_frankenstein, inputs=[], outputs=[text], api_name=API_NAME)
199
+ generate_btn.click(fn=generate_first, inputs=[text, voice, speed, use_gpu], outputs=[out_audio, out_ps], api_name=API_NAME)
200
+ tokenize_btn.click(fn=tokenize_first, inputs=[text, voice], outputs=[out_ps], api_name=API_NAME)
201
+ stream_event = stream_btn.click(fn=generate_all, inputs=[text, voice, speed, use_gpu], outputs=[out_stream], api_name=API_NAME)
202
+ stop_btn.click(fn=None, cancels=stream_event)
203
+ predict_btn.click(fn=predict, inputs=[text, voice, speed], outputs=[out_audio], api_name=API_NAME)
204
+
205
+ if __name__ == '__main__':
206
+ #Local
207
+ #app.queue(api_open=API_OPEN).launch(show_api=API_OPEN, ssr_mode=True)
208
+ #Colab
209
+ app.queue(api_open=API_OPEN).launch(show_api=API_OPEN, ssr_mode=True, share=True)
210
+