daihui.zhang commited on
Commit
498afcd
·
1 Parent(s): 81d85e2

update config of language

Browse files

Former-commit-id: 6c237bee605ec8fe2e28517a2d7e0a385747ab5b

pyproject.toml CHANGED
@@ -7,9 +7,11 @@ requires-python = ">=3.11"
7
  dependencies = [
8
  "av>=14.2.0",
9
  "librosa>=0.11.0",
 
10
  "numpy>=2.1.3",
11
  "onnxruntime>=1.21.0",
12
  "pyaudio>=0.2.14",
 
13
  "setuptools>=78.1.0",
14
  "soundfile>=0.13.1",
15
  "torch>=2.6.0",
 
7
  dependencies = [
8
  "av>=14.2.0",
9
  "librosa>=0.11.0",
10
+ "llama-cpp-python>=0.3.8",
11
  "numpy>=2.1.3",
12
  "onnxruntime>=1.21.0",
13
  "pyaudio>=0.2.14",
14
+ "pywhispercpp>=1.3.0",
15
  "setuptools>=78.1.0",
16
  "soundfile>=0.13.1",
17
  "torch>=2.6.0",
requirements.txt CHANGED
@@ -14,6 +14,8 @@ coloredlogs==15.0.1
14
  # via onnxruntime
15
  decorator==5.2.1
16
  # via librosa
 
 
17
  filelock==3.18.0
18
  # via torch
19
  flatbuffers==25.2.10
@@ -25,7 +27,9 @@ humanfriendly==10.0
25
  idna==3.10
26
  # via requests
27
  jinja2==3.1.6
28
- # via torch
 
 
29
  joblib==1.4.2
30
  # via
31
  # librosa
@@ -34,6 +38,8 @@ lazy-loader==0.4
34
  # via librosa
35
  librosa==0.11.0
36
  # via trans (pyproject.toml)
 
 
37
  llvmlite==0.44.0
38
  # via numba
39
  markupsafe==3.0.2
@@ -50,8 +56,10 @@ numpy==2.1.3
50
  # via
51
  # trans (pyproject.toml)
52
  # librosa
 
53
  # numba
54
  # onnxruntime
 
55
  # scikit-learn
56
  # scipy
57
  # soundfile
@@ -64,7 +72,9 @@ packaging==24.2
64
  # onnxruntime
65
  # pooch
66
  platformdirs==4.3.7
67
- # via pooch
 
 
68
  pooch==1.8.2
69
  # via librosa
70
  protobuf==6.30.2
@@ -73,8 +83,12 @@ pyaudio==0.2.14
73
  # via trans (pyproject.toml)
74
  pycparser==2.22
75
  # via cffi
 
 
76
  requests==2.32.3
77
- # via pooch
 
 
78
  scikit-learn==1.6.1
79
  # via librosa
80
  scipy==1.15.2
@@ -98,10 +112,13 @@ threadpoolctl==3.6.0
98
  torch==2.6.0
99
  # via trans (pyproject.toml)
100
  tqdm==4.67.1
101
- # via trans (pyproject.toml)
 
 
102
  typing-extensions==4.13.1
103
  # via
104
  # librosa
 
105
  # torch
106
  urllib3==2.3.0
107
  # via requests
@@ -109,6 +126,3 @@ websocket-client==1.8.0
109
  # via trans (pyproject.toml)
110
  websockets==15.0.1
111
  # via trans (pyproject.toml)
112
-
113
- llama-cpp-python
114
- pywhispercpp
 
14
  # via onnxruntime
15
  decorator==5.2.1
16
  # via librosa
17
+ diskcache==5.6.3
18
+ # via llama-cpp-python
19
  filelock==3.18.0
20
  # via torch
21
  flatbuffers==25.2.10
 
27
  idna==3.10
28
  # via requests
29
  jinja2==3.1.6
30
+ # via
31
+ # llama-cpp-python
32
+ # torch
33
  joblib==1.4.2
34
  # via
35
  # librosa
 
38
  # via librosa
39
  librosa==0.11.0
40
  # via trans (pyproject.toml)
41
+ llama-cpp-python==0.3.8
42
+ # via trans (pyproject.toml)
43
  llvmlite==0.44.0
44
  # via numba
45
  markupsafe==3.0.2
 
56
  # via
57
  # trans (pyproject.toml)
58
  # librosa
59
+ # llama-cpp-python
60
  # numba
61
  # onnxruntime
62
+ # pywhispercpp
63
  # scikit-learn
64
  # scipy
65
  # soundfile
 
72
  # onnxruntime
73
  # pooch
74
  platformdirs==4.3.7
75
+ # via
76
+ # pooch
77
+ # pywhispercpp
78
  pooch==1.8.2
79
  # via librosa
80
  protobuf==6.30.2
 
83
  # via trans (pyproject.toml)
84
  pycparser==2.22
85
  # via cffi
86
+ pywhispercpp==1.3.0
87
+ # via trans (pyproject.toml)
88
  requests==2.32.3
89
+ # via
90
+ # pooch
91
+ # pywhispercpp
92
  scikit-learn==1.6.1
93
  # via librosa
94
  scipy==1.15.2
 
112
  torch==2.6.0
113
  # via trans (pyproject.toml)
114
  tqdm==4.67.1
115
+ # via
116
+ # trans (pyproject.toml)
117
+ # pywhispercpp
118
  typing-extensions==4.13.1
119
  # via
120
  # librosa
121
+ # llama-cpp-python
122
  # torch
123
  urllib3==2.3.0
124
  # via requests
 
126
  # via trans (pyproject.toml)
127
  websockets==15.0.1
128
  # via trans (pyproject.toml)
 
 
 
run_server.py CHANGED
@@ -22,7 +22,7 @@ if __name__ == "__main__":
22
  if "OMP_NUM_THREADS" not in os.environ:
23
  os.environ["OMP_NUM_THREADS"] = str(args.omp_num_threads)
24
 
25
- from transcribe.server import TranscriptionServer
26
  server = TranscriptionServer()
27
  server.run(
28
  "0.0.0.0",
 
22
  if "OMP_NUM_THREADS" not in os.environ:
23
  os.environ["OMP_NUM_THREADS"] = str(args.omp_num_threads)
24
 
25
+ from transcribe.transcription import TranscriptionServer
26
  server = TranscriptionServer()
27
  server.run(
28
  "0.0.0.0",
transcribe/{translate.py → translator.py} RENAMED
@@ -11,7 +11,8 @@ class QwenTranslator:
11
  # n_gpu_layers=-1, # Uncomment to use GPU acceleration
12
  # seed=1337, # Uncomment to set a specific seed
13
  # n_ctx=2048, # Uncomment to increase the context window
14
- chat_format="chatml"
 
15
  )
16
  self.sys_prompt = system_prompt
17
 
@@ -27,10 +28,10 @@ class QwenTranslator:
27
  message = self.to_message(prompt, src_lang, dst_lang)
28
  start_time = time.monotonic()
29
  output = self.llm.create_chat_completion(messages=message, temperature=0.9)
30
- logger.info(f"LLM translate cose: {time.monotonic() - start_time}s.")
31
- return output['choices'][0]['content']
32
 
33
- def __call__(self, prompt, max_tokens=256,*args, **kwargs):
34
  return self.llm(
35
  prompt,
36
  *args,
 
11
  # n_gpu_layers=-1, # Uncomment to use GPU acceleration
12
  # seed=1337, # Uncomment to set a specific seed
13
  # n_ctx=2048, # Uncomment to increase the context window
14
+ chat_format="chatml",
15
+ verbose=False
16
  )
17
  self.sys_prompt = system_prompt
18
 
 
28
  message = self.to_message(prompt, src_lang, dst_lang)
29
  start_time = time.monotonic()
30
  output = self.llm.create_chat_completion(messages=message, temperature=0.9)
31
+ logger.info(f"LLM translate cose: {time.monotonic() - start_time:.2f}s.")
32
+ return output['choices'][0]['message']['content']
33
 
34
+ def __call__(self, prompt, max_tokens=512,*args, **kwargs):
35
  return self.llm(
36
  prompt,
37
  *args,
transcribe/whisper_llm_serve.py CHANGED
@@ -1,6 +1,5 @@
1
 
2
- from .server import ServeClientBase
3
- from pywhispercpp.model import Model
4
  import soundfile
5
  from concurrent.futures import ProcessPoolExecutor as Pool
6
  import numpy as np
@@ -12,7 +11,11 @@ import time
12
  import json
13
  import threading
14
 
15
- logger = getLogger("Pywhisper")
 
 
 
 
16
 
17
 
18
  class TripleTextBuffer:
@@ -102,13 +105,13 @@ class SegmentManager:
102
 
103
 
104
  class PywhisperInference:
105
-
106
- model = None
107
 
108
  @classmethod
109
  def initializer(cls, warmup=True):
110
  models_dir = config.MODEL_DIR.as_posix()
111
- cls.model = Model(
112
  model=config.WHISPER_MODEL,
113
  models_dir=models_dir,
114
  print_realtime=False,
@@ -117,12 +120,15 @@ class PywhisperInference:
117
  )
118
  if warmup:
119
  cls.warmup()
 
 
 
120
 
121
  @classmethod
122
  def warmup(cls, warmup_steps=1):
123
  mel, _, = soundfile.read("assets/jfk.flac")
124
  for _ in range(warmup_steps):
125
- cls.model.transcribe(mel, print_progress=False)
126
 
127
  @staticmethod
128
  def config_language(language):
@@ -136,7 +142,7 @@ class PywhisperInference:
136
  def inference(cls, audio_buffer, language):
137
  max_len, prompt = cls.config_language(language)
138
  audio_buffer = np.frombuffer(audio_buffer, dtype=np.float32)
139
- return cls.model.transcribe(
140
  audio_buffer,
141
  initial_prompt=prompt,
142
  language=language,
@@ -144,13 +150,18 @@ class PywhisperInference:
144
  max_len=max_len
145
  )
146
 
 
 
 
 
147
 
148
  class PyWhiperCppServe(ServeClientBase):
149
 
150
 
151
- def __init__(self, websocket, language=None, client_uid=None,):
152
  super().__init__(client_uid, websocket)
153
  self.language = language
 
154
  # 设置观察字符串 对比上下次的文字来判断字符串的输出是否固定
155
  self._text_buffer = TripleTextBuffer()
156
  # 存储转录数据
@@ -162,8 +173,9 @@ class PyWhiperCppServe(ServeClientBase):
162
  self._pool = Pool(
163
  max_workers=1, initializer=PywhisperInference.initializer)
164
 
165
- logger.info('Create a thread to process audio.')
166
  self.trans_thread = threading.Thread(target=self.speech_to_text)
 
167
  self.trans_thread.start()
168
 
169
  self.websocket.send(json.dumps({
@@ -191,9 +203,18 @@ class PyWhiperCppServe(ServeClientBase):
191
  Args:
192
  audio_buffer (np.array): The audio chunk to transcribe.
193
  """
194
- fut = self._pool.submit(
195
  PywhisperInference.inference, audio_buffer.tobytes(), self.language)
196
- return fut.result()
 
 
 
 
 
 
 
 
 
197
 
198
 
199
 
@@ -264,7 +285,8 @@ class PyWhiperCppServe(ServeClientBase):
264
  except Exception as e:
265
  logger.error(f"[ERROR]: {e}")
266
  else:
267
- self.handle_transcription_output(segments, audio_buffer)
 
268
 
269
 
270
 
@@ -283,10 +305,8 @@ class PyWhiperCppServe(ServeClientBase):
283
  if is_end_sentence and last_cut_index:
284
  message = self._segment_manager.segment
285
  seg_id = self._segment_manager.get_seg_id() - 1
286
- # elapsed_time = time.time() - start_time
287
- # formatted_time = f"{int(elapsed_time // 60):02}:{int(elapsed_time % 60):02}:{(elapsed_time % 1) * 1000:03.0f}"
288
- print(seg_id, message,)
289
- print(seg_id + 1, self._segment_manager.string,)
290
 
291
  else:
292
  seg_id = self._segment_manager.get_seg_id()
@@ -294,7 +314,7 @@ class PyWhiperCppServe(ServeClientBase):
294
  # print(self._segment_manager.__dict__)
295
  # elapsed_time = time.time() - start_time
296
  # formatted_time = f"{int(elapsed_time // 60):02}:{int(elapsed_time % 60):02}:{(elapsed_time % 1) * 1000:03.0f}"
297
- print(seg_id, message)
298
 
299
  def send_to_client(self, data_dict):
300
  content = {
 
1
 
2
+
 
3
  import soundfile
4
  from concurrent.futures import ProcessPoolExecutor as Pool
5
  import numpy as np
 
11
  import json
12
  import threading
13
 
14
+ from .server import ServeClientBase
15
+ from .translator import QwenTranslator
16
+ from pywhispercpp.model import Model
17
+
18
+ logger = getLogger(__name__)
19
 
20
 
21
  class TripleTextBuffer:
 
105
 
106
 
107
  class PywhisperInference:
108
+ whisper_model = None
109
+ llm_model = None
110
 
111
  @classmethod
112
  def initializer(cls, warmup=True):
113
  models_dir = config.MODEL_DIR.as_posix()
114
+ cls.whisper_model = Model(
115
  model=config.WHISPER_MODEL,
116
  models_dir=models_dir,
117
  print_realtime=False,
 
120
  )
121
  if warmup:
122
  cls.warmup()
123
+
124
+ # init llamacpp
125
+ cls.llm_model = QwenTranslator(config.LLM_MODEL_PATH, config.LLM_SYS_PROMPT)
126
 
127
  @classmethod
128
  def warmup(cls, warmup_steps=1):
129
  mel, _, = soundfile.read("assets/jfk.flac")
130
  for _ in range(warmup_steps):
131
+ cls.whisper_model.transcribe(mel, print_progress=False)
132
 
133
  @staticmethod
134
  def config_language(language):
 
142
  def inference(cls, audio_buffer, language):
143
  max_len, prompt = cls.config_language(language)
144
  audio_buffer = np.frombuffer(audio_buffer, dtype=np.float32)
145
+ return cls.whisper_model.transcribe(
146
  audio_buffer,
147
  initial_prompt=prompt,
148
  language=language,
 
150
  max_len=max_len
151
  )
152
 
153
+ @classmethod
154
+ def translate(cls, context: str, src_lang, dst_lang):
155
+ return cls.llm_model.translate(context, src_lang, dst_lang)
156
+
157
 
158
  class PyWhiperCppServe(ServeClientBase):
159
 
160
 
161
+ def __init__(self, websocket, language=None, dst_lang=None, client_uid=None,):
162
  super().__init__(client_uid, websocket)
163
  self.language = language
164
+ self.dst_lang = dst_lang # 目标翻译语言
165
  # 设置观察字符串 对比上下次的文字来判断字符串的输出是否固定
166
  self._text_buffer = TripleTextBuffer()
167
  # 存储转录数据
 
173
  self._pool = Pool(
174
  max_workers=1, initializer=PywhisperInference.initializer)
175
 
176
+ logger.info('Create a process to process audio.')
177
  self.trans_thread = threading.Thread(target=self.speech_to_text)
178
+ self.trans_thread.daemon = True
179
  self.trans_thread.start()
180
 
181
  self.websocket.send(json.dumps({
 
203
  Args:
204
  audio_buffer (np.array): The audio chunk to transcribe.
205
  """
206
+ transcribe_fut = self._pool.submit(
207
  PywhisperInference.inference, audio_buffer.tobytes(), self.language)
208
+ segments = transcribe_fut.result()
209
+
210
+ return segments
211
+
212
+ def translate_text(self, text):
213
+ """
214
+ translate the text to dst lang"""
215
+ translate_fut = self._pool.submit(
216
+ PywhisperInference.translate, text, self.language, self.dst_lang)
217
+ return translate_fut.result()
218
 
219
 
220
 
 
285
  except Exception as e:
286
  logger.error(f"[ERROR]: {e}")
287
  else:
288
+ for item in self.handle_transcription_output(segments, audio_buffer):
289
+ print(item)
290
 
291
 
292
 
 
305
  if is_end_sentence and last_cut_index:
306
  message = self._segment_manager.segment
307
  seg_id = self._segment_manager.get_seg_id() - 1
308
+ yield (seg_id, message, self.translate_text(message))
309
+ yield (seg_id + 1, self._segment_manager.string, self.translate_text(self._segment_manager.string))
 
 
310
 
311
  else:
312
  seg_id = self._segment_manager.get_seg_id()
 
314
  # print(self._segment_manager.__dict__)
315
  # elapsed_time = time.time() - start_time
316
  # formatted_time = f"{int(elapsed_time // 60):02}:{int(elapsed_time % 60):02}:{(elapsed_time % 1) * 1000:03.0f}"
317
+ yield (seg_id, message,self.translate_text(message))
318
 
319
  def send_to_client(self, data_dict):
320
  content = {
uv.lock CHANGED
@@ -214,6 +214,15 @@ wheels = [
214
  { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 },
215
  ]
216
 
 
 
 
 
 
 
 
 
 
217
  [[package]]
218
  name = "filelock"
219
  version = "3.18.0"
@@ -321,6 +330,18 @@ wheels = [
321
  { url = "https://files.pythonhosted.org/packages/b5/ba/c63c5786dfee4c3417094c4b00966e61e4a63efecee22cb7b4c0387dda83/librosa-0.11.0-py3-none-any.whl", hash = "sha256:0b6415c4fd68bff4c29288abe67c6d80b587e0e1e2cfb0aad23e4559504a7fa1", size = 260749 },
322
  ]
323
 
 
 
 
 
 
 
 
 
 
 
 
 
324
  [[package]]
325
  name = "llvmlite"
326
  version = "0.44.0"
@@ -751,6 +772,37 @@ wheels = [
751
  { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178 },
752
  ]
753
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
754
  [[package]]
755
  name = "requests"
756
  version = "2.32.3"
@@ -1011,9 +1063,11 @@ source = { virtual = "." }
1011
  dependencies = [
1012
  { name = "av" },
1013
  { name = "librosa" },
 
1014
  { name = "numpy" },
1015
  { name = "onnxruntime" },
1016
  { name = "pyaudio" },
 
1017
  { name = "setuptools" },
1018
  { name = "soundfile" },
1019
  { name = "torch" },
@@ -1026,9 +1080,11 @@ dependencies = [
1026
  requires-dist = [
1027
  { name = "av", specifier = ">=14.2.0" },
1028
  { name = "librosa", specifier = ">=0.11.0" },
 
1029
  { name = "numpy", specifier = ">=2.1.3" },
1030
  { name = "onnxruntime", specifier = ">=1.21.0" },
1031
  { name = "pyaudio", specifier = ">=0.2.14" },
 
1032
  { name = "setuptools", specifier = ">=78.1.0" },
1033
  { name = "soundfile", specifier = ">=0.13.1" },
1034
  { name = "torch", specifier = ">=2.6.0" },
 
214
  { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 },
215
  ]
216
 
217
+ [[package]]
218
+ name = "diskcache"
219
+ version = "5.6.3"
220
+ source = { registry = "https://pypi.org/simple" }
221
+ sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916 }
222
+ wheels = [
223
+ { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550 },
224
+ ]
225
+
226
  [[package]]
227
  name = "filelock"
228
  version = "3.18.0"
 
330
  { url = "https://files.pythonhosted.org/packages/b5/ba/c63c5786dfee4c3417094c4b00966e61e4a63efecee22cb7b4c0387dda83/librosa-0.11.0-py3-none-any.whl", hash = "sha256:0b6415c4fd68bff4c29288abe67c6d80b587e0e1e2cfb0aad23e4559504a7fa1", size = 260749 },
331
  ]
332
 
333
+ [[package]]
334
+ name = "llama-cpp-python"
335
+ version = "0.3.8"
336
+ source = { registry = "https://pypi.org/simple" }
337
+ dependencies = [
338
+ { name = "diskcache" },
339
+ { name = "jinja2" },
340
+ { name = "numpy" },
341
+ { name = "typing-extensions" },
342
+ ]
343
+ sdist = { url = "https://files.pythonhosted.org/packages/95/4e/da912ff2bf9bf855c86e8b1ae9fe1eaedf47d75a66728896b533901c4610/llama_cpp_python-0.3.8.tar.gz", hash = "sha256:31c91323b555c025a76a30923cead9f5695da103dd68c15cdbb4509b17f0ed77", size = 67301056 }
344
+
345
  [[package]]
346
  name = "llvmlite"
347
  version = "0.44.0"
 
772
  { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178 },
773
  ]
774
 
775
+ [[package]]
776
+ name = "pywhispercpp"
777
+ version = "1.3.0"
778
+ source = { registry = "https://pypi.org/simple" }
779
+ dependencies = [
780
+ { name = "numpy" },
781
+ { name = "platformdirs" },
782
+ { name = "requests" },
783
+ { name = "tqdm" },
784
+ ]
785
+ sdist = { url = "https://files.pythonhosted.org/packages/85/bf/213ab706513a2ad6f0266b44c841f5123ae3592e769488be1e62268f0451/pywhispercpp-1.3.0.tar.gz", hash = "sha256:d5d4ddfdbe7472736343413355f47a74783bc40891c5826b607eac4f62b08279", size = 1580900 }
786
+ wheels = [
787
+ { url = "https://files.pythonhosted.org/packages/79/4d/4765b2477e028d27f0f497f9e7e27ecfd207cf1d133c12626a7901ceca8a/pywhispercpp-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f66cc5ff624744cf0b7da1c53d67d2e3416f92a02c7ae945697d47d13eed5845", size = 1562728 },
788
+ { url = "https://files.pythonhosted.org/packages/e5/0d/a17a403feeea0e0d064fb230d56119718ca813d6b382804848c387387022/pywhispercpp-1.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2fb92868fb7219478f6bdff50d5045583466985e3e9017af040735eb650772d", size = 1893935 },
789
+ { url = "https://files.pythonhosted.org/packages/3f/09/db14ce3c4555a642ba62e4da226e578ea86d1c32ca70b93e32dae3309cf2/pywhispercpp-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66270fb0dbb00745419001eef7c46c49e2104b80ebd21d8e65d58f0bdef7c2a7", size = 1788858 },
790
+ { url = "https://files.pythonhosted.org/packages/a0/28/fd4de678cfc50ad8dedba1ab5f9a3e3563759ca3dce273eb2b09b95e4729/pywhispercpp-1.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f61f2e36f06bb98cd139aee073d6af5223fe551bab80ce3cbdc643eb7edb5e1b", size = 3026209 },
791
+ { url = "https://files.pythonhosted.org/packages/94/a3/81c3616eb033344e4af356896aded58c1f36fdca253294dd501db7630a09/pywhispercpp-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bf0478a443ea7a56f35fbeba1c5f1988b13088aafc79d533a67020ee7ce146f3", size = 2792276 },
792
+ { url = "https://files.pythonhosted.org/packages/49/83/0bcb864c5dff802afd4c1887149bf029ea6715e20438feb0eb0727e0e70d/pywhispercpp-1.3.0-cp311-cp311-win32.whl", hash = "sha256:0c906e7537d9e81813d86bcc98824085058174b238900bad655c8d7bd426f9a4", size = 731243 },
793
+ { url = "https://files.pythonhosted.org/packages/a7/15/5421c0814e611aae9f1541c36d4bfba157ae30580424091519aaeffe3f1d/pywhispercpp-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:3af25987a0d3caa88a6c795b2e0051b74515a81c33bdbd49c6e8ca65b7fdc6db", size = 863874 },
794
+ { url = "https://files.pythonhosted.org/packages/4b/e6/c4008fed98e0ab047bd458aaeb675226d2bd630c11939e641c3385657552/pywhispercpp-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd0903d9685447700ed4cad48f298cb73dd073bcd0abb8bcf974646006f4e222", size = 1563954 },
795
+ { url = "https://files.pythonhosted.org/packages/d9/31/5de448da80b8e58bda47e2ca503b97484afafe93d93793f5f7b6140f9fba/pywhispercpp-1.3.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e84926618d819aaeb128170351b7489dc01cabb0e58c44c6b11f8449f0850d7a", size = 1893782 },
796
+ { url = "https://files.pythonhosted.org/packages/5c/82/cb38ffa05a0fcbff7547a42735b05f36d92af5352ae7273764e05ca85363/pywhispercpp-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba675b98ffd1901d3696613655700d3d407bd952e110a1bfbbb618997818d8b", size = 1787927 },
797
+ { url = "https://files.pythonhosted.org/packages/90/9d/3aa981b0551d44339ffc613c4466df4d8e3c59609da444a490eac032e0a2/pywhispercpp-1.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2b8407a9cae5555bd276fac578155de6273f3bcc0ee8960c1fd0cfb7f4be1be9", size = 3027385 },
798
+ { url = "https://files.pythonhosted.org/packages/b0/3f/85924b54772e5ce5222bbf9aa98247800c7be2262daf17d07e2fae6e1ced/pywhispercpp-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd31fa0992a39e55d4a793dad1f6d2a1a97261998d52726f4568cea0af78ff93", size = 2791659 },
799
+ { url = "https://files.pythonhosted.org/packages/71/63/0ed9a4a776d81018536f2e5556fe364599a661aeded42627f93e1d4282aa/pywhispercpp-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e8d1b339409668382f68b810c2ccac010e71d580c6afe6d67e86336daeb939ed", size = 1563943 },
800
+ { url = "https://files.pythonhosted.org/packages/e4/3b/f9fda6bd691900e76702945405919174838497096961f56aa8583b6373ed/pywhispercpp-1.3.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac9fea9e3aeb5219ce614f644c4f1b38b9561eede1e4380ab39de96afba8864", size = 1893777 },
801
+ { url = "https://files.pythonhosted.org/packages/42/fc/26b0811b3964f4b14691ff28d84ccfd5fb7b800eab7ca898f538271c9c61/pywhispercpp-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc6801332deb2d6efc67e5dd7c9c9b1ce06f8235270b3ebd5546a79040a67314", size = 1787957 },
802
+ { url = "https://files.pythonhosted.org/packages/3a/f2/1673b43721246a9da0a9820abb6aa442c4de0129d2039fd107f0657878f4/pywhispercpp-1.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5bc5742787037f421f748ad463d85bce565287e77dfddaa5536d37d59ac44267", size = 3027419 },
803
+ { url = "https://files.pythonhosted.org/packages/d2/33/292a727bd3aa826c5981df32ce228f3e89edf4116ae4cc9d76ddedb9fb07/pywhispercpp-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6f7578fb9a8de4c8663323060c0715713168ae174ab022dfe9ad13b21223c3c", size = 2791670 },
804
+ ]
805
+
806
  [[package]]
807
  name = "requests"
808
  version = "2.32.3"
 
1063
  dependencies = [
1064
  { name = "av" },
1065
  { name = "librosa" },
1066
+ { name = "llama-cpp-python" },
1067
  { name = "numpy" },
1068
  { name = "onnxruntime" },
1069
  { name = "pyaudio" },
1070
+ { name = "pywhispercpp" },
1071
  { name = "setuptools" },
1072
  { name = "soundfile" },
1073
  { name = "torch" },
 
1080
  requires-dist = [
1081
  { name = "av", specifier = ">=14.2.0" },
1082
  { name = "librosa", specifier = ">=0.11.0" },
1083
+ { name = "llama-cpp-python", specifier = ">=0.3.8" },
1084
  { name = "numpy", specifier = ">=2.1.3" },
1085
  { name = "onnxruntime", specifier = ">=1.21.0" },
1086
  { name = "pyaudio", specifier = ">=0.2.14" },
1087
+ { name = "pywhispercpp", specifier = ">=1.3.0" },
1088
  { name = "setuptools", specifier = ">=78.1.0" },
1089
  { name = "soundfile", specifier = ">=0.13.1" },
1090
  { name = "torch", specifier = ">=2.6.0" },