Présentation
Hugging Face a publié deux paquets Swift, AnySpeechRecognizer et AnyDecisionModel, qui s’appuient sur l’API SpeechAnalyzer introduite dans macOS 26 et iOS 26. Le premier conserve l’interface native d’Apple tout en autorisant le choix d’un moteur de reconnaissance, parmi les modèles Parakeet de NVIDIA et Qwen3‑ASR d’Alibaba. Le second répond à des questions fermées (oui/non, choix multiples, échelles) en renvoyant des probabilités plutôt qu’un texte généré, grâce à des modèles exécutés localement via MLX, Core AI, llama.cpp ou des serveurs Ollama/Jev.
Fonctionnement et architecture
AnySpeechRecognizer reproduit les classes SpeechAnalyzer, SpeechTranscriber, SpeechDetector et AssetInventory d’Apple. En remplaçant simplement import Speech par import AnySpeechRecognizer, le même code fonctionne avec un moteur tiers. Exemple d’instanciation du transcripteur Parakeet v3 :
let transcriber = SpeechTranscriber(
model: ParakeetSpeechModel(variant: .v3),
transcriptionOptions: [],
reportingOptions: [.volatileResults],
attributeOptions: [.audioTimeRange]
)Parakeet v3 (0.6 B paramètres) détecte automatiquement 25 langues européennes. Une version « Ultra » post‑entraînée améliore la précision, tandis que « Unified » ne supporte que l’anglais. Qwen3‑ASR propose des variantes 0.6 B et 1.7 B, couvrant 30 langues et 22 dialectes chinois, mais ne fournit que le résultat final d’un segment de 40 s, sans résultats volatils ni timing des mots.
Le module de diarisation ajoute SpeakerDiarizer, qui exécute le modèle Sortformer (v2 ou v2.1) en parallèle du transcripteur. Le code suivant montre l’installation conjointe :
let diarizer = SpeakerDiarizer(model: SortformerDiarizationModel())
if let request = try await AssetInventory.assetInstallationRequest(
supporting: [transcriber, diarizer]
) {
try await request.downloadAndInstall()
}
let analyzer = SpeechAnalyzer(modules: [transcriber, diarizer])AnyDecisionModel expose une API similaire : on crée un DecisionModel qui renvoie un DecisionResult contenant la réponse typée et la probabilité associée.
Performances et limites
Les mesures ont été réalisées sur un Mac Studio M4 Max (macOS 27.0.1). Parakeet transcrit une heure d’audio en 20‑40 s depuis un fichier, ou 1,5‑2,5 min en temps réel, avec environ 100 Mo de RAM après compilation Core ML. Qwen3‑ASR est nettement plus lent et nécessite plusieurs gigaoctets de mémoire, ce qui le rend plus adapté aux fichiers qu’à l’entrée en direct. Sur le jeu de données LibriSpeech (3‑8 min), les taux d’erreur de mots (WER) dépassent 23 % pour tous les moteurs lorsqu’ils sont testés sur des enregistrements AMI contenant des chevauchements de locuteurs.
Les tailles de téléchargement sont également importantes : ~600 Mo pour chaque modèle Parakeet, plus 590 Mo pour l’encodeur live, 0,9‑2,4 Go pour Qwen3‑ASR, et ~250 Mo pour Sortformer. Les modèles sont stockés dans le cache Hugging Face, partagé entre les applications macOS et les outils Python.
Les évaluations proviennent d’un seul matériel et de jeux de données limités ; les développeurs sont encouragés à reproduire les tests avec leurs propres configurations. Aucun résultat n’a encore été publié sur iPhone, ce qui constitue une incertitude pour les applications mobiles.
Perspectives d’usage
En conservant l’API native, ces paquets permettent une migration progressive vers des modèles plus performants ou spécialisés sans refactorisation majeure du code. La diarisation intégrée ouvre la voie à des applications d’analyse de réunions ou de centres d’appels où l’attribution des paroles est cruciale. AnyDecisionModel, en renvoyant des probabilités, facilite l’intégration de décisions automatisées dans des flux de travail où la confiance du modèle doit être évaluée. Toutefois, les exigences de stockage et de mémoire, ainsi que les WER élevés sur des conversations complexes, imposent une validation rigoureuse avant le déploiement en production.