# Souffle — démo locale mobile

Cette démo est une application web installable. Elle est distincte de l'application Mac et ne constitue ni un APK Android ni une application iPhone distribuée sur un store.

## Calcul et confidentialité

- Import de 0,3 à 60 secondes, fichier de 10 000 000 octets maximum. La durée est vérifiée avant et après décodage.
- Décodage et rééchantillonnage Web Audio en mono 16 kHz. Transcription française réelle par Whisper base, calcul WebAssembly sur CPU avec un seul thread, dans un worker.
- Le texte présenté est exclusivement la sortie du modèle, puis les modifications éventuelles de l'utilisateur. Aucun texte de démonstration ne remplace silencieusement une inférence.
- Aucun audio ni texte transmis par le code à un serveur. Aucun compte, clé API, appel d'API de modèle ou abonnement client.
- Modèle téléchargé uniquement après consentement et clic. Hugging Face et ses CDN reçoivent les métadonnées techniques de cette connexion, pas l'audio importé.
- Seuls les fichiers de l'interface, du moteur et du modèle sont mis en cache. Audio et transcription restent en mémoire ; l'export texte est une action explicite. Le bouton d'effacement retire audio et texte de la page. Un second bouton supprime les caches du modèle et du moteur.
- L'annulation termine le worker de calcul. Des fichiers du modèle déjà téléchargés peuvent rester dans le cache, supprimable séparément.

## Versions et sources

Les fichiers JavaScript et WebAssembly sont fournis avec cette page, sans CDN JavaScript à l'exécution.

- Transformers.js **3.8.1** : [documentation versionnée](https://huggingface.co/docs/transformers.js/v3.8.1/index), [réglages](https://huggingface.co/docs/transformers.js/v3.8.1/custom_usage). Archive npm `https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.8.1.tgz`, SHA-1 npm `317da003865322396796173223eeaaf0f9723f0a`. Les fichiers sont extraits sans exécuter de scripts d'installation.
- ONNX Runtime Web **1.22.0-dev.20250409-89f8206ba4**, version embarquée par cette version de Transformers.js. Les fichiers `ort-wasm-simd-threaded.jsep.mjs` et `.wasm` proviennent du même paquet officiel que le JavaScript. Malgré son nom « threaded », le moteur est explicitement configuré avec `numThreads = 1`.
- Modèle [Xenova/whisper-base](https://huggingface.co/Xenova/whisper-base/tree/64da57285918e20ea79ea5c88eed7197933abaa8), multilingue, quantification q8. Révision immuable : `64da57285918e20ea79ea5c88eed7197933abaa8`. Les requêtes partent vers `https://huggingface.co/Xenova/whisper-base/resolve/64da57285918e20ea79ea5c88eed7197933abaa8/`, puis peuvent être redirigées vers un CDN Hugging Face.
- Modèle original : [OpenAI Whisper base](https://huggingface.co/openai/whisper-base). La carte du dépôt ONNX annonce Apache-2.0 ; la licence du projet Whisper original est conservée aussi.
- Licences et notices : dossier [vendor](vendor/files.json), dont Apache-2.0 pour Transformers.js, MIT et notices de tiers pour ONNX Runtime, MIT pour Whisper. Empreintes SHA-256 des fichiers distribués dans `vendor/files.json`.

Les deux poids ONNX q8 publiés représentent **76 908 389 octets** : encodeur 23 200 850, décodeur fusionné 53 707 539. Les cinq fichiers de configuration et de tokenisation représentent **2 769 512 octets**. Le WASM représente **21 596 019 octets**, son module JavaScript 44 484 et Transformers.js 888 173. Soit environ **102,21 Mo** pour ces ressources principales au premier chargement, hors interface et exemple. Les tailles des poids et configurations proviennent de l'arbre de fichiers de la révision épinglée ; les tailles du moteur sont vérifiées sur disque. Compression et cache font varier les octets réellement transférés.

## Exemple audio

`assets/exemple-lafontaine.wav` : extrait du **Corbeau et le Renard**, Jean de La Fontaine (1621–1695), lu par **Ezwa** pour LibriVox. Lecture humaine publique d'un texte littéraire.

- [Notice officielle du livre](https://librivox.org/fables_la_fontaine_01), section 02.
- [Fichier original hébergé pour LibriVox](https://archive.org/download/fables_lafontaine_01_librivox/fables_01_02_lafontaine.mp3), [notice Internet Archive](https://archive.org/details/fables_lafontaine_01_librivox). La notice désigne le fichier comme « Domaine public. Enregistré par Ezwa. »
- [Déclaration de réutilisation de LibriVox](https://librivox.org/pages/public-domain/) : enregistrements donnés au domaine public, usage commercial et découpage permis. LibriVox précise que sa vérification du domaine public porte sur les États-Unis ; le texte français original choisi date du XVIIe siècle et son auteur est mort en 1695.
- Extrait des secondes **24,7 à 33,7**, converti en WAV PCM 16 bits mono 16 kHz, durée **9 secondes**. Aucun changement du contenu parlé. Fichier de 288 280 octets ; empreintes et source conservées dans [la fiche de l'exemple](assets/exemple-lafontaine-source.json).

Texte original de référence : « Maître Corbeau, sur un arbre perché, tenait en son bec un fromage. Maître Renard, par l'odeur alléché, lui tint à peu près ce langage. » La transcription est calculée ; cette référence n'est jamais injectée comme résultat.

## Mode hors ligne et limites

Le service worker ne contrôle que le sous-dossier `demo/`. L'interface est mise en cache après une première visite sur HTTPS (ou localhost). Les fichiers du modèle sont mis en cache pendant leur téléchargement autorisé. Le moteur WASM est mis en cache lors de sa première utilisation. Les données personnelles ne sont jamais ajoutées à ces caches par le code.

Le mode hors ligne dépend d'un chargement initial achevé et du maintien des caches par le navigateur. Safari, le mode privé, les restrictions de stockage ou un manque de place peuvent empêcher leur conservation. Aucun fonctionnement illimité, temps réel, résumé ou séparation des voix n'est promis. Un changement de page termine le calcul. Le coût mémoire en exécution est supérieur à la taille des fichiers téléchargés.

Les garde-fous sur tailles, durées, PCM et export ont été vérifiés sous Node avec le véritable extrait WAV LibriVox. Ces vérifications ne sont pas une mesure de qualité de reconnaissance. La validation sur des téléphones Android et iPhone physiques reste à faire. Un test dans un navigateur de bureau ou une vue étroite ne constitue pas un test sur téléphone.

L'édition manuelle et l'export `.txt` avec accents et retour à la ligne ont été vérifiés dans le navigateur intégré de Codex sur Mac. L'arrêt puis le rechargement libèrent le modèle et ne conservent pas l'audio ni le texte. Le modèle se recharge depuis le cache. Ces résultats de bureau ne valident pas les téléphones physiques. Le modèle retenu, Whisper base q8, a transcrit l'extrait public de 9 secondes en **2,7 secondes de calcul affichées**, hors chargement, sur ce Mac. Sortie réelle : « Maître Corbeau sur un arbre perché, tenait en son bac un fromage. Maître Renard, par l'odeur à l'éché, lui t'a un tapet près de ce langage. » **La précision est insuffisante sur ce cas** : plusieurs mots et la fin de la phrase sont incorrects. Cette démo gratuite fournit un brouillon à corriger, pas un compte rendu fiable.

Les variantes tiny et small ont été comparées sur exactement le même fichier, sans fournir le texte de référence au modèle. Small a aussi produit des erreurs, pour 9,3 secondes de calcul et environ 274 Mo de ressources. Base est conservé pour limiter le téléchargement de ce prototype ; ce choix ne prouve pas une précision suffisante ni une supériorité générale. Les comparaisons sont conservées dans les preuves locales de développement.

Relecture du chemin audio : le WAV public est PCM16 mono 16 kHz ; Web Audio décode le fichier, puis un contexte hors ligne produit explicitement un canal à 16 kHz. Le worker reçoit ces valeurs en Float32Array. La bibliothèque versionnée accepte « french » et le convertit en code « fr », avec la tâche « transcribe ». Le fichier de 9 secondes tient dans un seul passage de 25 secondes, sans chevauchement interne. Aucune erreur évidente de taux d'échantillonnage, de canal ou de langue n'a été identifiée par cette inspection ; il ne s'agit pas d'une preuve numérique exhaustive du décodage Web Audio sur tous les navigateurs.

## Hébergement

Servir `.wasm` avec `application/wasm`, `.mjs`/`.js` avec un type JavaScript, le manifeste avec `application/manifest+json` ou JSON, et HTTPS en production. La CSP de `demo/*`, y compris celle de `worker.js`, doit autoriser `script-src 'self' 'wasm-unsafe-eval'`, `worker-src 'self'`, `connect-src 'self' https://huggingface.co https://*.huggingface.co https://*.hf.co`, `media-src 'self' blob:`, `manifest-src 'self'` et les styles/images locaux. Aucun besoin de `unsafe-inline`, de `unsafe-eval` général, d'isolation interorigine ou de `SharedArrayBuffer` pour ce mode à un thread.
