# models/asr_whisper.py from faster_whisper import WhisperModel from utils.config import get_settings _asr_singleton = None class WhisperASR: def __init__(self): s = get_settings() # faster-whisper supports: 'cpu' or 'cuda' (no 'mps') requested = (s.ASR_DEVICE or "cpu").lower() device = "cpu" if requested not in ("cpu", "cuda") else requested if requested == "mps": print("[ASR] 'mps' not supported by faster-whisper; falling back to CPU.") compute_type = "int8" if device == "cpu" else "float16" self.model = WhisperModel("tiny", device=device, compute_type=compute_type) def transcribe(self, path: str) -> dict: segments, info = self.model.transcribe(path, beam_size=1, language="en") text = " ".join(seg.text.strip() for seg in segments) return {"text": text, "language": info.language, "segments": []} def get_asr(): global _asr_singleton if _asr_singleton is None: _asr_singleton = WhisperASR() return _asr_singleton