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èleTâcheQuantificationTaille
Parakeet TDT v3STT (114 langues, vocab BPE 8192)INT8~500 Mo
Kokoro-82MTTSINT8~89 Mo
Silero VAD v5Détection d'activité vocalefloat32~1,2 Mo
DeepFilterNet3Suppression de bruitFP16~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 :

PlateformeChipsetAccélération
AndroidSnapdragon 8 Gen 1+NNAPI → NPU Hexagon
AndroidSamsung Exynos 2200+NNAPI → NPU Samsung
AndroidGoogle Tensor G2+NNAPI → TPU Google
Tout AndroidRepli CPUXNNPACK

Pour Qualcomm automobile SA8295P / SA8255P avec QNN (DSP Hexagon), voir speech-core/examples/linux.

Fichiers C++ clés

FichierRôle
jni_bridge.cppConstruit les wrappers de modèles speech_core::* et passe les références à VoicePipeline
parakeet_stt.cppSTT avec décodeur glouton TDT et normalisation mel par caractéristique
kokoro_tts.cppTTS avec modèle E2E et masque d'attention
kokoro_phonemizer.cppPhonémiseur basé dictionnaire pour l'entrée TTS
silero_vad.cppDétection d'activité vocale
deepfilter.cppSuppression de bruit avec traitement STFT/ERB
onnx_engine.hWrapper 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