diff --git a/apps/stt/main.py b/apps/stt/main.py index e0526b0..3af3dee 100644 --- a/apps/stt/main.py +++ b/apps/stt/main.py @@ -51,21 +51,36 @@ def _stt_service() -> WhisperSTTService: device = _env("STT_DEVICE", "cpu") or "cpu" compute = _env("STT_COMPUTE_TYPE", "int8") or "int8" - prompt = _env( - "STT_PROMPT", - "یادداشت و مکالمهٔ فروش به زبان فارسی. اسامی مشتریان و اصطلاحات کسب‌وکار را دقیق بنویس.", - ) try: + # Settings fields differ by Pipecat version — keep to model + language only + settings_kwargs: dict = {"model": _model_name()} + try: + settings_kwargs["language"] = Language.FA + settings = WhisperSTTService.Settings(**settings_kwargs) + except TypeError: + settings_kwargs.pop("language", None) + settings = WhisperSTTService.Settings(**settings_kwargs) + _stt = WhisperSTTService( device=device, compute_type=compute, - settings=WhisperSTTService.Settings( - model=_model_name(), - language=Language.FA, - initial_prompt=prompt or None, - ), + settings=settings, ) + except TypeError: + # Older constructor: model=/language= kwargs instead of settings= + try: + _stt = WhisperSTTService( + model=_model_name(), + device=device, + compute_type=compute, + language=Language.FA, + ) + except Exception as exc: + raise HTTPException( + status_code=503, + detail=f"بارگذاری مدل Whisper محلی ناموفق بود: {exc}", + ) from exc except Exception as exc: raise HTTPException( status_code=503, @@ -178,11 +193,20 @@ def _transcribe_local(wav_bytes: bytes) -> str: audio, rate = _wav_to_float32(dst.read_bytes()) settings = getattr(service, "_settings", None) - language = getattr(settings, "language", Language.FA) + language = getattr(settings, "language", None) or Language.FA lang_code = getattr(language, "value", language) if language is not None else "fa" if isinstance(lang_code, str) and "-" in lang_code: lang_code = lang_code.split("-")[0] - initial_prompt = getattr(settings, "initial_prompt", None) + # Language enum may be "fa" or "FA" or full name — faster-whisper wants ISO code + if isinstance(lang_code, str): + lang_code = lang_code.lower() + if lang_code in ("persian", "farsi"): + lang_code = "fa" + + initial_prompt = _env( + "STT_PROMPT", + "یادداشت و مکالمهٔ فروش به زبان فارسی. اسامی مشتریان و اصطلاحات کسب‌وکار را دقیق بنویس.", + ) or None segments, _info = model.transcribe( audio,