- Le modèle PersonaPlex 7B, implémenté en Swift/MLX sur Apple Silicon, prend en charge des conversations vocales bidirectionnelles en temps réel
- Il unifie l’ancien pipeline vocal en 3 étapes ASR→LLM→TTS en un seul modèle, traitant directement l’entrée et la sortie audio sans conversion en texte
- Grâce à une quantification en 4 bits (quantization), la taille du modèle est passée de 16,7 Go à 5,3 Go, avec une vitesse de traitement de 68 ms/étape (RTF 0,87), donc plus rapide que le temps réel
- Il s’appuie sur le codec audio Mimi et l’architecture Depformer pour assurer un streaming efficace sans dégradation de la qualité vocale
- Il fonctionne nativement en Swift sans serveur et constitue une technologie de base importante pour le développement d’assistants vocaux et d’agents conversationnels
Intégration de qwen3-asr-swift et PersonaPlex 7B
- La bibliothèque qwen3-asr-swift intègre NVIDIA PersonaPlex 7B sur Apple Silicon pour prendre en charge les conversations vocales bidirectionnelles (full-duplex speech-to-speech)
- Elle traite l’audio d’entrée en temps réel tout en générant simultanément l’audio de réponse
- Elle s’étend en une bibliothèque de traitement vocal unifiée incluant ASR, TTS et synthèse multilingue
- Le modèle est proposé en version 4 bits de 5,3 Go sur Hugging Face :
aufklarer/PersonaPlex-7B-MLX-4bit
Unification du pipeline vocal traditionnel
- Les assistants vocaux classiques reposent sur une architecture en 3 étapes ASR → LLM → TTS, où chaque étape introduit de la latence et une perte d’émotion
- PersonaPlex unifie cela dans un modèle unique qui traite directement les audio tokens
- L’audio est converti en temps réel via 17 flux parallèles (12.5Hz)
- Basé sur l’architecture Moshi de Kyutai, il prend en charge 18 préréglages vocaux et des system prompts fondés sur des rôles
Architecture du modèle et conversion
- Le checkpoint PyTorch d’origine de 16,7 Go a été converti en safetensors optimisés pour MLX
- Le script de conversion (
convert_personaplex.py) automatise la classification des poids, la quantification 4 bits, l’extraction des préréglages et l’envoi sur Hugging Face
- Le Temporal Transformer (7B paramètres) et le Depformer ont tous deux été compressés en 4 bits
- Le Depformer utilise une structure de bascule de poids par étape (MultiLinear) pour passer de 2,4 Go à 650 Mo
- Cela permet une réduction de taille de 3,7× sans perte de qualité
Pipeline de traitement vocal
- Le Mimi Encoder/Decoder convertit l’audio 24 kHz en 16 tokens de codebook
- Le Temporal Transformer traite conjointement les flux audio utilisateur et agent
- Le Depformer génère les tokens audio de l’agent en 16 étapes
- Le Mimi Decoder les reconvertit ensuite en audio 24 kHz
- Des composants de modèles TTS existants, comme le codec Mimi, le cache KV, RoPE, SwiGLU et RMSNorm, sont réutilisés tels quels
System prompts et contrôle du dialogue
- PersonaPlex contrôle le style de conversation via des system prompts textuels
- Sans prompt, le modèle a tendance à s’éloigner du sujet ou à répondre de façon verbeuse
- Des préréglages comme assistant, customer service, teacher peuvent être sélectionnés via la CLI ou l’API
- Pour une même question, la qualité de réponse varie fortement selon la présence ou non d’un prompt
Performances et traitement en temps réel
- Sur un M2 Max (64 Go), il atteint 68 ms/étape, RTF 0,87, soit une vitesse supérieure au temps réel
- Il fonctionne de manière stable dans un budget de 80 ms par frame (12.5Hz)
- ASR, TTS et Speech-to-Speech peuvent être testés de manière unifiée dans une seule bibliothèque
- La validation E2E vérifie la cohérence thématique en reconvertissant l’audio de réponse en texte via l’ASR
Streaming et optimisations
- L’API
respondStream() génère en temps réel des chunks audio de 2 secondes
- Ils peuvent être lus immédiatement sous forme de AsyncThrowingStream<AudioChunk>
- Quatre optimisations principales :
- Intégration de
eval() pour réduire les synchronisations GPU
- Bulk audio extraction pour améliorer l’efficacité du décodage
- Prefill batching pour paralléliser les étapes initiales
- Compilation du temporal transformer pour optimiser plus de 450 appels de kernels Metal
- L’activation de la fusion de kernels est possible via l’option
--compile ou model.warmUp()
Exécution et déploiement
- Dépôt GitHub : ivan-digital/qwen3-asr-swift
- Après compilation avec
swift build -c release, il est possible d’exécuter ASR, TTS et Speech-to-Speech via des commandes CLI
- Au premier lancement, un téléchargement d’environ 5,3 Go du modèle est nécessaire
- Basé sur le framework MLX, il fonctionne intégralement dans un environnement Swift natif sans Python ni serveur
Portée technique
- Il démontre l’exécution on-device de modèles vocaux haute performance en exploitant la mémoire unifiée d’Apple Silicon et l’accélération Metal
- En mettant en œuvre une conversation vocale en temps réel fondée sur un modèle unique, il ouvre la voie à de nombreuses applications comme les assistants IA, centres d’appels et interfaces vocales éducatives
- Il est présenté comme une réussite d’intégration entre plusieurs écosystèmes open source : NVIDIA, Kyutai, Alibaba Qwen, FunAudioLLM et Apple MLX
1 commentaires
Commentaires sur Hacker News
J’ai vraiment beaucoup aimé ce projet. J’avais déjà essayé de faire tourner PersonaPlex sur un appareil Blackwell sans succès, donc cette fois je vais tenter sur Mac
Pour avoir pas mal travaillé sur des agents vocaux, il y a quelques points à garder en tête. Même un pipeline VAD→ASR→LLM→TTS donne une impression de temps réel si le RTT reste sous une seconde. Mon projet ova, ainsi que voice-agent et parakeet.cpp, peuvent servir d’exemples
Après avoir discuté avec la communauté PersonaPlex, il semble qu’une architecture full-duplex complète soit encore difficile, autant en précision qu’en performance, et délicate à entraîner. À l’inverse, une architecture ASR→LLM→TTS est modulaire, avec la flexibilité de mélanger librement petits et grands LLM, ainsi que des endpoints locaux ou basés sur API
L’architecture classique STT→LLM→TTS s’intègre bien avec les appels d’outils, la gestion avancée du contexte, le RAG, etc. Le fait de séparer l’agent qui parle directement à l’humain et les sous-agents internes fonctionne bien pour réduire la latence et la charge de contexte
Le full-duplex paraît plus dynamique, mais je ne vois pas encore clairement comment l’intégrer concrètement à un agent vocal. J’aimerais échanger là-dessus sur Discord
Comme qwen3-asr-swift regroupe ASR, TTS et PersonaPlex dans un seul package Swift, tous les composants nécessaires sont déjà là. PersonaPlex gère les backchannels à faible latence et la prise de tour de parole naturelle, tandis qu’un LLM séparé s’occupe des appels d’outils
Le problème, c’est l’orchestration entre les deux. On ne sait pas encore quand le « cerveau » doit écraser la « bouche », comment éviter que PersonaPlex n’énonce avec assurance des réponses non vérifiées, ou comment gérer les cas où le résultat d’un outil entre en conflit avec une énonciation en cours
Le projet est intéressant, mais personnellement j’aimerais qu’un modèle local 7B prenne en charge les appels d’outils. Dans sa forme actuelle, c’est surtout une proof of concept qui prend simplement des fichiers wav en entrée
Le style de rédaction LLM de l’article me semblait tellement artificiel que j’ai douté de la qualité du projet
J’ai essayé la démo sur un MacBook M1 Max, et il fallait plus de 10 secondes pour répondre, avec en plus des réponses à côté de la plaque
Bien sûr, ça peut rester utile pour certains usages spécifiques, mais j’aimerais en apprendre davantage sur ce point
Cette technologie semble assez dangereuse. Article connexe : article du Guardian
La meilleure démo full-duplex que j’aie vue à l’époque, c’était Sesame. Je me demande ce que c’est devenu aujourd’hui (lien)
Je suis fan de whisperKit. Avec l’ajout récent de la fonction TTS, c’est devenu bien meilleur. Il prend aussi en charge la diarisation des locuteurs et les dictionnaires personnalisés
Il y a même un test de charge où 4 modèles tournent en temps réel simultanément sur un seul appareil :
Vidéo du test
J’aimerais construire un système où mon téléphone redirige automatiquement les appels spam vers ce modèle, qui débiterait lentement de fausses infos personnelles en y mêlant des banalités sur la météo ou le sport
J’essaie de fine-tuner PersonaPlex pour des appels sortants. J’ai appliqué l’approche LoRA de Kyutai/moshi-finetune, mais il faut monter le facteur de scaling à 5 pour que ça fonctionne, et ça casse d’autres choses
GPT-5.3 Codex m’a signalé pendant la revue de code que les locuteurs A/B étaient inversés, donc je régénère actuellement le dataset.
Sur mon GitHub (runvnc), il y a des versions de moshi-finetune et personaplex, et une app Gradio permet de générer les données et de lancer l’entraînement. Je n’ai pas encore de résultats vraiment exploitables
J’utilise souvent MacWhisper, mais même si le modèle Whisper Large v3 Turbo est correct, la latence s’accumule. La post-traitance avec un LLM en ligne améliore la qualité, mais ralentit le tout
Lien du modèle, FluidAudio GitHub
La communauté Discord est active, et les discussions autour des fonctionnalités récentes comme VAD, TTS, EOU sont très animées