Architecture — Android
speech-android est un fin SDK Kotlin + pont JNI au-dessus du moteur C++ speech-core. Toute l'inférence ML et l'orchestration du pipeline résident dans speech-core ; speech-android ne gère que le packaging Android. Linux / automobile (Yocto, Qualcomm SA8295P/SA8255P avec QNN) est hébergé directement dans speech-core/examples/linux.
Pile
Les wrappers de modèles (Silero VAD, Parakeet STT, Kokoro TTS, DeepFilterNet3) implémentent directement les interfaces de speech-core (VADInterface, STTInterface, TTSInterface, EnhancerInterface), de sorte que le pont JNI les construit et passe les références à speech_core::VoicePipeline sans le boilerplate d'adaptateur de vtable C.
┌───────────────────────────────────────────────┐
│ SpeechPipeline (API publique Kotlin) │
│ ↓ JNI │
│ jni_bridge.cpp (~250 lignes) │
└──────────────────┬───────────────────────────┘
│
┌──────────────────┴───────────────────────────┐
│ speech_core_models (sous-module git) │
│ Silero / Parakeet / Kokoro / DeepFilter │
│ speech_core │
│ Détection de tour · Interruptions · Contexte│
└──┬────────┬────────┬────────┬────────────────┘
│ │ │ │ impl. directe des interfaces
┌──┴──┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────────┐
│ VAD │ │ STT │ │ TTS │ │ Enhancer │
└──┬──┘ └──┬──┘ └──┬──┘ └─┬────────┘
└────────┴────────┴────────┘
ONNX Runtime (CPU / NNAPI)Pipeline
Le pipeline vocal exécute trois étapes séquentiellement : VAD → STT → TTS. La détection d'activité vocale déclenche l'enregistrement, l'audio est transcrit par STT, et TTS génère la réponse. Le support du barge-in permet d'interrompre la lecture TTS lorsque l'utilisateur commence à parler au milieu d'une réponse.
speech-core gère la détection de tour, la gestion des interruptions et le contexte de conversation. Les wrappers de modèles implémentent directement les interfaces de speech-core — sans couche d'adaptateur de vtable C — rendant tout aussi facile de brancher des backends non-ONNX (par exemple les implémentations CoreML / MLX de speech-swift) conformes aux mêmes interfaces.
Modèles
Tous les modèles utilisent le format ONNX avec la quantification INT8 par défaut. Les modèles sont hébergés sur HuggingFace sous l'organisation aufklarer et se téléchargent automatiquement à la première utilisation via ModelManager.kt.
| Modèle | Tâche | Quantification | Taille |
|---|---|---|---|
| Parakeet TDT v3 | STT (114 langues, vocab BPE 8192) | INT8 | ~500 Mo |
| Kokoro-82M | TTS | INT8 | ~89 Mo |
| Silero VAD v5 | Détection d'activité vocale | float32 | ~1,2 Mo |
| DeepFilterNet3 | Suppression de bruit | FP16 | ~4,2 Mo |
Le téléchargement total des modèles est d'environ 1,2 Go. Après le téléchargement initial, toute l'inférence s'exécute entièrement hors ligne.
Inférence : OnnxEngine
Le wrapper onnx_engine.h fournit une sélection de fournisseur d'exécution (EP) sensible à la plateforme. Il sonde les EP disponibles à l'exécution et retombe gracieusement :
| Plateforme | Chipset | Accélération |
|---|---|---|
| Android | Snapdragon 8 Gen 1+ | NNAPI → NPU Hexagon |
| Android | Samsung Exynos 2200+ | NNAPI → NPU Samsung |
| Android | Google Tensor G2+ | NNAPI → TPU Google |
| Tout Android | Repli CPU | XNNPACK |
Pour Qualcomm automobile SA8295P / SA8255P avec QNN (DSP Hexagon), voir speech-core/examples/linux.
Fichiers C++ clés
| Fichier | Rôle |
|---|---|
jni_bridge.cpp | Construit les wrappers de modèles speech_core::* et passe les références à VoicePipeline |
parakeet_stt.cpp | STT avec décodeur glouton TDT et normalisation mel par caractéristique |
kokoro_tts.cpp | TTS avec modèle E2E et masque d'attention |
kokoro_phonemizer.cpp | Phonémiseur basé dictionnaire pour l'entrée TTS |
silero_vad.cpp | Détection d'activité vocale |
deepfilter.cpp | Suppression de bruit avec traitement STFT/ERB |
onnx_engine.h | Wrapper ONNX Runtime sensible à la plateforme (NNAPI sur Android, QNN sur Linux, repli CPU) |
Les wrappers de modèles et onnx_engine.h ont été déplacés dans speech-core lors du refactoring d'extraction de modèles ; voir docs/models.md pour l'inventaire complet.
Structure des sources
speech-android/
speech-core/ Moteur C++ + wrappers de modèles ONNX (sous-module git)
sdk/src/main/
cpp/jni_bridge.cpp Pont JNI fin au-dessus de speech_core::VoicePipeline
cpp/CMakeLists.txt Récupère speech-core via add_subdirectory(SPEECH_CORE_WITH_ONNX=ON)
kotlin/.../speech/ SDK public Kotlin (SpeechPipeline, ModelManager)
sdk/src/androidTest/ Tests e2e instrumentés
app/ Application de démonstration
Linux / automobile (ABI C, démo ALSA, outils CLI) réside dans :
speech-core/examples/linux/Code source : github.com/soniqo/speech-android