S-K-yadav commited on
Commit
c949c3a
·
1 Parent(s): 6b46ece

offline transcribe

Browse files
Files changed (2) hide show
  1. config.py +1 -0
  2. pipeline/transcriber.py +25 -4
config.py CHANGED
@@ -22,6 +22,7 @@ HF_TOKEN = os.environ.get("HF_TOKEN", "")
22
  TRANSCRIBE_MODEL_ID = "UsefulSensors/moonshine-tiny"
23
  TRANSCRIBE_LANGUAGE = "en" # Moonshine Tiny is English ASR
24
  TRANSCRIBE_DEVICE = "cpu" # CPU-only for zero-gpu deployment
 
25
 
26
  # Intent Parser: Qwen2.5-7B-Instruct (GGUF via llama-cpp-python)
27
  # Using q2_k quantization for smaller size on CPU (~2.3 GB).
 
22
  TRANSCRIBE_MODEL_ID = "UsefulSensors/moonshine-tiny"
23
  TRANSCRIBE_LANGUAGE = "en" # Moonshine Tiny is English ASR
24
  TRANSCRIBE_DEVICE = "cpu" # CPU-only for zero-gpu deployment
25
+ TRANSCRIBE_LOCAL_ONLY = os.environ.get("TRANSCRIBE_LOCAL_ONLY", "1").lower() in ("1", "true", "yes")
26
 
27
  # Intent Parser: Qwen2.5-7B-Instruct (GGUF via llama-cpp-python)
28
  # Using q2_k quantization for smaller size on CPU (~2.3 GB).
pipeline/transcriber.py CHANGED
@@ -37,6 +37,7 @@ from config import (
37
  TRANSCRIBE_MODEL_ID,
38
  TRANSCRIBE_DEVICE,
39
  HF_TOKEN,
 
40
  )
41
 
42
  logger = logging.getLogger(__name__)
@@ -175,7 +176,16 @@ class Transcriber:
175
  with self._lock:
176
  if self._loaded:
177
  return
 
178
  if not _TORCH_AVAILABLE:
 
 
 
 
 
 
 
 
179
  logger.warning(
180
  "PyTorch is unavailable in this environment; "
181
  "using remote ASR fallback."
@@ -183,6 +193,7 @@ class Transcriber:
183
  self._use_remote = True
184
  self._loaded = True
185
  return
 
186
  self._load()
187
 
188
  def _load(self):
@@ -198,11 +209,17 @@ class Transcriber:
198
  t0 = time.perf_counter()
199
 
200
  token_kwargs = {"token": HF_TOKEN} if HF_TOKEN else {}
201
- local_only = os.path.exists(
202
- os.path.expanduser(
203
- f"~/.cache/huggingface/hub/models--{TRANSCRIBE_MODEL_ID.replace('/', '--')}"
204
- )
205
  )
 
 
 
 
 
 
 
 
206
 
207
  self._feature_extractor = AutoFeatureExtractor.from_pretrained(
208
  TRANSCRIBE_MODEL_ID,
@@ -263,6 +280,10 @@ class Transcriber:
263
  if self._use_remote:
264
  return [self._remote_transcribe(audio, sr) for audio, sr in zip(audio_arrays, sample_rates)]
265
 
 
 
 
 
266
  prepared = [
267
  self._resample(audio, sr, self._sample_rate)
268
  for audio, sr in zip(audio_arrays, sample_rates)
 
37
  TRANSCRIBE_MODEL_ID,
38
  TRANSCRIBE_DEVICE,
39
  HF_TOKEN,
40
+ TRANSCRIBE_LOCAL_ONLY,
41
  )
42
 
43
  logger = logging.getLogger(__name__)
 
176
  with self._lock:
177
  if self._loaded:
178
  return
179
+
180
  if not _TORCH_AVAILABLE:
181
+ if TRANSCRIBE_LOCAL_ONLY:
182
+ logger.warning(
183
+ "PyTorch is unavailable and offline-only transcription is enabled; "
184
+ "remote ASR is disabled."
185
+ )
186
+ self._use_remote = False
187
+ self._loaded = True
188
+ return
189
  logger.warning(
190
  "PyTorch is unavailable in this environment; "
191
  "using remote ASR fallback."
 
193
  self._use_remote = True
194
  self._loaded = True
195
  return
196
+
197
  self._load()
198
 
199
  def _load(self):
 
209
  t0 = time.perf_counter()
210
 
211
  token_kwargs = {"token": HF_TOKEN} if HF_TOKEN else {}
212
+ hf_model_cache = os.path.expanduser(
213
+ f"~/.cache/huggingface/hub/models--{TRANSCRIBE_MODEL_ID.replace('/', '--')}"
 
 
214
  )
215
+ local_only = TRANSCRIBE_LOCAL_ONLY or os.path.exists(hf_model_cache)
216
+
217
+ if local_only and not os.path.exists(hf_model_cache):
218
+ logger.error(
219
+ "Local Moonshine model cache not found; offline-only transcription "
220
+ "cannot proceed."
221
+ )
222
+ raise RuntimeError("Local Moonshine model is not cached locally.")
223
 
224
  self._feature_extractor = AutoFeatureExtractor.from_pretrained(
225
  TRANSCRIBE_MODEL_ID,
 
280
  if self._use_remote:
281
  return [self._remote_transcribe(audio, sr) for audio, sr in zip(audio_arrays, sample_rates)]
282
 
283
+ if self._model is None:
284
+ logger.warning("Local ASR model is unavailable; skipping transcription.")
285
+ return ["" for _ in audio_arrays]
286
+
287
  prepared = [
288
  self._resample(audio, sr, self._sample_rate)
289
  for audio, sr in zip(audio_arrays, sample_rates)