FluidAudio : Exécutez les modèles audio IA de pointe localement sur les appareils Apple avec CoreML
FluidAudio est un SDK Swift permettant d'exécuter des modèles de pointe de reconnaissance vocale, synthèse vocale, diarisation des locuteurs et détection d'activité vocale entièrement sur l'appareil grâce au Neural Engine d'Apple. Cet article explore ses capacités, son architecture et comment l'intégrer dans vos applications.
Pourquoi FluidAudio est important pour les développeurs Apple
Pendant des années, intégrer l'audio IA avancé dans les applications Apple signifiait soit envoyer des données audio à une API cloud (avec toutes les implications de latence, confidentialité et coût), soit lutter pour exécuter des modèles PyTorch volumineux sur l'appareil avec de mauvaises performances. FluidAudio change cela en fournissant un SDK Swift soigné qui décharge l'inférence vers le Neural Engine Apple (ANE), offrant une IA audio rapide, économe en énergie et entièrement locale.
Le SDK regroupe des modèles open-source de pointe (sous licence MIT/Apache 2.0) pour :
- Reconnaissance automatique de la parole (ASR) — transcription par lots et en continu
- Synthèse vocale (TTS) — synthèse parallèle et en continu avec clonage vocal
- Diarisation des locuteurs — identifier "qui a parlé quand" dans les conversations
- Détection d'activité vocale (VAD) — détection des segments de parole dans l'audio
Tous les modèles sont pré-convertis en CoreML et optimisés pour l'ANE, ce qui signifie qu'ils utilisent un minimum de CPU et évitent complètement le GPU/MPS. Cela rend FluidAudio idéal pour le traitement en arrière-plan, l'informatique ambiante et les charges de travail toujours actives.
Pour commencer : Installation
FluidAudio s'intègre via Swift Package Manager. Ajoutez-le à votre Package.swift :
dependencies: [
.package(url: "https://github.com/FluidInference/FluidAudio.git", from: "0.12.4"),
],
Ajoutez ensuite le produit à votre cible :
.product(name: "FluidAudio", package: "FluidAudio")
Dans Xcode, utilisez Fichier → Ajouter des packages et collez l'URL du dépôt. CocoaPods est également pris en charge via pod 'FluidAudio', '~> 0.12.4', bien que les mainteneurs recommandent cocoapods-spm pour une meilleure intégration.
Capacités principales en détail
1. Reconnaissance automatique de la parole (ASR)
L'ASR de FluidAudio est propulsé par les modèles Parakeet TDT de NVIDIA, convertis en CoreML. Deux versions sont disponibles :
- v3 : Multilingue, prenant en charge 25 langues européennes plus le japonais
- v2 : Anglais uniquement, optimisé pour le meilleur rappel
Performances : Sur un M4 Pro, la transcription par lots atteint un facteur temps réel d'environ 190x — ce qui signifie qu'une heure d'audio est traitée en environ 19 secondes. Le streaming est pris en charge via SlidingWindowAsrManager pour les cas d'utilisation en temps réel.
Démarrage rapide — Transcription par lots :
import FluidAudio
Task {
let models = try await AsrModels.downloadAndLoad(version: .v3)
let asrManager = AsrManager(config: .default)
try await asrManager.loadModels(models)
// `samples` est [Float] à 16kHz
let result = try await asrManager.transcribe(samples)
print("Transcription : \(result.text)")
}
Équivalent en ligne de commande :
swift run fluidaudiocli transcribe audio.wav
swift run fluidaudiocli transcribe audio.wav --model-version v2 # Anglais uniquement
2. Diarisation des locuteurs
FluidAudio propose trois pipelines de diarisation, chacun avec des compromis différents :
Pipeline hors ligne (Pyannote Community-1)
Idéal pour le post-traitement des réunions enregistrées. Utilise la segmentation par ensemble de puissance + embeddings WeSpeaker + clustering VBx. Offre une haute précision mais n'est pas adapté à une utilisation en temps réel.
let config = OfflineDiarizerConfig()
let manager = OfflineDiarizerManager(config: config)
try await manager.prepareModels()
let samples = try AudioConverter().resampleAudioFile(path: "meeting.wav")
let result = try await manager.process(audio: samples)
for segment in result.segments {
print("\(segment.speakerId) \(segment.startTimeSeconds)s → \(segment.endTimeSeconds)s")
}
LS-EEND (Streaming)
Diarisation neuronale de bout en bout avec CoreML. Prend en charge jusqu'à 10 locuteurs, mises à jour de trames de 100 ms avec un aperçu provisoire de 900 ms. C'est le choix par défaut recommandé pour la diarisation en ligne.
Sortformer (Streaming)
Le modèle Sortformer de NVIDIA, offrant une meilleure stabilité de l'identité du locuteur que LS-EEND mais limité à 4 locuteurs. Sous licence NVIDIA Open Model License.
Quand utiliser lequel :
- LS-EEND : Par défaut pour la diarisation en direct — capacité élevée de locuteurs, bons benchmarks
- Sortformer : Lorsque la stabilité de l'identité est plus importante que le nombre de locuteurs
- Pipeline Pyannote : Lorsque vous avez besoin d'un contrôle modulaire sur les étapes de segmentation et de clustering
3. Détection d'activité vocale (VAD)
Propulsé par Silero VAD, le détecteur de FluidAudio fournit à la fois une segmentation hors ligne et des API de streaming. Le mode hors ligne renvoie des probabilités au niveau des chunks tous les 256 ms :
let results = try await manager.process(samples)
for (index, chunk) in results.enumerated() {
print(String(format: "Chunk %02d : prob=%.3f", index, chunk.probability))
}
Pour une intégration de plus haut niveau, utilisez segmentSpeech avec des durées minimales de parole/silence configurables :
var segmentation = VadSegmentationConfig.default
segmentation.minSpeechDuration = 0.25
segmentation.minSilenceDuration = 0.4
let segments = try await manager.segmentSpeech(samples, config: segmentation)
4. Synthèse vocale (TTS)
FluidAudio propose deux moteurs TTS :
| Fonctionnalité | PocketTTS | Kokoro |
|---|---|---|
| Génération | Autoregressive trame par trame (80 ms) | Parallèle (toutes les trames à la fois) |
| Streaming | Oui | Non |
| Clonage vocal | Oui (échantillon de 1 à 30 s) | Non |
| Contrôle de la prononciation | Non | Oui (SSML, lexique personnalisé) |
| Langues | EN, DE, ES, FR, IT, PT | EN, ES, FR, HI, JA, PT, ZH, IT |
Exemple PocketTTS :
let manager = PocketTtsManager(language: .spanish)
try await manager.initialize()
let audioData = try await manager.synthesize(text: "Hola, mundo.")
try audioData.write(to: URL(fileURLWithPath: "out.wav"))
Exemple Kokoro (optimisé ANE) :
let manager = KokoroAneManager()
try await manager.initialize()
let samples = try await manager.synthesize(text: "Bonjour de FluidAudio.")
// `samples` est du PCM Float32 mono 24 kHz
Configuration pour les déploiements d'entreprise
FluidAudio gère les téléchargements de modèles depuis HuggingFace automatiquement, mais les environnements d'entreprise ont souvent besoin de personnalisation :
Registre de modèles personnalisé
Si vous avez un miroir local ou un environnement isolé :
ModelRegistry.baseURL = "https://votre-miroir.example.com"
Configuration du proxy
Pour les pare-feux d'entreprise :
export https_proxy=http://proxy.company.com:8080
swift run fluidaudiocli transcribe audio.wav
Mode hors ligne uniquement
Pour les applications sensibles à la vie privée qui livrent des modèles intégrés :
ModelHub.offlineMode = true
let asr = try await AsrModels.load(from: bundledModelURL, configuration: config)
Lorsque le mode hors ligne est activé, toute tentative de téléchargement réseau lève DownloadError.networkDisabled au lieu de tenter un téléchargement.
Impact dans le monde réel : La vitrine
L'écosystème FluidAudio a connu une croissance rapide, avec des dizaines d'applications utilisant le SDK. Parmi les exemples notables :
- Voice Ink : IA locale pour une transcription instantanée et privée
- Spokenly : Dictée Mac avec transcription en temps réel et fichier
- Slipbox : Assistant de réunion axé sur la confidentialité
- Talat : Application de notes de réunion IA (présentée dans TechCrunch)
- BoltAI : Création de contenu utilisant les modèles Parakeet
- Hedy : Coach de réunion en temps réel, entièrement sur l'appareil, sur iOS, macOS, Android et Windows
Ces applications démontrent l'étendue des cas d'utilisation que FluidAudio permet — de la simple dictée à l'analyse complexe de réunions multi-locuteurs.
Pourquoi le Neural Engine Apple est important
La décision de FluidAudio de cibler l'ANE plutôt que le GPU/MPS est délibérée. L'ANE offre :
- Une consommation d'énergie plus faible : Idéal pour les charges de travail toujours actives et en arrière-plan
- Un matériel dédié : Ne concurrence pas le GPU pour les tâches graphiques ou de calcul
- Des performances cohérentes : Des temps d'inférence prévisibles sur toutes les générations d'appareils
Cela rend FluidAudio particulièrement adapté pour :
- La transcription de réunions en arrière-plan
- Les interfaces vocales sur des appareils alimentés par batterie
- Les fonctionnalités de sous-titrage en temps réel et d'accessibilité
Conclusion
FluidAudio représente une avancée significative pour l'IA audio sur appareil sur les plateformes Apple. En combinant des modèles de pointe avec une inférence CoreML optimisée pour l'ANE, il offre des performances auparavant uniquement réalisables avec des API cloud — tout en gardant les données privées et locales.
Que vous construisiez une application de dictée, un assistant de réunion ou une interface vocale, FluidAudio fournit les éléments de base avec un minimum de code. La conception modulaire du SDK, sa documentation complète et sa communauté active le rendent accessible aussi bien aux développeurs indépendants qu'aux équipes d'entreprise.
Commencez dès aujourd'hui : Clonez le dépôt GitHub, consultez la documentation et rejoignez la communauté Discord pour obtenir du support et des mises à jour.