- 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
- Limite d’allocation de 2 Go → lecture multi-buffer avec
ShardedCursor
- Limite de l’espace d’adressage de 4 Go → chargement en deux étapes (libération du lecteur après parsing, puis finalisation)
- Table d’embedding de 1,5 Gio → embeddings Q4 sur GPU + recherche de lignes sur CPU
- Lecture synchrone GPU interdite → utilisation de
into_data_async().await
- 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
Licence et ressources
Aucun commentaire pour le moment.