model-service / README.md
github-actions[bot]
Deploy from Achraf-cyber/hackton-locallang@63ac66db05e9528cba107570a28176458093e313
129b391
|
Raw
History Blame Contribute Delete
5.02 kB
metadata
title: model-service
emoji: πŸ—£οΈ
colorFrom: blue
colorTo: green
sdk: docker
app_port: 7860

model-service

Service Python FastAPI dont le seul role est d'exposer l'acces aux langues Dioula et Moore : reconnaissance vocale (ASR), traduction et synthese vocale (TTS). Aucune logique de LLM, de base de donnees ou de simplification n'est geree ici.

Structure

model-service/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ main.py          # point d'entree FastAPI
β”‚   β”œβ”€β”€ deps.py          # configuration (Settings)
β”‚   └── services/
β”‚       β”œβ”€β”€ asr.py       # reconnaissance vocale
β”‚       β”œβ”€β”€ translation.py  # traduction
β”‚       └── tts.py       # synthese vocale
└── tests/

Developpement local

pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000

Modeles utilises

Deux stacks de traduction sont disponibles, selectionnees via la variable d'env MODEL_STACK (voir app/deps.py) :

Stack Traduction FR<->local Traduction locale<->locale Licence
old (defaut) facebook/nllb-200-3.3B via NLLB (paire directe) MIT/CC (Meta)
goaicorp goaicorp/dyu-translation, goaicorp/mos-translation pivot par le francais (deux appels sequentiels via les deux modeles GO AI) CC-BY-NC 4.0, non-commercial (Wendpanga Aristide Bandaogo, GO AI Corporation)

MODEL_STACK vaut "old" par defaut : aucun changement en prod tant que la variable n'est pas positionnee explicitement a "goaicorp" dans les secrets du Space HF concerne.

ASR : par defaut facebook/omniASR-LLM-7B (Meta Omnilingual ASR, backend omnilingual_llm), avec repli local sur facebook/mms-1b-all si le paquet omnilingual-asr (Linux/WSL uniquement) est indisponible (ASR_BACKEND, voir app/deps.py). Quand MODEL_STACK=goaicorp, tous ces backends sont ignores au profit de goaicorp/mos-asr et goaicorp/dyu-asr (le francais reste sur openai/whisper-large-v3, GO AI n'ayant pas de modele ASR francais dedie).

TTS : facebook/mms-tts-dyu (dioula) et facebook/mms-tts-mos (moore), modeles VITS. Un backend k2-fsa/OmniVoice a ete teste pour le dioula (TTS_BACKEND_DYU=omnivoice) puis desactive suite a des retours utilisateur sur une articulation incorrecte de certains mots β€” mms reste le defaut de Settings. GO AI n'a pas de modele TTS dioula, donc les deux stacks de traduction utilisent le meme backend TTS. La sortie audio est encodee en OGG/Opus (via pydub/ffmpeg, voir _write_ogg_opus() dans tts.py) : c'est le seul format que l'API Telegram sendVoice accepte (le WAV brut ne fonctionne avec aucune methode d'envoi audio de Telegram).

Deploiement sur Hugging Face Spaces

Ce dossier alimente TROIS Spaces Docker separes (16 Go de RAM chacun), synchronises automatiquement a chaque push sur main :

  • Traduction (AchrafCyber/model-service, header YAML ci-dessus : sdk: docker, app_port: 7860, Dockerfile) : stack de traduction (/translate, /to-french, voir "Modeles utilises" ci-dessus). Workflow : .github/workflows/deploy-model-service.yml.
  • ASR (AchrafCyber/asr-service, Dockerfile.asr, point d'entree app/main_asr.py) : omniASR-LLM-7B (Meta Omnilingual ASR). Workflow : .github/workflows/deploy-asr-service.yml, qui renomme Dockerfile.asr en Dockerfile dans le Space cible (HF Spaces exige ce nom exact).
  • TTS (AchrafCyber/tts-service, Dockerfile.omnivoice) : MMS-TTS pour le dioula et le moore (/speak). Le nom du Dockerfile date de l'essai OmniVoice (voir ci-dessus) mais le backend actif par defaut est mms. Workflow : .github/workflows/deploy-tts-service.yml, meme mecanisme de renommage.

Un quatrieme Space (automation-service, automatisation Playwright du site DEMO e-casier) existe dans le monorepo mais n'est pas deploye actuellement β€” le workflow .github/workflows/deploy-automation-service.yml cible AchrafCyber/automation-service-disabled, un nom placeholder, tant que ce Space n'a pas ete cree manuellement sur huggingface.co/new-space.

Ces Spaces existent separement parce que NLLB-200-3.3B (13 Go), omniASR-LLM-7B (29 Go) et un modele TTS charges ensemble dans un seul Space de 16 Go font crasher le conteneur (OOM) des qu'une requete declenche le chargement de plusieurs modeles lourds a la fois.

Les workflows partagent le meme dossier source (model-service/) mais poussent vers des repos Space distincts avec un Dockerfile different. Chaque Space lit ses propres "Secrets" (Settings > Variables and secrets du Space : ALLOWED_ORIGINS, HF_TOKEN, MODEL_STACK), pas ce repo. Cote backend, l'URL de chaque Space se configure via ASR_SERVICE_URL / TTS_SERVICE_URL (voir backend/lib/env.ts) ; si absentes, /transcribe et /speak retombent sur MODEL_SERVICE_URL (mode "un seul Space", utile en local β€” c'est pour ce mode que /localize combinant traduction+TTS est conserve cote FastAPI).