feat(stt-client): ASR enfichable — backend onnx Parakeet/Nemotron en plus de whisper (#32)

Phase 0 (abstraction) + Phase 1 (backend onnx), additif et rétrocompatible.

- voice/asr/ : protocole ASRBackend (load + transcribe) + factory make_backend
  pilotée par cfg["asr_engine"]. Imports lourds lazy → stt --help/config OK sans
  aucun moteur installé.
- whisper.py : faster-whisper extrait tel quel (défaut, comportement inchangé).
- onnx_parakeet.py : onnx-asr (Parakeet/Canary/Nemotron ONNX, multilingue FR,
  ~600M, CPU rapide / GPU AMD via onnxruntime-rocm). Providers configurables ;
  message d'install actionnable si onnx-asr absent.
- engine.py : délègue load()/_transcribe() au backend (le reste — VAD, wake word,
  TTS — inchangé).
- config : [voice] asr_engine="whisper" (défaut), onnx_model, onnx_providers.
- pyproject : extras optionnels onnx / onnx-rocm ; bump 0.6.1 → 0.7.0.

Bascule à chaud par config, rollback = asr_engine="whisper". Streaming = phase 2
(spike séparé). admin/ia/stt.md mis à jour.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-06-20 14:28:35 +02:00 committed by GitHub
parent 470c69881c
commit 4d8cc1968d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 153 additions and 20 deletions

View file

@ -39,7 +39,13 @@ DEFAULT_CONFIG: dict[str, Any] = {
},
"voice": {
"wake_word": "hermes",
# ASR : "whisper" (faster-whisper CPU, défaut) | "onnx" (Parakeet/Canary/Nemotron)
"asr_engine": "whisper",
"whisper_model": "large-v3",
# onnx-asr (si asr_engine="onnx") — modèle multilingue + execution providers.
# CPU par défaut ; pour le GPU AMD : ["ROCMExecutionProvider", "CPUExecutionProvider"].
"onnx_model": "nemo-parakeet-tdt-0.6b-v3",
"onnx_providers": ["CPUExecutionProvider"],
"piper_voice": "fr_FR-upmc-medium",
"language": "fr",
"silence_sec": 1.2,