@hypit/hypit 0.1.7 → 0.1.9
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.
- package/README.md +15 -4
- package/dist/public/endpoint-kit.d.ts +1 -1
- package/dist/public/runtime-kit.d.ts +3 -1
- package/examples/provider-package/README.md +12 -0
- package/examples/provider-package/packages/provider-images/src/provider.ts +37 -8
- package/package.json +1 -1
- package/packages/cli/README.md +35 -0
- package/packages/cli/src/arguments.ts +12 -1
- package/packages/cli/src/command-hint.ts +20 -0
- package/packages/cli/src/commands/environment.ts +39 -18
- package/packages/cli/src/commands/execution.ts +34 -18
- package/packages/cli/src/commands/results.ts +8 -3
- package/packages/cli/src/machine-view.ts +4 -2
- package/packages/cli/src/main.ts +25 -23
- package/packages/cli/src/observation.ts +7 -2
- package/packages/cli/src/output.ts +8 -0
- package/packages/cli/src/usage-error.ts +8 -0
- package/packages/cli/src/view.ts +4 -1
- package/packages/driver-node/README.md +5 -0
- package/packages/driver-node/src/driver.ts +20 -15
- package/packages/endpoint-kit/README.md +11 -2
- package/packages/endpoint-kit/src/index.ts +1 -1
- package/packages/generation/README.md +10 -0
- package/packages/provider-hypihub/README.md +41 -6
- package/packages/provider-hypihub/src/errors.ts +61 -0
- package/packages/provider-hypihub/src/mapping.ts +10 -25
- package/packages/provider-hypihub/src/oauth.ts +4 -1
- package/packages/provider-hypihub/src/provider.ts +79 -74
- package/packages/provider-hypihub/src/routes.ts +24 -3
- package/packages/provider-hypihub/src/upload.ts +8 -18
- package/packages/provider-whisperx-local/README.md +7 -1
- package/packages/provider-whisperx-local/src/program.ts +2 -0
- package/packages/runtime-host-node/src/index.ts +4 -0
- package/packages/runtime-kit/README.md +3 -0
- package/packages/runtime-kit/src/index.ts +2 -0
- package/packages/runtime-local/README.md +17 -0
- package/packages/runtime-local/package.json +2 -1
- package/packages/runtime-local/src/program-lock.ts +40 -0
- package/packages/runtime-local/src/programs.ts +156 -79
- package/packages/video-cli/README.md +33 -6
- package/packages/video-cli/src/cli.ts +4 -1
- package/packages/video-cli/src/creation.ts +7 -2
- package/packages/video-cli/src/index.ts +2 -0
- package/packages/video-cli/src/version.ts +90 -0
- package/services/whisperx/README.md +10 -3
- 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
|
-
|
|
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()
|