@hypit/hypit 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +15 -4
  2. package/dist/public/endpoint-kit.d.ts +1 -1
  3. package/dist/public/runtime-kit.d.ts +3 -1
  4. package/examples/provider-package/README.md +12 -0
  5. package/examples/provider-package/packages/provider-images/src/provider.ts +37 -8
  6. package/package.json +1 -1
  7. package/packages/cli/README.md +27 -0
  8. package/packages/cli/src/command-hint.ts +20 -0
  9. package/packages/cli/src/commands/environment.ts +39 -18
  10. package/packages/cli/src/commands/execution.ts +27 -17
  11. package/packages/cli/src/commands/results.ts +2 -1
  12. package/packages/cli/src/machine-view.ts +4 -2
  13. package/packages/cli/src/main.ts +23 -22
  14. package/packages/cli/src/observation.ts +7 -2
  15. package/packages/cli/src/output.ts +3 -0
  16. package/packages/cli/src/view.ts +4 -1
  17. package/packages/driver-node/README.md +5 -0
  18. package/packages/driver-node/src/driver.ts +20 -15
  19. package/packages/endpoint-kit/README.md +11 -2
  20. package/packages/endpoint-kit/src/index.ts +1 -1
  21. package/packages/generation/README.md +10 -0
  22. package/packages/provider-hypihub/README.md +41 -6
  23. package/packages/provider-hypihub/src/errors.ts +61 -0
  24. package/packages/provider-hypihub/src/mapping.ts +10 -25
  25. package/packages/provider-hypihub/src/oauth.ts +4 -1
  26. package/packages/provider-hypihub/src/provider.ts +104 -75
  27. package/packages/provider-hypihub/src/routes.ts +24 -3
  28. package/packages/provider-hypihub/src/upload.ts +8 -18
  29. package/packages/provider-whisperx-local/README.md +7 -1
  30. package/packages/provider-whisperx-local/src/program.ts +2 -0
  31. package/packages/runtime-host-node/src/index.ts +4 -0
  32. package/packages/runtime-kit/README.md +3 -0
  33. package/packages/runtime-kit/src/index.ts +2 -0
  34. package/packages/runtime-local/README.md +17 -0
  35. package/packages/runtime-local/package.json +2 -1
  36. package/packages/runtime-local/src/program-lock.ts +40 -0
  37. package/packages/runtime-local/src/programs.ts +156 -79
  38. package/packages/video-cli/README.md +33 -6
  39. package/packages/video-cli/src/cli.ts +4 -1
  40. package/packages/video-cli/src/creation.ts +7 -2
  41. package/packages/video-cli/src/index.ts +2 -0
  42. package/packages/video-cli/src/version.ts +90 -0
  43. package/services/whisperx/README.md +10 -3
  44. package/services/whisperx/src/hypit_whisperx_service/engine.py +19 -1
@@ -1,15 +1,19 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import importlib.metadata as metadata
4
+ import logging
4
5
  import math
5
6
  import os
6
7
  import threading
8
+ import time
7
9
  from typing import Any, Mapping
8
10
 
9
11
  from .audio import CanonicalAudio
10
12
  from .config import ServiceConfig
11
13
  from .resources import assert_punkt_tab
12
14
 
15
+ logger = logging.getLogger("hypit.whisperx")
16
+
13
17
 
14
18
  class InferenceInputError(ValueError):
15
19
  pass
@@ -104,11 +108,14 @@ class WhisperXEngine:
104
108
  self._config = config
105
109
  self._inference_lock = threading.Lock()
106
110
  self._alignment_models: dict[str, tuple[object, object]] = {}
111
+ started = time.monotonic()
112
+ logger.info("loading ASR model=%s; uncached weights may download during this call", config.model)
107
113
  self._asr = whisperx_module.load_model(
108
114
  config.model,
109
115
  config.device,
110
116
  compute_type=config.compute,
111
117
  )
118
+ logger.info("ASR model ready in %.1fs", time.monotonic() - started)
112
119
  self._whisperx_version = metadata.version("whisperx")
113
120
 
114
121
  def identity(self) -> dict[str, object]:
@@ -123,6 +130,8 @@ class WhisperXEngine:
123
130
  def _alignment_model(self, language: str) -> tuple[object, object]:
124
131
  model = self._alignment_models.get(language)
125
132
  if model is None:
133
+ started = time.monotonic()
134
+ logger.info("loading alignment model for language=%s; uncached weights may download during this call", language)
126
135
  loaded = self._whisperx.load_align_model(
127
136
  language_code=language,
128
137
  device=self._config.device,
@@ -131,6 +140,7 @@ class WhisperXEngine:
131
140
  raise RuntimeError("WhisperX returned an invalid alignment model")
132
141
  model = loaded
133
142
  self._alignment_models[language] = model
143
+ logger.info("alignment model ready for language=%s in %.1fs", language, time.monotonic() - started)
134
144
  return model
135
145
 
136
146
  def transcribe(self, audio: CanonicalAudio, language: str | None) -> dict[str, object]:
@@ -144,11 +154,14 @@ class WhisperXEngine:
144
154
  if not self._inference_lock.acquire(blocking=False):
145
155
  raise InferenceBusyError("the warm WhisperX model is already executing one request")
146
156
  try:
157
+ started = time.monotonic()
158
+ logger.info("transcribing %.2fs of audio, language=%s", audio.duration_sec, language or "auto")
147
159
  transcription = self._asr.transcribe(
148
160
  samples,
149
161
  batch_size=self._config.batch_size,
150
162
  language=language,
151
163
  )
164
+ logger.info("transcription completed in %.1fs", time.monotonic() - started)
152
165
  detected = transcription.get("language") or language or "en"
153
166
  if not isinstance(detected, str) or not detected.strip():
154
167
  raise RuntimeError("WhisperX did not return a valid language")
@@ -156,8 +169,11 @@ class WhisperXEngine:
156
169
  if not isinstance(segments, list):
157
170
  raise RuntimeError("WhisperX transcription returned invalid segments")
158
171
  if not segments:
172
+ logger.info("no speech segments; alignment is unnecessary")
159
173
  return {"language": detected, "segments": []}
160
174
  alignment_model, metadata_value = self._alignment_model(detected)
175
+ started = time.monotonic()
176
+ logger.info("aligning %d speech segments, language=%s", len(segments), detected)
161
177
  aligned = self._whisperx.align(
162
178
  segments,
163
179
  alignment_model,
@@ -168,6 +184,8 @@ class WhisperXEngine:
168
184
  )
169
185
  if not isinstance(aligned, Mapping):
170
186
  raise RuntimeError("WhisperX returned an invalid alignment result")
171
- return normalize_alignment(detected, aligned)
187
+ result = normalize_alignment(detected, aligned)
188
+ logger.info("word timing ready in %.1fs", time.monotonic() - started)
189
+ return result
172
190
  finally:
173
191
  self._inference_lock.release()