

feat: add mvp client which runs in the background
@08beefa9283b2c667636335e945230c9c19dc53b
--- pyproject.toml
+++ pyproject.toml
... | ... | @@ -14,11 +14,21 @@ |
14 | 14 |
"httpx-sse", |
15 | 15 |
"httpx", |
16 | 16 |
"gradio", |
17 |
- "openai" |
|
17 |
+ "openai", |
|
18 | 18 |
] |
19 | 19 |
|
20 | 20 |
[project.optional-dependencies] |
21 |
-dev = ["ruff==0.5.3", "pytest", "webvtt-py", "srt", "basedpyright==1.13.0", "pytest-xdist"] |
|
21 |
+client = [ |
|
22 |
+ "keyboard", |
|
23 |
+] |
|
24 |
+dev = [ |
|
25 |
+ "ruff==0.5.3", |
|
26 |
+ "pytest", |
|
27 |
+ "webvtt-py", |
|
28 |
+ "srt", |
|
29 |
+ "basedpyright==1.13.0", |
|
30 |
+ "pytest-xdist" |
|
31 |
+] |
|
22 | 32 |
|
23 | 33 |
other = ["youtube-dl @ git+https://github.com/ytdl-org/youtube-dl.git@37cea84f775129ad715b9bcd617251c831fcc980", "aider-chat==0.39.0"] |
24 | 34 |
|
... | ... | @@ -58,7 +68,8 @@ |
58 | 68 |
"T201", # print |
59 | 69 |
"TRY003", |
60 | 70 |
"W505", |
61 |
- "ISC001" # recommended to disable for formatting |
|
71 |
+ "ISC001", # recommended to disable for formatting |
|
72 |
+ "INP001", |
|
62 | 73 |
] |
63 | 74 |
|
64 | 75 |
[tool.ruff.lint.isort] |
--- requirements-all.txt
+++ requirements-all.txt
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 |
altair==5.3.0 |
16 | 16 |
# via |
17 | 17 |
# aider-chat |
18 |
- # gradio |
|
19 | 18 |
# streamlit |
20 | 19 |
annotated-types==0.7.0 |
21 | 20 |
# via |
... | ... | @@ -24,17 +23,17 @@ |
24 | 23 |
anyio==4.4.0 |
25 | 24 |
# via |
26 | 25 |
# aider-chat |
26 |
+ # gradio |
|
27 | 27 |
# httpx |
28 | 28 |
# openai |
29 | 29 |
# starlette |
30 |
- # watchfiles |
|
31 | 30 |
attrs==23.2.0 |
32 | 31 |
# via |
33 | 32 |
# aider-chat |
34 | 33 |
# aiohttp |
35 | 34 |
# jsonschema |
36 | 35 |
# referencing |
37 |
-av==12.2.0 |
|
36 |
+av==12.3.0 |
|
38 | 37 |
# via faster-whisper |
39 | 38 |
backoff==2.2.1 |
40 | 39 |
# via aider-chat |
... | ... | @@ -91,21 +90,15 @@ |
91 | 90 |
# via |
92 | 91 |
# aider-chat |
93 | 92 |
# openai |
94 |
-dnspython==2.6.1 |
|
95 |
- # via email-validator |
|
96 |
-email-validator==2.2.0 |
|
97 |
- # via fastapi |
|
98 | 93 |
execnet==2.1.1 |
99 | 94 |
# via pytest-xdist |
100 |
-fastapi==0.111.1 |
|
95 |
+fastapi==0.112.2 |
|
101 | 96 |
# via |
102 | 97 |
# faster-whisper-server (pyproject.toml) |
103 | 98 |
# gradio |
104 |
-fastapi-cli==0.0.4 |
|
105 |
- # via fastapi |
|
106 | 99 |
faster-whisper==1.0.3 |
107 | 100 |
# via faster-whisper-server (pyproject.toml) |
108 |
-ffmpy==0.3.2 |
|
101 |
+ffmpy==0.4.0 |
|
109 | 102 |
# via gradio |
110 | 103 |
filelock==3.15.1 |
111 | 104 |
# via |
... | ... | @@ -168,9 +161,9 @@ |
168 | 161 |
# aider-chat |
169 | 162 |
# google-api-core |
170 | 163 |
# grpcio-status |
171 |
-gradio==4.38.1 |
|
164 |
+gradio==4.42.0 |
|
172 | 165 |
# via faster-whisper-server (pyproject.toml) |
173 |
-gradio-client==1.1.0 |
|
166 |
+gradio-client==1.3.0 |
|
174 | 167 |
# via gradio |
175 | 168 |
greenlet==3.0.3 |
176 | 169 |
# via |
... | ... | @@ -201,13 +194,10 @@ |
201 | 194 |
# aider-chat |
202 | 195 |
# google-api-python-client |
203 | 196 |
# google-auth-httplib2 |
204 |
-httptools==0.6.1 |
|
205 |
- # via uvicorn |
|
206 | 197 |
httpx==0.27.0 |
207 | 198 |
# via |
208 | 199 |
# faster-whisper-server (pyproject.toml) |
209 | 200 |
# aider-chat |
210 |
- # fastapi |
|
211 | 201 |
# gradio |
212 | 202 |
# gradio-client |
213 | 203 |
# openai |
... | ... | @@ -227,7 +217,6 @@ |
227 | 217 |
# via |
228 | 218 |
# aider-chat |
229 | 219 |
# anyio |
230 |
- # email-validator |
|
231 | 220 |
# httpx |
232 | 221 |
# requests |
233 | 222 |
# yarl |
... | ... | @@ -235,7 +224,7 @@ |
235 | 224 |
# via |
236 | 225 |
# aider-chat |
237 | 226 |
# litellm |
238 |
-importlib-resources==6.4.0 |
|
227 |
+importlib-resources==6.4.4 |
|
239 | 228 |
# via gradio |
240 | 229 |
iniconfig==2.0.0 |
241 | 230 |
# via pytest |
... | ... | @@ -243,7 +232,6 @@ |
243 | 232 |
# via |
244 | 233 |
# aider-chat |
245 | 234 |
# altair |
246 |
- # fastapi |
|
247 | 235 |
# gradio |
248 | 236 |
# litellm |
249 | 237 |
# pydeck |
... | ... | @@ -255,6 +243,8 @@ |
255 | 243 |
# via |
256 | 244 |
# aider-chat |
257 | 245 |
# jsonschema |
246 |
+keyboard==0.13.5 |
|
247 |
+ # via faster-whisper-server (pyproject.toml) |
|
258 | 248 |
kiwisolver==1.4.5 |
259 | 249 |
# via matplotlib |
260 | 250 |
litellm==1.40.15 |
... | ... | @@ -268,7 +258,7 @@ |
268 | 258 |
# aider-chat |
269 | 259 |
# gradio |
270 | 260 |
# jinja2 |
271 |
-matplotlib==3.9.1 |
|
261 |
+matplotlib==3.9.2 |
|
272 | 262 |
# via gradio |
273 | 263 |
mccabe==0.7.0 |
274 | 264 |
# via |
... | ... | @@ -287,7 +277,7 @@ |
287 | 277 |
# yarl |
288 | 278 |
networkx==3.2.1 |
289 | 279 |
# via aider-chat |
290 |
-nodejs-wheel-binaries==20.15.1 |
|
280 |
+nodejs-wheel-binaries==20.17.0 |
|
291 | 281 |
# via basedpyright |
292 | 282 |
numpy==1.26.4 |
293 | 283 |
# via |
... | ... | @@ -304,14 +294,14 @@ |
304 | 294 |
# pydeck |
305 | 295 |
# scipy |
306 | 296 |
# streamlit |
307 |
-onnxruntime==1.18.1 |
|
297 |
+onnxruntime==1.19.0 |
|
308 | 298 |
# via faster-whisper |
309 | 299 |
openai==1.34.0 |
310 | 300 |
# via |
311 | 301 |
# faster-whisper-server (pyproject.toml) |
312 | 302 |
# aider-chat |
313 | 303 |
# litellm |
314 |
-orjson==3.10.6 |
|
304 |
+orjson==3.10.7 |
|
315 | 305 |
# via gradio |
316 | 306 |
packaging==24.1 |
317 | 307 |
# via |
... | ... | @@ -397,7 +387,7 @@ |
397 | 387 |
# via |
398 | 388 |
# aider-chat |
399 | 389 |
# pydantic |
400 |
-pydantic-settings==2.3.4 |
|
390 |
+pydantic-settings==2.4.0 |
|
401 | 391 |
# via faster-whisper-server (pyproject.toml) |
402 | 392 |
pydeck==0.9.1 |
403 | 393 |
# via |
... | ... | @@ -424,7 +414,7 @@ |
424 | 414 |
# aider-chat |
425 | 415 |
# httplib2 |
426 | 416 |
# matplotlib |
427 |
-pytest==8.2.2 |
|
417 |
+pytest==8.3.2 |
|
428 | 418 |
# via |
429 | 419 |
# faster-whisper-server (pyproject.toml) |
430 | 420 |
# pytest-xdist |
... | ... | @@ -440,11 +430,9 @@ |
440 | 430 |
# aider-chat |
441 | 431 |
# litellm |
442 | 432 |
# pydantic-settings |
443 |
- # uvicorn |
|
444 | 433 |
python-multipart==0.0.9 |
445 | 434 |
# via |
446 | 435 |
# faster-whisper-server (pyproject.toml) |
447 |
- # fastapi |
|
448 | 436 |
# gradio |
449 | 437 |
pytz==2024.1 |
450 | 438 |
# via |
... | ... | @@ -456,7 +444,6 @@ |
456 | 444 |
# ctranslate2 |
457 | 445 |
# gradio |
458 | 446 |
# huggingface-hub |
459 |
- # uvicorn |
|
460 | 447 |
referencing==0.35.1 |
461 | 448 |
# via |
462 | 449 |
# aider-chat |
... | ... | @@ -496,7 +483,7 @@ |
496 | 483 |
# via aider-chat |
497 | 484 |
semantic-version==2.10.0 |
498 | 485 |
# via gradio |
499 |
-setuptools==71.0.4 |
|
486 |
+setuptools==73.0.1 |
|
500 | 487 |
# via ctranslate2 |
501 | 488 |
shellingham==1.5.4 |
502 | 489 |
# via typer |
... | ... | @@ -526,11 +513,11 @@ |
526 | 513 |
# beautifulsoup4 |
527 | 514 |
srt==3.5.3 |
528 | 515 |
# via faster-whisper-server (pyproject.toml) |
529 |
-starlette==0.37.2 |
|
516 |
+starlette==0.38.2 |
|
530 | 517 |
# via fastapi |
531 | 518 |
streamlit==1.35.0 |
532 | 519 |
# via aider-chat |
533 |
-sympy==1.13.1 |
|
520 |
+sympy==1.13.2 |
|
534 | 521 |
# via onnxruntime |
535 | 522 |
tenacity==8.3.0 |
536 | 523 |
# via |
... | ... | @@ -573,10 +560,8 @@ |
573 | 560 |
# via |
574 | 561 |
# aider-chat |
575 | 562 |
# grep-ast |
576 |
-typer==0.12.3 |
|
577 |
- # via |
|
578 |
- # fastapi-cli |
|
579 |
- # gradio |
|
563 |
+typer==0.12.5 |
|
564 |
+ # via gradio |
|
580 | 565 |
typing-extensions==4.12.2 |
581 | 566 |
# via |
582 | 567 |
# aider-chat |
... | ... | @@ -604,27 +589,20 @@ |
604 | 589 |
# aider-chat |
605 | 590 |
# gradio |
606 | 591 |
# requests |
607 |
-uvicorn==0.30.1 |
|
592 |
+uvicorn==0.30.6 |
|
608 | 593 |
# via |
609 | 594 |
# faster-whisper-server (pyproject.toml) |
610 |
- # fastapi |
|
611 | 595 |
# gradio |
612 |
-uvloop==0.19.0 |
|
613 |
- # via uvicorn |
|
614 | 596 |
watchdog==4.0.1 |
615 | 597 |
# via |
616 | 598 |
# aider-chat |
617 | 599 |
# streamlit |
618 |
-watchfiles==0.22.0 |
|
619 |
- # via uvicorn |
|
620 | 600 |
wcwidth==0.2.13 |
621 | 601 |
# via |
622 | 602 |
# aider-chat |
623 | 603 |
# prompt-toolkit |
624 |
-websockets==11.0.3 |
|
625 |
- # via |
|
626 |
- # gradio-client |
|
627 |
- # uvicorn |
|
604 |
+websockets==12.0 |
|
605 |
+ # via gradio-client |
|
628 | 606 |
webvtt-py==0.5.1 |
629 | 607 |
# via faster-whisper-server (pyproject.toml) |
630 | 608 |
yarl==1.9.4 |
--- requirements-dev.txt
+++ requirements-dev.txt
... | ... | @@ -2,21 +2,15 @@ |
2 | 2 |
# uv pip compile --override overrides.txt --extra dev pyproject.toml |
3 | 3 |
aiofiles==23.2.1 |
4 | 4 |
# via gradio |
5 |
-altair==5.3.0 |
|
6 |
- # via gradio |
|
7 | 5 |
annotated-types==0.7.0 |
8 | 6 |
# via pydantic |
9 | 7 |
anyio==4.4.0 |
10 | 8 |
# via |
9 |
+ # gradio |
|
11 | 10 |
# httpx |
12 | 11 |
# openai |
13 | 12 |
# starlette |
14 |
- # watchfiles |
|
15 |
-attrs==23.2.0 |
|
16 |
- # via |
|
17 |
- # jsonschema |
|
18 |
- # referencing |
|
19 |
-av==12.2.0 |
|
13 |
+av==12.3.0 |
|
20 | 14 |
# via faster-whisper |
21 | 15 |
basedpyright==1.13.0 |
22 | 16 |
# via faster-whisper-server (pyproject.toml) |
... | ... | @@ -25,7 +19,7 @@ |
25 | 19 |
# httpcore |
26 | 20 |
# httpx |
27 | 21 |
# requests |
28 |
-cffi==1.16.0 |
|
22 |
+cffi==1.17.0 |
|
29 | 23 |
# via soundfile |
30 | 24 |
charset-normalizer==3.3.2 |
31 | 25 |
# via requests |
... | ... | @@ -43,21 +37,15 @@ |
43 | 37 |
# via matplotlib |
44 | 38 |
distro==1.9.0 |
45 | 39 |
# via openai |
46 |
-dnspython==2.6.1 |
|
47 |
- # via email-validator |
|
48 |
-email-validator==2.2.0 |
|
49 |
- # via fastapi |
|
50 | 40 |
execnet==2.1.1 |
51 | 41 |
# via pytest-xdist |
52 |
-fastapi==0.111.1 |
|
42 |
+fastapi==0.112.2 |
|
53 | 43 |
# via |
54 | 44 |
# faster-whisper-server (pyproject.toml) |
55 | 45 |
# gradio |
56 |
-fastapi-cli==0.0.4 |
|
57 |
- # via fastapi |
|
58 | 46 |
faster-whisper==1.0.3 |
59 | 47 |
# via faster-whisper-server (pyproject.toml) |
60 |
-ffmpy==0.3.2 |
|
48 |
+ffmpy==0.4.0 |
|
61 | 49 |
# via gradio |
62 | 50 |
filelock==3.15.4 |
63 | 51 |
# via huggingface-hub |
... | ... | @@ -69,9 +57,9 @@ |
69 | 57 |
# via |
70 | 58 |
# gradio-client |
71 | 59 |
# huggingface-hub |
72 |
-gradio==4.38.1 |
|
60 |
+gradio==4.42.0 |
|
73 | 61 |
# via faster-whisper-server (pyproject.toml) |
74 |
-gradio-client==1.1.0 |
|
62 |
+gradio-client==1.3.0 |
|
75 | 63 |
# via gradio |
76 | 64 |
h11==0.14.0 |
77 | 65 |
# via |
... | ... | @@ -79,18 +67,15 @@ |
79 | 67 |
# uvicorn |
80 | 68 |
httpcore==1.0.5 |
81 | 69 |
# via httpx |
82 |
-httptools==0.6.1 |
|
83 |
- # via uvicorn |
|
84 | 70 |
httpx==0.27.0 |
85 | 71 |
# via |
86 | 72 |
# faster-whisper-server (pyproject.toml) |
87 |
- # fastapi |
|
88 | 73 |
# gradio |
89 | 74 |
# gradio-client |
90 | 75 |
# openai |
91 | 76 |
httpx-sse==0.4.0 |
92 | 77 |
# via faster-whisper-server (pyproject.toml) |
93 |
-huggingface-hub==0.24.0 |
|
78 |
+huggingface-hub==0.24.6 |
|
94 | 79 |
# via |
95 | 80 |
# faster-whisper-server (pyproject.toml) |
96 | 81 |
# faster-whisper |
... | ... | @@ -99,25 +84,19 @@ |
99 | 84 |
# tokenizers |
100 | 85 |
humanfriendly==10.0 |
101 | 86 |
# via coloredlogs |
102 |
-idna==3.7 |
|
87 |
+idna==3.8 |
|
103 | 88 |
# via |
104 | 89 |
# anyio |
105 |
- # email-validator |
|
106 | 90 |
# httpx |
107 | 91 |
# requests |
108 |
-importlib-resources==6.4.0 |
|
92 |
+importlib-resources==6.4.4 |
|
109 | 93 |
# via gradio |
110 | 94 |
iniconfig==2.0.0 |
111 | 95 |
# via pytest |
112 | 96 |
jinja2==3.1.4 |
113 |
- # via |
|
114 |
- # altair |
|
115 |
- # fastapi |
|
116 |
- # gradio |
|
117 |
-jsonschema==4.23.0 |
|
118 |
- # via altair |
|
119 |
-jsonschema-specifications==2023.12.1 |
|
120 |
- # via jsonschema |
|
97 |
+ # via gradio |
|
98 |
+jiter==0.5.0 |
|
99 |
+ # via openai |
|
121 | 100 |
kiwisolver==1.4.5 |
122 | 101 |
# via matplotlib |
123 | 102 |
markdown-it-py==3.0.0 |
... | ... | @@ -126,33 +105,31 @@ |
126 | 105 |
# via |
127 | 106 |
# gradio |
128 | 107 |
# jinja2 |
129 |
-matplotlib==3.9.1 |
|
108 |
+matplotlib==3.9.2 |
|
130 | 109 |
# via gradio |
131 | 110 |
mdurl==0.1.2 |
132 | 111 |
# via markdown-it-py |
133 | 112 |
mpmath==1.3.0 |
134 | 113 |
# via sympy |
135 |
-nodejs-wheel-binaries==20.15.1 |
|
114 |
+nodejs-wheel-binaries==20.17.0 |
|
136 | 115 |
# via basedpyright |
137 | 116 |
numpy==1.26.4 |
138 | 117 |
# via |
139 | 118 |
# faster-whisper-server (pyproject.toml) |
140 |
- # altair |
|
141 | 119 |
# contourpy |
142 | 120 |
# ctranslate2 |
143 | 121 |
# gradio |
144 | 122 |
# matplotlib |
145 | 123 |
# onnxruntime |
146 | 124 |
# pandas |
147 |
-onnxruntime==1.18.1 |
|
125 |
+onnxruntime==1.19.0 |
|
148 | 126 |
# via faster-whisper |
149 |
-openai==1.36.0 |
|
127 |
+openai==1.42.0 |
|
150 | 128 |
# via faster-whisper-server (pyproject.toml) |
151 |
-orjson==3.10.6 |
|
129 |
+orjson==3.10.7 |
|
152 | 130 |
# via gradio |
153 | 131 |
packaging==24.1 |
154 | 132 |
# via |
155 |
- # altair |
|
156 | 133 |
# gradio |
157 | 134 |
# gradio-client |
158 | 135 |
# huggingface-hub |
... | ... | @@ -160,16 +137,14 @@ |
160 | 137 |
# onnxruntime |
161 | 138 |
# pytest |
162 | 139 |
pandas==2.2.2 |
163 |
- # via |
|
164 |
- # altair |
|
165 |
- # gradio |
|
140 |
+ # via gradio |
|
166 | 141 |
pillow==10.4.0 |
167 | 142 |
# via |
168 | 143 |
# gradio |
169 | 144 |
# matplotlib |
170 | 145 |
pluggy==1.5.0 |
171 | 146 |
# via pytest |
172 |
-protobuf==5.27.2 |
|
147 |
+protobuf==5.27.3 |
|
173 | 148 |
# via onnxruntime |
174 | 149 |
pycparser==2.22 |
175 | 150 |
# via cffi |
... | ... | @@ -182,15 +157,15 @@ |
182 | 157 |
# pydantic-settings |
183 | 158 |
pydantic-core==2.20.1 |
184 | 159 |
# via pydantic |
185 |
-pydantic-settings==2.3.4 |
|
160 |
+pydantic-settings==2.4.0 |
|
186 | 161 |
# via faster-whisper-server (pyproject.toml) |
187 | 162 |
pydub==0.25.1 |
188 | 163 |
# via gradio |
189 | 164 |
pygments==2.18.0 |
190 | 165 |
# via rich |
191 |
-pyparsing==3.1.2 |
|
166 |
+pyparsing==3.1.4 |
|
192 | 167 |
# via matplotlib |
193 |
-pytest==8.2.2 |
|
168 |
+pytest==8.3.2 |
|
194 | 169 |
# via |
195 | 170 |
# faster-whisper-server (pyproject.toml) |
196 | 171 |
# pytest-xdist |
... | ... | @@ -201,41 +176,29 @@ |
201 | 176 |
# matplotlib |
202 | 177 |
# pandas |
203 | 178 |
python-dotenv==1.0.1 |
204 |
- # via |
|
205 |
- # pydantic-settings |
|
206 |
- # uvicorn |
|
179 |
+ # via pydantic-settings |
|
207 | 180 |
python-multipart==0.0.9 |
208 | 181 |
# via |
209 | 182 |
# faster-whisper-server (pyproject.toml) |
210 |
- # fastapi |
|
211 | 183 |
# gradio |
212 | 184 |
pytz==2024.1 |
213 | 185 |
# via pandas |
214 |
-pyyaml==6.0.1 |
|
186 |
+pyyaml==6.0.2 |
|
215 | 187 |
# via |
216 | 188 |
# ctranslate2 |
217 | 189 |
# gradio |
218 | 190 |
# huggingface-hub |
219 |
- # uvicorn |
|
220 |
-referencing==0.35.1 |
|
221 |
- # via |
|
222 |
- # jsonschema |
|
223 |
- # jsonschema-specifications |
|
224 | 191 |
requests==2.32.3 |
225 | 192 |
# via huggingface-hub |
226 |
-rich==13.7.1 |
|
193 |
+rich==13.8.0 |
|
227 | 194 |
# via typer |
228 |
-rpds-py==0.19.0 |
|
229 |
- # via |
|
230 |
- # jsonschema |
|
231 |
- # referencing |
|
232 | 195 |
ruff==0.5.3 |
233 | 196 |
# via |
234 | 197 |
# faster-whisper-server (pyproject.toml) |
235 | 198 |
# gradio |
236 | 199 |
semantic-version==2.10.0 |
237 | 200 |
# via gradio |
238 |
-setuptools==71.0.4 |
|
201 |
+setuptools==73.0.1 |
|
239 | 202 |
# via ctranslate2 |
240 | 203 |
shellingham==1.5.4 |
241 | 204 |
# via typer |
... | ... | @@ -250,24 +213,20 @@ |
250 | 213 |
# via faster-whisper-server (pyproject.toml) |
251 | 214 |
srt==3.5.3 |
252 | 215 |
# via faster-whisper-server (pyproject.toml) |
253 |
-starlette==0.37.2 |
|
216 |
+starlette==0.38.2 |
|
254 | 217 |
# via fastapi |
255 |
-sympy==1.13.1 |
|
218 |
+sympy==1.13.2 |
|
256 | 219 |
# via onnxruntime |
257 |
-tokenizers==0.19.1 |
|
220 |
+tokenizers==0.20.0 |
|
258 | 221 |
# via faster-whisper |
259 | 222 |
tomlkit==0.12.0 |
260 | 223 |
# via gradio |
261 |
-toolz==0.12.1 |
|
262 |
- # via altair |
|
263 |
-tqdm==4.66.4 |
|
224 |
+tqdm==4.66.5 |
|
264 | 225 |
# via |
265 | 226 |
# huggingface-hub |
266 | 227 |
# openai |
267 |
-typer==0.12.3 |
|
268 |
- # via |
|
269 |
- # fastapi-cli |
|
270 |
- # gradio |
|
228 |
+typer==0.12.5 |
|
229 |
+ # via gradio |
|
271 | 230 |
typing-extensions==4.12.2 |
272 | 231 |
# via |
273 | 232 |
# fastapi |
... | ... | @@ -284,18 +243,11 @@ |
284 | 243 |
# via |
285 | 244 |
# gradio |
286 | 245 |
# requests |
287 |
-uvicorn==0.30.1 |
|
246 |
+uvicorn==0.30.6 |
|
288 | 247 |
# via |
289 | 248 |
# faster-whisper-server (pyproject.toml) |
290 |
- # fastapi |
|
291 | 249 |
# gradio |
292 |
-uvloop==0.19.0 |
|
293 |
- # via uvicorn |
|
294 |
-watchfiles==0.22.0 |
|
295 |
- # via uvicorn |
|
296 |
-websockets==11.0.3 |
|
297 |
- # via |
|
298 |
- # gradio-client |
|
299 |
- # uvicorn |
|
250 |
+websockets==12.0 |
|
251 |
+ # via gradio-client |
|
300 | 252 |
webvtt-py==0.5.1 |
301 | 253 |
# via faster-whisper-server (pyproject.toml) |
--- requirements.txt
+++ requirements.txt
... | ... | @@ -2,28 +2,22 @@ |
2 | 2 |
# uv pip compile --override overrides.txt pyproject.toml |
3 | 3 |
aiofiles==23.2.1 |
4 | 4 |
# via gradio |
5 |
-altair==5.3.0 |
|
6 |
- # via gradio |
|
7 | 5 |
annotated-types==0.7.0 |
8 | 6 |
# via pydantic |
9 | 7 |
anyio==4.4.0 |
10 | 8 |
# via |
9 |
+ # gradio |
|
11 | 10 |
# httpx |
12 | 11 |
# openai |
13 | 12 |
# starlette |
14 |
- # watchfiles |
|
15 |
-attrs==23.2.0 |
|
16 |
- # via |
|
17 |
- # jsonschema |
|
18 |
- # referencing |
|
19 |
-av==12.2.0 |
|
13 |
+av==12.3.0 |
|
20 | 14 |
# via faster-whisper |
21 | 15 |
certifi==2024.7.4 |
22 | 16 |
# via |
23 | 17 |
# httpcore |
24 | 18 |
# httpx |
25 | 19 |
# requests |
26 |
-cffi==1.16.0 |
|
20 |
+cffi==1.17.0 |
|
27 | 21 |
# via soundfile |
28 | 22 |
charset-normalizer==3.3.2 |
29 | 23 |
# via requests |
... | ... | @@ -41,19 +35,13 @@ |
41 | 35 |
# via matplotlib |
42 | 36 |
distro==1.9.0 |
43 | 37 |
# via openai |
44 |
-dnspython==2.6.1 |
|
45 |
- # via email-validator |
|
46 |
-email-validator==2.2.0 |
|
47 |
- # via fastapi |
|
48 |
-fastapi==0.111.1 |
|
38 |
+fastapi==0.112.2 |
|
49 | 39 |
# via |
50 | 40 |
# faster-whisper-server (pyproject.toml) |
51 | 41 |
# gradio |
52 |
-fastapi-cli==0.0.4 |
|
53 |
- # via fastapi |
|
54 | 42 |
faster-whisper==1.0.3 |
55 | 43 |
# via faster-whisper-server (pyproject.toml) |
56 |
-ffmpy==0.3.2 |
|
44 |
+ffmpy==0.4.0 |
|
57 | 45 |
# via gradio |
58 | 46 |
filelock==3.15.4 |
59 | 47 |
# via huggingface-hub |
... | ... | @@ -65,9 +53,9 @@ |
65 | 53 |
# via |
66 | 54 |
# gradio-client |
67 | 55 |
# huggingface-hub |
68 |
-gradio==4.38.1 |
|
56 |
+gradio==4.42.0 |
|
69 | 57 |
# via faster-whisper-server (pyproject.toml) |
70 |
-gradio-client==1.1.0 |
|
58 |
+gradio-client==1.3.0 |
|
71 | 59 |
# via gradio |
72 | 60 |
h11==0.14.0 |
73 | 61 |
# via |
... | ... | @@ -75,18 +63,15 @@ |
75 | 63 |
# uvicorn |
76 | 64 |
httpcore==1.0.5 |
77 | 65 |
# via httpx |
78 |
-httptools==0.6.1 |
|
79 |
- # via uvicorn |
|
80 | 66 |
httpx==0.27.0 |
81 | 67 |
# via |
82 | 68 |
# faster-whisper-server (pyproject.toml) |
83 |
- # fastapi |
|
84 | 69 |
# gradio |
85 | 70 |
# gradio-client |
86 | 71 |
# openai |
87 | 72 |
httpx-sse==0.4.0 |
88 | 73 |
# via faster-whisper-server (pyproject.toml) |
89 |
-huggingface-hub==0.24.0 |
|
74 |
+huggingface-hub==0.24.6 |
|
90 | 75 |
# via |
91 | 76 |
# faster-whisper-server (pyproject.toml) |
92 | 77 |
# faster-whisper |
... | ... | @@ -95,23 +80,17 @@ |
95 | 80 |
# tokenizers |
96 | 81 |
humanfriendly==10.0 |
97 | 82 |
# via coloredlogs |
98 |
-idna==3.7 |
|
83 |
+idna==3.8 |
|
99 | 84 |
# via |
100 | 85 |
# anyio |
101 |
- # email-validator |
|
102 | 86 |
# httpx |
103 | 87 |
# requests |
104 |
-importlib-resources==6.4.0 |
|
88 |
+importlib-resources==6.4.4 |
|
105 | 89 |
# via gradio |
106 | 90 |
jinja2==3.1.4 |
107 |
- # via |
|
108 |
- # altair |
|
109 |
- # fastapi |
|
110 |
- # gradio |
|
111 |
-jsonschema==4.23.0 |
|
112 |
- # via altair |
|
113 |
-jsonschema-specifications==2023.12.1 |
|
114 |
- # via jsonschema |
|
91 |
+ # via gradio |
|
92 |
+jiter==0.5.0 |
|
93 |
+ # via openai |
|
115 | 94 |
kiwisolver==1.4.5 |
116 | 95 |
# via matplotlib |
117 | 96 |
markdown-it-py==3.0.0 |
... | ... | @@ -120,7 +99,7 @@ |
120 | 99 |
# via |
121 | 100 |
# gradio |
122 | 101 |
# jinja2 |
123 |
-matplotlib==3.9.1 |
|
102 |
+matplotlib==3.9.2 |
|
124 | 103 |
# via gradio |
125 | 104 |
mdurl==0.1.2 |
126 | 105 |
# via markdown-it-py |
... | ... | @@ -129,36 +108,32 @@ |
129 | 108 |
numpy==1.26.4 |
130 | 109 |
# via |
131 | 110 |
# faster-whisper-server (pyproject.toml) |
132 |
- # altair |
|
133 | 111 |
# contourpy |
134 | 112 |
# ctranslate2 |
135 | 113 |
# gradio |
136 | 114 |
# matplotlib |
137 | 115 |
# onnxruntime |
138 | 116 |
# pandas |
139 |
-onnxruntime==1.18.1 |
|
117 |
+onnxruntime==1.19.0 |
|
140 | 118 |
# via faster-whisper |
141 |
-openai==1.36.0 |
|
119 |
+openai==1.42.0 |
|
142 | 120 |
# via faster-whisper-server (pyproject.toml) |
143 |
-orjson==3.10.6 |
|
121 |
+orjson==3.10.7 |
|
144 | 122 |
# via gradio |
145 | 123 |
packaging==24.1 |
146 | 124 |
# via |
147 |
- # altair |
|
148 | 125 |
# gradio |
149 | 126 |
# gradio-client |
150 | 127 |
# huggingface-hub |
151 | 128 |
# matplotlib |
152 | 129 |
# onnxruntime |
153 | 130 |
pandas==2.2.2 |
154 |
- # via |
|
155 |
- # altair |
|
156 |
- # gradio |
|
131 |
+ # via gradio |
|
157 | 132 |
pillow==10.4.0 |
158 | 133 |
# via |
159 | 134 |
# gradio |
160 | 135 |
# matplotlib |
161 |
-protobuf==5.27.2 |
|
136 |
+protobuf==5.27.3 |
|
162 | 137 |
# via onnxruntime |
163 | 138 |
pycparser==2.22 |
164 | 139 |
# via cffi |
... | ... | @@ -171,52 +146,40 @@ |
171 | 146 |
# pydantic-settings |
172 | 147 |
pydantic-core==2.20.1 |
173 | 148 |
# via pydantic |
174 |
-pydantic-settings==2.3.4 |
|
149 |
+pydantic-settings==2.4.0 |
|
175 | 150 |
# via faster-whisper-server (pyproject.toml) |
176 | 151 |
pydub==0.25.1 |
177 | 152 |
# via gradio |
178 | 153 |
pygments==2.18.0 |
179 | 154 |
# via rich |
180 |
-pyparsing==3.1.2 |
|
155 |
+pyparsing==3.1.4 |
|
181 | 156 |
# via matplotlib |
182 | 157 |
python-dateutil==2.9.0.post0 |
183 | 158 |
# via |
184 | 159 |
# matplotlib |
185 | 160 |
# pandas |
186 | 161 |
python-dotenv==1.0.1 |
187 |
- # via |
|
188 |
- # pydantic-settings |
|
189 |
- # uvicorn |
|
162 |
+ # via pydantic-settings |
|
190 | 163 |
python-multipart==0.0.9 |
191 | 164 |
# via |
192 | 165 |
# faster-whisper-server (pyproject.toml) |
193 |
- # fastapi |
|
194 | 166 |
# gradio |
195 | 167 |
pytz==2024.1 |
196 | 168 |
# via pandas |
197 |
-pyyaml==6.0.1 |
|
169 |
+pyyaml==6.0.2 |
|
198 | 170 |
# via |
199 | 171 |
# ctranslate2 |
200 | 172 |
# gradio |
201 | 173 |
# huggingface-hub |
202 |
- # uvicorn |
|
203 |
-referencing==0.35.1 |
|
204 |
- # via |
|
205 |
- # jsonschema |
|
206 |
- # jsonschema-specifications |
|
207 | 174 |
requests==2.32.3 |
208 | 175 |
# via huggingface-hub |
209 |
-rich==13.7.1 |
|
176 |
+rich==13.8.0 |
|
210 | 177 |
# via typer |
211 |
-rpds-py==0.19.0 |
|
212 |
- # via |
|
213 |
- # jsonschema |
|
214 |
- # referencing |
|
215 |
-ruff==0.5.3 |
|
178 |
+ruff==0.6.2 |
|
216 | 179 |
# via gradio |
217 | 180 |
semantic-version==2.10.0 |
218 | 181 |
# via gradio |
219 |
-setuptools==71.0.4 |
|
182 |
+setuptools==73.0.1 |
|
220 | 183 |
# via ctranslate2 |
221 | 184 |
shellingham==1.5.4 |
222 | 185 |
# via typer |
... | ... | @@ -229,24 +192,20 @@ |
229 | 192 |
# openai |
230 | 193 |
soundfile==0.12.1 |
231 | 194 |
# via faster-whisper-server (pyproject.toml) |
232 |
-starlette==0.37.2 |
|
195 |
+starlette==0.38.2 |
|
233 | 196 |
# via fastapi |
234 |
-sympy==1.13.1 |
|
197 |
+sympy==1.13.2 |
|
235 | 198 |
# via onnxruntime |
236 |
-tokenizers==0.19.1 |
|
199 |
+tokenizers==0.20.0 |
|
237 | 200 |
# via faster-whisper |
238 | 201 |
tomlkit==0.12.0 |
239 | 202 |
# via gradio |
240 |
-toolz==0.12.1 |
|
241 |
- # via altair |
|
242 |
-tqdm==4.66.4 |
|
203 |
+tqdm==4.66.5 |
|
243 | 204 |
# via |
244 | 205 |
# huggingface-hub |
245 | 206 |
# openai |
246 |
-typer==0.12.3 |
|
247 |
- # via |
|
248 |
- # fastapi-cli |
|
249 |
- # gradio |
|
207 |
+typer==0.12.5 |
|
208 |
+ # via gradio |
|
250 | 209 |
typing-extensions==4.12.2 |
251 | 210 |
# via |
252 | 211 |
# fastapi |
... | ... | @@ -263,16 +222,9 @@ |
263 | 222 |
# via |
264 | 223 |
# gradio |
265 | 224 |
# requests |
266 |
-uvicorn==0.30.1 |
|
225 |
+uvicorn==0.30.6 |
|
267 | 226 |
# via |
268 | 227 |
# faster-whisper-server (pyproject.toml) |
269 |
- # fastapi |
|
270 | 228 |
# gradio |
271 |
-uvloop==0.19.0 |
|
272 |
- # via uvicorn |
|
273 |
-watchfiles==0.22.0 |
|
274 |
- # via uvicorn |
|
275 |
-websockets==11.0.3 |
|
276 |
- # via |
|
277 |
- # gradio-client |
|
278 |
- # uvicorn |
|
229 |
+websockets==12.0 |
|
230 |
+ # via gradio-client |
+++ scripts/client.py
... | ... | @@ -0,0 +1,79 @@ |
1 | +import os | |
2 | +from pathlib import Path | |
3 | +import subprocess | |
4 | +import threading | |
5 | + | |
6 | +import httpx | |
7 | +import keyboard | |
8 | + | |
9 | +# NOTE: this is a very basic implementation. Not really meant for usage by others. | |
10 | +# Included here in case someone wants to use it as a reference. | |
11 | + | |
12 | +# This script will run in the background and listen for a keybind to start recording audio. | |
13 | +# It will then wait until the keybind is pressed again to stop recording. | |
14 | +# The audio file will be sent to the server for transcription. | |
15 | +# The transcription will be copied to the clipboard. | |
16 | +# When having a short audio of a couple of sentences and running inference on a GPU the response time is very fast (less than 2 seconds). # noqa: E501 | |
17 | + | |
18 | +CHUNK = 2**12 | |
19 | +AUDIO_RECORD_CMD = [ | |
20 | + "ffmpeg", | |
21 | + # "-hide_banner", | |
22 | + # "-loglevel", | |
23 | + # "quiet", | |
24 | + "-f", | |
25 | + "alsa", | |
26 | + "-i", | |
27 | + "default", | |
28 | + "-f", | |
29 | + "wav", | |
30 | + # "-ac", | |
31 | + # "1", | |
32 | + # "-ar", | |
33 | + # "16000", | |
34 | + # "-f", | |
35 | + # "s16le", | |
36 | + # "-acodec", | |
37 | + # "pcm_s16le", | |
38 | + # "-", | |
39 | +] | |
40 | +COPY_TO_CLIPBOARD_CMD = "wl-copy" | |
41 | +OPENAI_BASE_URL = "ws://localhost:8000/v1" | |
42 | +TRANSCRIBE_PATH = "/audio/transcriptions?language=en" | |
43 | +USER = "nixos" | |
44 | +TIMEOUT = httpx.Timeout(None) | |
45 | +KEYBIND = "ctrl+x" | |
46 | +LANGUAGE = "en" | |
47 | +RESPONSE_FORMAT = "text" | |
48 | + | |
49 | +client = httpx.Client(base_url=OPENAI_BASE_URL, timeout=TIMEOUT) | |
50 | +is_running = threading.Event() | |
51 | +file = Path("test.wav") # TODO: use tempfile | |
52 | + | |
53 | + | |
54 | +while True: | |
55 | + keyboard.wait(KEYBIND) | |
56 | + print("Action started") | |
57 | + process = subprocess.Popen( | |
58 | + [*AUDIO_RECORD_CMD, "-y", str(file.name)], | |
59 | + stdout=subprocess.PIPE, | |
60 | + stderr=subprocess.PIPE, | |
61 | + user=USER, | |
62 | + env=dict(os.environ), | |
63 | + ) | |
64 | + keyboard.wait(KEYBIND) | |
65 | + process.kill() | |
66 | + print("Action finished") | |
67 | + | |
68 | + with open(file, "rb") as f: | |
69 | + res = client.post( | |
70 | + OPENAI_BASE_URL + TRANSCRIBE_PATH, | |
71 | + files={"file": f}, | |
72 | + data={ | |
73 | + "response_format": RESPONSE_FORMAT, | |
74 | + "language": LANGUAGE, | |
75 | + }, | |
76 | + ) | |
77 | + transcription = res.text | |
78 | + print(transcription) | |
79 | + subprocess.run([COPY_TO_CLIPBOARD_CMD], input=transcription.encode(), check=True) |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?