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.

Source

FluidInference/FluidAudio : Modèles audio CoreML de pointe dans vos applications — synthèse vocale, reconnaissance vocale, détection d'activité vocale et diarisation des locuteurs. En Swift, propulsé par l'open source de pointe.