"""Backends ASR enfichables.

L'`VoiceEngine` ne connaît que l'interface `ASRBackend` (`load()` + `transcribe()`) :
le choix du moteur est piloté par `cfg["asr_engine"]`. Les imports lourds
(faster-whisper, onnx-asr) restent dans les sous-modules, chargés à la volée par la
factory → `stt --help` et la config marchent sans aucun moteur installé.
"""

from __future__ import annotations

from typing import Any, Protocol, runtime_checkable


@runtime_checkable
class ASRBackend(Protocol):
    """Transcripteur d'un énoncé entier (audio `np.int16` @16 kHz mono → texte)."""

    def load(self) -> None: ...

    def transcribe(self, audio_int16) -> str: ...


def make_backend(cfg: dict[str, Any]) -> "ASRBackend":
    """Construit le backend ASR d'après `cfg["asr_engine"]` (défaut : whisper)."""
    engine = (cfg.get("asr_engine") or "whisper").lower()
    if engine in ("whisper", "faster-whisper"):
        from .whisper import WhisperBackend

        return WhisperBackend(cfg)
    if engine in ("onnx", "onnx-asr", "parakeet", "nemotron", "canary"):
        from .onnx_parakeet import OnnxAsrBackend

        return OnnxAsrBackend(cfg)
    raise ValueError(
        f"asr_engine inconnu : {engine!r} (attendu 'whisper' ou 'onnx')"
    )
