TranscrIA
August 2, 2026 · View on GitHub
Statut : đą ImplĂ©mentĂ© â sert de rĂ©fĂ©rence SĂMANTIQUE du contrat du
inference_service(les renvois§4bisdansinference_service/pointent ici) ; la liste des routes est dĂ©sormais GĂNĂRĂE dansAPI_REFERENCE.md(vague C8, gardĂ©e en CI). Diarisation, empreinte vocale et STT distants sont en production ; voir aussiSERVICE_RESSOURCES_GPU.md(autonomie VRAM, A/B/C, admission §7.2) etCONCURRENCE_ET_CHARGE_PHASE_B.md(failover des nĆuds, rĂŽles).
Auteur : Martossien · Cadrage initial : 2026-05-30
Objectif : faire de TranscrIA un frontend / orchestrateur qui appelle des serveurs d'infĂ©rence distants (vLLM, vLLM-omni, service maison) oĂč rĂ©sident les ressources GPU/VRAM, plutĂŽt que de charger les modĂšles dans le process applicatif.
0. Résumé exécutif
Aujourd'hui TranscrIA charge la plupart de ses modĂšles dans son propre process (transformers, faster-whisper, NeMo, pyannote) et gĂšre lui-mĂȘme la VRAM via VRAMManager/GPUSession. Exception notable : le LLM d'arbitrage est dĂ©jĂ consommĂ© en API OpenAI-compatible (http://host:port/v1). C'est le modĂšle de rĂ©fĂ©rence vers lequel tendre.
La cible : séparer le plan de contrÎle (TranscrIA) du plan de calcul (serveurs GPU).
ââââââââââââââââââââââââââââââââ ââââââââââââââââââââââââââââââââââââââââââ
â TranscrIA â Frontend â HTTP â Plan de calcul (GPU distant) â
â (CPU, pas de modĂšle chargĂ©) â âââââââș â â
â âą Web / workflow / file â â vLLM â LLM + Cohere + Whisper (ASR) â
â âą QualitĂ© / lexique / DOCX â â + Granite (omni, chat audio) â
â âą Audit / notifications â â Service dĂ©diĂ© (FastAPI / Riva-Triton) â â
â âą Preflight / scene (CPU) â âââââââ â diarisation, embeddings voix, â
â â JSON â Parakeet â
ââââââââââââââââââââââââââââââââ ââââââââââââââââââââââââââââââââââââââââââ
Trois catégories de composants, par difficulté de bascule :
- DĂ©jĂ API â le LLM (texte). Rien Ă faire, valider la config distante.
- Servable par vLLM (vĂ©rifiĂ© sur doc officielle, voir §2.2) â Whisper, Cohere Transcribe et Granite Speech. C'est la bonne surprise : la majoritĂ© du STT passe par vLLM, pas par un service maison. RĂ©serve sur la richesse des rĂ©ponses (§3.2) et distinction ASR-dĂ©diĂ© vs LLM-audio (§2.2).
- Aucun standard / service dĂ©diĂ© â diarisation (pyannote, Sortformer), Parakeet (NeMo, pas de support vLLM trouvĂ©), embeddings voix. â service d'infĂ©rence dĂ©diĂ© (FastAPI maison et/ou NVIDIA Riva/Triton pour les modĂšles NeMo).
Point dur central, confirmé : la diarisation n'a aucune API standard (ni vLLM, ni OpenAI). C'est elle qui justifie le « service pour ce qui ne passe pas en API ». Le périmÚtre de ce service est cependant plus réduit que prévu : essentiellement diarisation + embeddings voix (+ Parakeet à confirmer), puisque Cohere/Granite/Whisper rejoignent vLLM.
1. Ătat des lieux â qui charge quoi, et oĂč
1.1 Inventaire des composants GPU
| Composant | Chargement actuel | Servable par vLLM ? | Cible |
|---|---|---|---|
| LLM arbitrage / rĂ©sumĂ© | Serveur OpenAI-compatible :8080 (HttpLLMBackend) | â
déjà (/v1/chat/completions) | Déjà fait |
| Whisper large-v3 | faster-whisper, in-process | â
vLLM, ASR (/v1/audio/transcriptions) | vLLM |
| Cohere Transcribe | transformers, in-process | â
vLLM confirmé (vllm serve CohereLabs/cohere-transcribe-03-2026 --trust-remote-code, vllm[audio]) | vLLM |
| Granite Speech 4.1 | transformers, in-process | â
vLLM confirmé (LLM audio-in, /v1/chat/completions multimodal) | vLLM (omni) |
| Parakeet TDT (NeMo) | NeMo, in-process | â pas de support vLLM trouvĂ© | service dĂ©diĂ© / Riva-Triton |
| pyannote community-1 | pyannote.audio, in-process | â aucun standard | service maison |
| Sortformer 4spk (NeMo) | NeMo, in-process | â (NeMo) | service maison / Riva-Triton |
| Embeddings voix | in-process | â (/v1/embeddings = texte) | service maison |
| VAD Silero, preflight, scÚne | librosa/CPU | n/a (CPU) | reste cÎté frontend |
1.2 Abstractions dĂ©jĂ en place â les points d'insertion
Le code a déjà les bonnes coutures pour brancher des implémentations « remote » sans réécrire le pipeline :
transcria/stt/base_transcriber.pyâ ABCBaseTranscriber:available(),load(),transcribe(audio_path|audio_array, language, âŠ) -> list[dict],offload(). â unRemoteTranscriber(BaseTranscriber)qui poste l'audio Ă une API implĂ©mente cette interface tel quel.transcria/stt/base_diarizer.pyâ ABCBaseDiarizer(+diarizer_factory). â unRemoteDiarizer(BaseDiarizer).transcria/gpu/llm_backend.pyâHttpLLMBackend.base_urlpointe dĂ©jĂ vers un/v1arbitraire. â la bascule LLM distant est une affaire de config.transcria/stt/transcriber_factory.py/diarizer_factory.pyâ sĂ©lection du backend par config. â ajouter un backendremoteau factory.
Conséquence architecturale forte : la migration n'impose pas de refonte du pipeline. Elle consiste à fournir des implémentations
Remote*des ABC existantes et à les cùbler dans les factories. LeVRAMManager/GPUSessiondevient optionnel cÎté client (voir §4.3).
2. Protocoles cibles
2.1 LLM texte â OpenAI-compatible (dĂ©jĂ opĂ©rationnel)
/v1/chat/completions et /v1/completions. Servi par vLLM, llama-server, ollama. Le contrat est stable et riche. Aucune action sauf : permettre une base_url non-localhost + clé API + TLS (voir §3.9).
2.2 STT via vLLM â deux familles de modĂšles, deux endpoints
vLLM sert trois des backends STT historiques du projet (cohere, whisper, parakeet â le projet en compte davantage depuis), mais via deux mĂ©canismes diffĂ©rents qu'il faut bien distinguer car ils n'ont pas le mĂȘme contrat de rĂ©ponse.
Famille A â ASR dĂ©diĂ©s â /v1/audio/transcriptions
ModÚles spécialisés transcription, exposés sur l'endpoint OpenAI Audio.
- Whisper : supporté par vLLM (
AudioAsset, ASR). - Cohere Transcribe : â
confirmĂ© doc officielle â
Sert un endpoint de transcription audio. C'est le chemin privilégié puisque Cohere est le backend par défaut du projet.uv pip install -U vllm==0.19.0 --torch-backend=auto uv pip install vllm[audio] librosa vllm serve CohereLabs/cohere-transcribe-03-2026 --trust-remote-code
Réponse : texte + segments, verbose_json ajoute des timestamps de segment.
Famille B â LLM audio-in (omni) â /v1/chat/completions multimodal
ModÚles génératifs qui prennent de l'audio en entrée et produisent du texte. Ce ne sont pas des ASR classiques.
- Granite Speech 4.1 : â
confirmĂ© doc officielle â exemple vLLM avec
LLM/SamplingParams/AudioAsset. C'est un LLM audio-in : en serving, l'audio est passé comme contenu multimodal d'un message/v1/chat/completions, la réponse est du texte généré.
ConsĂ©quence importante : la famille B ne renvoie pas de structure native segment/timestamp/confiance â c'est de la gĂ©nĂ©ration de texte. La perte de champs (§3.2) y est maximale. Granite reste donc un backend d'appoint, pas un remplaçant direct de Cohere/Whisper pour le pipeline qui s'appuie sur les timestamps et
no_speech_prob.
â ïž RĂ©serve critique â perte de champs (vaut pour les deux familles)
Le pipeline dépend de signaux que ces endpoints ne renvoient pas toujours :
no_speech_probpar segment (utilisĂ© parreliability)avg_logprob/ confiance mot-Ă -mot (reliabilityâmots_faible_confiance)- timestamps mot-Ă -mot (alignement et rĂ©alignement locuteurs)
â Options : (a) configurer vLLM pour exposer ces champs si le modĂšle/endpoint le permet, (b) enrichir via un wrapper, ou (c) dĂ©gradation documentĂ©e du reliability en mode distant. Ă trancher â principal compromis fonctionnel de la bascule STT, et c'est prĂ©cisĂ©ment ce que le mode hybride (STT_ADAPTATIF_ET_HYBRIDE.md) peut compenser (re-transcription ciblĂ©e).
2.3 Parakeet â pas de vLLM
Aucun support vLLM trouvé pour Parakeet TDT (modÚle NeMo). Options : le servir via NVIDIA Riva / Triton (serving natif NeMo) ou l'intégrer au service maison. Comme c'est un backend expérimental, il peut rester en dernier dans la migration (voire local le temps de la transition).
2.4 Le service d'inférence dédié (« TranscrIA Inference Service »)
PĂ©rimĂštre rĂ©duit depuis la confirmation vLLM : ce service ne porte plus les STT principaux (Cohere/Granite/Whisper â vLLM), mais ce qui n'a aucun standard :
- diarisation (pyannote community-1, Sortformer) â le vrai point dur ;
- embeddings voix (empreintes locales) ;
- Parakeet (optionnel, si on ne passe pas par Riva/Triton).
Un service FastAPI hébergé prÚs des GPU, contrat propre à TranscrIA :
POST /infer/diarize body: audio (ref ou upload) + num/min/max_speakers (optionnels) â tours, embeddings, samples
POST /infer/voice-embed body: audio â vecteur d'empreinte
POST /infer/transcribe body: audio + backend(parakeet) + lang â segments enrichis (optionnel)
GET /health /ready /models â supervision
Alternative pour les modĂšles NeMo (Sortformer, Parakeet) : NVIDIA Riva / Triton offre un serving natif NeMo. Ă Ă©valuer contre le service FastAPI maison â Triton apporte le batching/scaling, le FastAPI maison apporte le contrĂŽle du format de rĂ©ponse (le format speaker_turns.json actuel devient le contrat).
Ce service rĂ©utilise le code STT/diarisation existant de TranscrIA (les classes actuelles), simplement dĂ©placĂ© derriĂšre une API. Il porte aussi le VRAMManager/GPUSession cĂŽtĂ© serveur (lĂ oĂč sont rĂ©ellement les GPU).
3. ProblĂšmes techniques Ă anticiper (exhaustif)
Section centrale. Chaque point est un risque réel à traiter avant ou pendant la migration.
3.1 Transfert de l'audio vers le serveur
Le STT/diarisation distant a besoin de l'audio. Trois stratégies, chacune avec un coût :
- Upload multipart par requĂȘte : simple, mais fichiers de rĂ©union volumineux (1h â 100+ Mo WAV) â limites de taille HTTP, mĂ©moire, timeouts.
- Base64 inline : +33 % de volume, Ă proscrire pour le gros audio.
- Stockage partagĂ© (NFS / objet S3-like) : le frontend dĂ©pose l'audio, le serveur lit une rĂ©fĂ©rence. Plus efficace mais ajoute une dĂ©pendance d'infra et un sujet de droits/RGPD (oĂč vit l'audio).
â Recommandation : stockage partagĂ© pour le batch, upload pour les petits extraits. Ă cadrer selon l'infra cible.
3.2 Richesse des réponses STT (cf. §2.2)
Le pipeline « casse » silencieusement si no_speech_prob / confiance mot-Ă -mot / timestamps mot disparaissent : reliability perd ses signaux, le rĂ©alignement locuteurs se dĂ©grade. â dĂ©finir un contrat minimal de rĂ©ponse STT que tout backend distant doit honorer, et un mode dĂ©gradĂ© explicite sinon.
3.3 Diarisation â aucun standard
Pas de /v1/diarization. Le service maison doit exposer : tours exclusifs, embeddings par locuteur, extraits audio (samples), genre vocal. Le format de speaker_turns.json / speaker_stats.json actuel devient le contrat de l'API. Attention au volume (embeddings, clips audio renvoyés).
3.4 Le VRAMManager local perd son sens
VRAMManager mesure la VRAM locale et choisit un GPU local. Si les GPU sont distants, le client ne les voit plus. Conséquences :
- La logique « meilleur GPU libre » migre cÎté serveur.
- La file d'attente (
queue) ne doit plus raisonner en « GPU local » mais en capacitĂ© serveur (slots, concurrence acceptĂ©e par l'endpoint). LeQueueSchedulerdoit interroger la disponibilitĂ© distante, pasnvidia-smi. CUDA_VISIBLE_DEVICES, le remapping, le nettoyage des process LLM concurrents â deviennent des prĂ©occupations serveur.
3.5 Latence et timeouts
Transfert rĂ©seau + infĂ©rence distante + retour. Sur 1h d'audio, le temps total peut dĂ©passer les timeouts HTTP par dĂ©faut. Les timeouts actuels (summary_llm.timeout_seconds=1800) sont pensĂ©s local. â timeouts dĂ©diĂ©s par type d'appel, et traitement asynchrone (job cĂŽtĂ© serveur + polling) plutĂŽt que requĂȘte synchrone longue pour le gros audio.
3.6 Gestion d'erreur réseau et résilience
Un serveur distant tombe, sature, ou répond en erreur. Le pipeline ne doit pas mourir :
- Retry avec backoff sur erreurs transitoires.
- Circuit breaker : ne pas marteler un serveur down.
- Fallback : repli sur un autre serveur, ou sur le mode local si le modÚle est encore installable cÎté client (option de transition).
- Distinguer erreur rĂ©seau (retry) d'erreur mĂ©tier (audio invalide â pas de retry).
3.7 Concurrence et batching
Plusieurs jobs TranscrIA simultanĂ©s â N requĂȘtes au serveur. vLLM gĂšre le batching nativement ; le service maison doit gĂ©rer sa propre file/concurrence (sinon OOM GPU cĂŽtĂ© serveur). La concurrence cĂŽtĂ© client (workflow.execution.max_concurrent_jobs) doit ĂȘtre alignĂ©e avec la capacitĂ© rĂ©elle du serveur.
3.8 Cohérence et versionnement des modÚles
Le transcription_metadata.backend doit reflĂ©ter le modĂšle rĂ©ellement servi cĂŽtĂ© serveur, pas le modĂšle demandĂ©. Risque de dĂ©rive : le serveur met Ă jour un modĂšle, les rĂ©sultats changent sans que le client le sache. â exposer la version du modĂšle via /models et la tracer dans les mĂ©tadonnĂ©es job.
3.9 Sécurité et secrets
- â
Implémenté (Phase 0,
inference_service/security.py) : clĂ© API partagĂ©e sur/infer/*(Bearer / X-API-Key, comparaison Ă temps constant, sondes libres), allowlist de cheminsfile_refanti-traversal (403hors racines), limite d'upload (413). ClĂ© via variable d'env (auth.api_key_env), pas de secret en clair. - đ TLS si le rĂ©seau n'est pas de confiance (terminaison cĂŽtĂ© reverse-proxy ou serveur WSGI).
- L'audio quitte le frontend â vĂ©rifier la conformitĂ© RGPD (le serveur GPU est-il dans le mĂȘme pĂ©rimĂštre ?). CohĂ©rent avec la philosophie « tout local » actuelle du projet : si le serveur est externe, c'est une dĂ©cision Ă auditer.
3.10 Observabilité
/metrics, /health, /ready doivent remonter l'Ă©tat des serveurs distants (joignables ? prĂȘts ? latence ?). Le health check actuel ne teste que la base locale. â ajouter des sondes vers chaque endpoint distant, et un Ă©tat « dĂ©gradĂ© » si un backend est injoignable.
3.11 Installation et empreinte client
Avantage de la bascule : le frontend n'a plus besoin de tĂ©lĂ©charger les modĂšles (gain d'install, moins de VRAM cĂŽtĂ© client, voire client CPU-only). Mais le serveur devient le point critique unique â sa disponibilitĂ© conditionne tout le pipeline. Ă documenter dans INSTALL.md (deux profils : client lĂ©ger / serveur GPU).
3.12 Chunking et préparation audio
Le découpage (VAD, tours pyannote, chunks 30s) est aujourd'hui fait avant la transcription, cÎté pipeline. à décider : le chunking reste-t-il cÎté frontend (envoi de chunks) ou migre-t-il cÎté serveur (envoi du fichier entier) ? Impacte le volume réseau et le contrat d'API.
4. Architecture cible détaillée
4.1 Ce qui reste cÎté frontend (TranscrIA)
Tout le plan de contrÎle, CPU-bound : web/auth/rÎles, workflow et états, file et planification (adaptée §3.4), lexiques, qualité, rapport DOCX, audit, notifications, preflight/scene/VAD (CPU). Le frontend devient déployable sans GPU.
4.2 Ce qui migre cÎté serveur(s)
- vLLM : LLM (déjà ) + Cohere Transcribe + Whisper (ASR,
/v1/audio/transcriptions) + Granite (omni,/v1/chat/completions). C'est le serveur principal d'inférence du projet. - TranscrIA Inference Service (FastAPI maison) et/ou Riva/Triton : diarisation (pyannote/Sortformer), embeddings voix, Parakeet. Réutilise les classes existantes derriÚre une API.
4.3 Le point d'insertion dans le code
# transcria/stt/transcriber_factory.py
if backend == "remote":
return RemoteTranscriber(endpoint=cfg["remote_stt"]["url"], ...) # implémente BaseTranscriber
# transcria/stt/diarizer_factory.py
if backend == "remote":
return RemoteDiarizer(endpoint=cfg["remote_diar"]["url"], ...) # implémente BaseDiarizer
Les Remote* postent l'audio, parsent la rĂ©ponse au mĂȘme format que les implĂ©mentations locales (list[dict] de segments enrichis, speaker_turnsâŠ). Le reste du pipeline ne voit aucune diffĂ©rence.
4.4 Configuration cible (esquisse)
inference:
mode: local | remote | hybrid # hybrid = certains backends distants, d'autres locaux
llm: { url: "http://gpu-host:8080/v1", api_key_env: "TRANSCRIA_LLM_KEY" }
# STT via vLLM (Cohere/Whisper = ASR ; Granite = chat multimodal)
stt:
backend: remote
cohere: { url: "http://gpu-host:8001/v1", endpoint: audio_transcriptions, model: "CohereLabs/cohere-transcribe-03-2026" }
whisper: { url: "http://gpu-host:8001/v1", endpoint: audio_transcriptions, model: "whisper-large-v3" }
granite: { url: "http://gpu-host:8001/v1", endpoint: chat_completions, model: "ibm-granite/granite-speech-4.1-2b" }
# diarisation + embeddings : service dédié (pas de standard)
diarization:{ backend: remote, url: "http://gpu-host:8002/infer/diarize" }
voice_embed:{ url: "http://gpu-host:8002/infer/voice-embed" }
transport: { audio: shared_storage | upload, shared_root: "/mnt/transcria" }
resilience: { timeout_s: 1800, retries: 2, circuit_breaker: true }
4bis. Phase 0 â Service maison en localhost (strangler pattern)
Décision (2026-05-30) : démarrer la migration en extrayant un seul composant (ce qui n'a aucun standard API) derriÚre un service FastAPI tournant d'abord en
127.0.0.1, avant tout dĂ©mĂ©nagement distant. On valide la mĂ©canique clientâserveur sans la complexitĂ© rĂ©seau ; le passage distant ne sera qu'un changement d'URL.
4bis.1 PĂ©rimĂštre â uniquement ce qui doit absolument y passer
Le service ne porte que ce qui n'a pas de standard (les STT vont sur vLLM, §2.2) :
- Embeddings voix â petit, autonome â premier endpoint, valide tout le circuit avec un minimum de surface.
- Diarisation (pyannote + Sortformer) â le cĆur, plus riche (tours + samples + genre) â ensuite, mĂȘme patron.
4bis.2 Double topologie supportée dÚs le départ
Le mĂȘme service, le mĂȘme contrat, sert deux cas :
- Mono-machine : frontend + service sur la mĂȘme machine â
url: http://127.0.0.1:8002, transport audio par rĂ©fĂ©rence fichier (mĂȘme filesystem). - Frontal sĂ©parĂ© : service sur l'hĂŽte GPU â
url: http://gpu-host:8002, transport upload / stockage partagé.
â Contrat identique, seule l'URL et le mode de transport changent. Le contrat audio supporte donc les deux modes (rĂ©fĂ©rence + upload) dĂšs la v1.
4bis.3 Gestion VRAM â pattern A/B/C (transposĂ© du LLM)
Quand une requĂȘte arrive, le service applique la mĂȘme logique que le LLM d'arbitrage :
| Cas | Situation | Action |
|---|---|---|
| A | ModÚle déjà résident en VRAM | Sert directement |
| B | ModÚle non chargé, VRAM libre | Charge puis sert |
| C | VRAM occupĂ©e (STT/LLM tient le GPU) | 503 + Retry-After â le QueueScheduler existant remet le job en file |
Le CAS C rĂ©utilise la file existante cĂŽtĂ© frontend â pas de nouvelle file Ă inventer cĂŽtĂ© service.
4bis.4 Allocation GPU â assignation statique, pas de nĂ©gociation
Pas de dialogue frontendâservice (couplage fragile, race conditions). Ă la place, selon la topologie :
- Machine multi-GPU (ex. 8 cartes) : assignation statique par rĂŽle via
CUDA_VISIBLE_DEVICES. Ex. GPU 0-2 â vLLM (LLM+STT), GPU 3 â service diarisation, etc. Aucun conflit, aucune nĂ©gociation. Le service a son GPU â modĂšle rĂ©sident avec idle-timeout (dĂ©charge aprĂšs N min d'inactivitĂ©). - Machine mono-GPU : un seul arbitre VRAM (jamais deux). Le service charge/dĂ©charge Ă la demande en respectant l'arbitre â modĂšle Ă la demande, CAS C via la file.
ConsĂ©quence : « modĂšle rĂ©sident vs Ă la demande » dĂ©coule de la topologie, ce n'est pas un choix indĂ©pendant. Et l'assignation statique (multi-GPU) rend le CAS C quasi inutile en pratique â c'est un filet de sĂ©curitĂ©.
4bis.5 Squelette envisagé
inference_service/ # FastAPI, hors package frontend
app.py # /health /ready /models
routes/voice_embed.py # POST /infer/voice-embed â Ă©tape 1 (simple)
routes/diarize.py # POST /infer/diarize â Ă©tape 2 (cĆur)
engine/ # réutilise transcria.voice.embedding / stt.diarization
vram.py # logique A/B/C + idle-timeout (multi-GPU) ou arbitre (mono)
Config cĂŽtĂ© frontend (mode: hybrid â fallback local si le service ne rĂ©pond pas) :
inference:
mode: hybrid
diarization:{ backend: remote, url: "http://127.0.0.1:8002/infer/diarize", fallback_local: true }
voice_embed:{ url: "http://127.0.0.1:8002/infer/voice-embed", fallback_local: true }
transport: { audio: file_ref } # file_ref en mono-machine, upload en distant
5. Plan de migration progressif
| Ătape | Contenu | Risque | PrĂ©requis |
|---|---|---|---|
| 0 | Valider le LLM distant (dĂ©jĂ API) avec base_url non-localhost + clĂ© | Faible | â |
| 1 | RemoteTranscriber Cohere via vLLM (vllm serve CohereLabs/cohere-transcribe-03-2026) â backend par dĂ©faut, gain immĂ©diat. DĂ©cider du sort des champs perdus (§3.2) | Moyen | vLLM[audio] |
| 2 | Ajouter Whisper (mĂȘme endpoint ASR) puis Granite (chat multimodal) au RemoteTranscriber | Faible | Ă©tape 1 |
| 3 | â
TranscrIA Inference Service (Flask) : /health /ready /models, sĂ©curitĂ© des flux | Fait | â |
| 3b | â
Embeddings voix distants (/infer/voice-embed) | Fait | étape 3 |
| 4 | â
Diarisation distante (RemoteDiarizer + /infer/diarize + factory backend=remote) + client frontend InferenceClient (auth, transports, retry, fallback local) | Fait | étape 3 |
| 5 | â
Empreinte vocale distante (RemoteVoiceEmbeddingBackend + create_voice_embedding_backend(), contrÎle d'intégrité sha256, fallback local) cùblée dans VoiceEnrollmentService ; reste Parakeet (service maison ou Riva/Triton) | Fait (Parakeet à part) | client OK |
| 6 | Adapter QueueScheduler au scheduling « capacitĂ© serveur » (§3.4), neutraliser VRAMManager cĂŽtĂ© client | ĂlevĂ© | Ă©tapes 1-5 |
| 7 | RĂ©silience transverse : â
retry/backoff + fallback faits cÎté client ; reste circuit breaker, sondes /metrics distantes (§3.6, §3.10) | Partiel | toutes |
| 8 | Profil d'install « client léger » dans INSTALL.md | Faible | toutes |
RĂ©ordonnancement clĂ© vs version initiale : les STT (Cohere/Whisper/Granite) passent en tĂȘte car vLLM les sert directement â c'est rapide et Ă fort gain. Le service maison se concentre dĂ©sormais sur la diarisation + embeddings (Ă©tapes 3-5), pĂ©rimĂštre rĂ©duit.
Ordre conseillĂ© : 0 â 1/2 (STT via vLLM, gain rapide) â 3/4 (le cĆur dur : service maison + diarisation) â 5 â 6/7 (industrialisation) â 8.
Le mode hybride de STT_ADAPTATIF_ET_HYBRIDE.md devient trivial une fois cette migration faite : re-transcrire les segments douteux = appels API parallĂšles, sans charge/dĂ©charge GPU. Les deux chantiers sont complĂ©mentaires â l'API d'abord, l'hybride ensuite.
6. Questions ouvertes (Ă trancher avec les retours users / infra)
- PĂ©rimĂštre RGPD : le serveur GPU est-il dans le mĂȘme pĂ©rimĂštre de confiance que le frontend ? L'audio peut-il en sortir ? (cohĂ©rence avec la philosophie « tout local » actuelle).
- Transport audio : stockage partagĂ© (NFS/S3) ou upload par requĂȘte ? DĂ©pend de l'infra cible.
- Champs STT : exige-t-on un contrat enrichi (no_speech_prob, logprobs, timestamps mot) cÎté serveur, ou accepte-t-on un
reliabilitydĂ©gradĂ© en mode distant ? (Critique pour Granite-omni qui ne renvoie que du texte.) - Granite via chat vs ASR : Granite (famille B) ne produit pas de timestamps. Le garde-t-on comme backend secondaire, ou seulement pour des cas oĂč la structure segment importe peu ?
- Diarisation NeMo : service FastAPI maison ou NVIDIA Riva/Triton pour Sortformer (et Parakeet) ?
- Synchrone vs asynchrone : requĂȘte longue bloquante ou job serveur + polling pour le gros audio ?
- Mode
hybrid: autorise-t-on certains backends distants et d'autres locaux simultanément (transition douce) ? - Un seul serveur ou plusieurs : vLLM unifié (LLM + Cohere + Whisper + Granite) + service diarisation, ou un serveur par fonction ?
7. Fichiers concernés (au moment de l'implémentation)
transcria/stt/base_transcriber.py # ABC â dĂ©jĂ le bon contrat
transcria/stt/transcriber_factory.py # ajouter backend "remote"
transcria/stt/remote_transcriber.py # NOUVEAU â RemoteTranscriber vers vLLM
# (Cohere/Whisper â /v1/audio/transcriptions ;
# Granite â /v1/chat/completions multimodal)
transcria/stt/base_diarizer.py # ABC
transcria/stt/diarizer_factory.py # ajouter backend "remote"
transcria/stt/remote_diarizer.py # NOUVEAU â RemoteDiarizer vers service dĂ©diĂ©
transcria/gpu/llm_backend.py # HttpLLMBackend : base_url distante + clĂ© (quasi prĂȘt)
transcria/gpu/vram_manager.py # neutralisable / conditionnel cÎté client (§3.4)
transcria/queue/scheduler.py # scheduling "capacité serveur" au lieu de nvidia-smi
transcria/web/routes.py # /health /ready /metrics : sondes serveurs distants
inference_service/ # NOUVEAU service FastAPI : diarisation + embeddings (+ Parakeet)
config.example.yaml # section `inference:` (§4.4)
docs/INSTALL.md # profils client léger / serveur GPU
docs/CONFIG_REFERENCE.md # documentation de la section inference
Aucune refonte du pipeline : la migration s'appuie sur les ABC BaseTranscriber / BaseDiarizer existantes. Le risque principal n'est pas le code applicatif mais l'infrastructure (transport audio, diarisation sans standard, résilience réseau).