4 points par GN⁺ 2026-02-11 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • Implémentation en Rust permettant d’exécuter la reconnaissance vocale en streaming à la fois en environnement natif et dans le navigateur, en utilisant le framework ML Burn
  • Le modèle est basé sur Voxtral Mini 4B Realtime de Mistral et effectue une inférence entièrement côté client dans un onglet de navigateur via WASM + WebGPU
  • Le modèle quantifié Q4 GGUF (2,5 Go) peut être exécuté dans le navigateur, tandis que le modèle F32 basé sur SafeTensors (9 Go) fonctionne en environnement natif
  • Pour contourner les contraintes du navigateur (allocation de 2 Go, espace d’adressage de 4 Go, restrictions de lecture GPU, etc.), des techniques comme le sharding, le chargement en deux étapes et le traitement asynchrone des tenseurs ont été appliquées
  • Le projet est publié sous licence Apache-2.0 et une démo en temps réel est disponible sur HuggingFace Spaces

Aperçu de Voxtral Mini 4B Realtime (Rust)

  • Implémentation complète du modèle Voxtral Mini 4B Realtime de Mistral en Rust avec le framework ML Burn
    • La reconnaissance vocale en streaming peut être exécutée en local et dans le navigateur
    • La version navigateur fonctionne côté client en s’appuyant sur WASM (WebAssembly) et WebGPU
  • Le modèle quantifié Q4 GGUF (environ 2,5 Go) s’exécute dans le navigateur, tandis que le modèle F32 SafeTensors (environ 9 Go) est utilisé en environnement natif
  • Une démo en temps réel est proposée sur HuggingFace Spaces

Architecture

  • L’audio d’entrée (16 kHz mono) est converti en spectrogramme Mel, puis transformé en texte via un encodeur (32 couches) et un décodeur (26 couches)
  • Principales étapes de traitement
    • Spectrogramme Mel → encodeur (32 couches, 1280 dimensions) → sous-échantillonnage Conv 4x → adaptateur (3072 dimensions) → décodeur (GQA 32Q/8KV)
  • Deux chemins d’inférence sont proposés
    • F32 (natif) : basé sur SafeTensors, utilise les opérations sur tenseurs de Burn
    • Q4 GGUF (natif + navigateur) : quantification GGUF Q4_0, utilise des shaders WGSL personnalisés

Solutions techniques pour l’exécution dans le navigateur

  • Pour exécuter un modèle 4B dans le navigateur, 5 contraintes ont été résolues
    1. Limite d’allocation de 2 Go → lecture multi-buffer avec ShardedCursor
    2. Limite de l’espace d’adressage de 4 Go → chargement en deux étapes (libération du lecteur après parsing, puis finalisation)
    3. Table d’embedding de 1,5 Gio → embeddings Q4 sur GPU + recherche de lignes sur CPU
    4. Lecture synchrone GPU interdite → utilisation de into_data_async().await
    5. Limite de 256 workgroups → limitation de la taille des kernels via un patch cubecl-wgpu

Correction du padding Q4

  • Par défaut, mistral-common padde l’audio avec 32 tokens de silence, mais cela ne couvre que la moitié des 38 préfixes du décodeur
  • Le modèle quantifié Q4_0 provoquait donc des erreurs lorsque la parole commence immédiatement dans l’entrée
  • Pour corriger cela, le padding a été étendu à 76 tokens (= 38 tokens du décodeur) afin de remplir l’ensemble du préfixe avec du silence

Build et tests

  • Options de build
    • Par défaut : cargo build --release (wgpu + native-tokenizer)
    • Pour le navigateur : wasm-pack build --target web --features wasm
  • Tests
    • Prise en charge des tests unitaires et d’intégration basés sur GPU
    • Les tests navigateur E2E sont exécutés avec Playwright + un véritable environnement GPU
    • En CI, ces tests sont ignorés faute de GPU

Préparation du modèle et sharding

  • Pour respecter la limite de ArrayBuffer du navigateur (512 Mo ou moins), le fichier GGUF est découpé en shards
    split -b 512m models/voxtral-q4.gguf models/voxtral-q4-shards/shard-  
    
  • Le serveur de développement et les tests E2E détectent automatiquement les shards

Licence et ressources

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.