Architektur — Android

speech-android ist ein dünnes Kotlin-SDK + JNI-Bridge über die speech-core-C++-Engine. Die gesamte ML-Inferenz und Pipeline-Orchestrierung liegt in speech-core; speech-android übernimmt lediglich das Android-Packaging. Linux / Automotive (Yocto, Qualcomm SA8295P/SA8255P mit QNN) ist direkt in speech-core/examples/linux beheimatet.

Stack

Die Modell-Wrapper (Silero VAD, Parakeet STT, Kokoro TTS, DeepFilterNet3) implementieren direkt die speech-core-Schnittstellen (VADInterface, STTInterface, TTSInterface, EnhancerInterface), sodass die JNI-Bridge sie konstruiert und Referenzen an speech_core::VoicePipeline übergibt — ohne Boilerplate für C-vtable-Adapter.

┌───────────────────────────────────────────────┐
│     SpeechPipeline (öffentliche Kotlin-API)  │
│             ↓ JNI                            │
│     jni_bridge.cpp (~250 Zeilen)             │
└──────────────────┬───────────────────────────┘
                   │
┌──────────────────┴───────────────────────────┐
│       speech_core_models (Git-Submodul)       │
│   Silero / Parakeet / Kokoro / DeepFilter     │
│       speech_core                             │
│   Turn-Erkennung · Unterbrechungen · Kontext  │
└──┬────────┬────────┬────────┬────────────────┘
   │        │        │        │  direkte Schnittstellen-Impl.
┌──┴──┐  ┌──┴──┐  ┌──┴──┐  ┌─┴────────┐
│ VAD │  │ STT │  │ TTS │  │ Enhancer │
└──┬──┘  └──┬──┘  └──┬──┘  └─┬────────┘
   └────────┴────────┴────────┘
       ONNX Runtime (CPU / NNAPI)

Pipeline

Die Sprach-Pipeline durchläuft drei Stufen sequenziell: VAD → STT → TTS. Die Sprachaktivitätserkennung löst die Aufnahme aus, das Audio wird vom STT transkribiert und das TTS erzeugt die Antwort. Barge-in-Unterstützung ermöglicht es, die TTS-Wiedergabe zu unterbrechen, wenn der Benutzer mitten in der Antwort zu sprechen beginnt.

speech-core verwaltet Turn-Erkennung, Unterbrechungsbehandlung und Konversationskontext. Die Modell-Wrapper implementieren die speech-core-Schnittstellen direkt — ohne C-vtable-Adapterschicht —, wodurch es genauso einfach ist, Nicht-ONNX-Backends einzubinden (z. B. die CoreML- / MLX-Implementierungen in speech-swift), die dieselben Schnittstellen erfüllen.

Modelle

Alle Modelle verwenden das ONNX-Format mit INT8-Quantisierung als Standard. Die Modelle werden auf HuggingFace unter der Organisation aufklarer gehostet und automatisch beim ersten Gebrauch über ModelManager.kt heruntergeladen.

ModellAufgabeQuantisierungGröße
Parakeet TDT v3STT (114 Sprachen, 8192 BPE-Vokabular)INT8~500 MB
Kokoro-82MTTSINT8~89 MB
Silero VAD v5Sprachaktivitätserkennungfloat32~1,2 MB
DeepFilterNet3RauschunterdrückungFP16~4,2 MB

Der gesamte Modell-Download beträgt etwa 1,2 GB. Nach dem ersten Download läuft die gesamte Inferenz vollständig offline.

Inferenz: OnnxEngine

Der Wrapper onnx_engine.h bietet plattformbewusste Auswahl des Execution Providers (EP). Er prüft verfügbare EPs zur Laufzeit und greift bei Bedarf elegant auf Alternativen zurück:

PlattformChipsatzBeschleunigung
AndroidSnapdragon 8 Gen 1+NNAPI → Hexagon NPU
AndroidSamsung Exynos 2200+NNAPI → Samsung NPU
AndroidGoogle Tensor G2+NNAPI → Google TPU
Beliebiges AndroidCPU-FallbackXNNPACK

Für Automotive Qualcomm SA8295P / SA8255P mit QNN (Hexagon DSP) siehe speech-core/examples/linux.

Wichtige C++-Dateien

DateiZweck
jni_bridge.cppKonstruiert speech_core::*-Modell-Wrapper und übergibt Referenzen an VoicePipeline
parakeet_stt.cppSTT mit TDT-Greedy-Decoder und Per-Feature-Mel-Normalisierung
kokoro_tts.cppTTS mit E2E-Modell und Attention-Maske
kokoro_phonemizer.cppWörterbuchbasierter Phonemizer für TTS-Eingabe
silero_vad.cppSprachaktivitätserkennung
deepfilter.cppRauschunterdrückung mit STFT/ERB-Verarbeitung
onnx_engine.hPlattformbewusster ONNX-Runtime-Wrapper (NNAPI auf Android, QNN auf Linux, CPU-Fallback)

Die Modell-Wrapper und onnx_engine.h sind im Rahmen des Modell-Extraktions-Refactorings nach speech-core gewandert; die vollständige Übersicht findet sich in docs/models.md.

Quellstruktur

speech-android/
  speech-core/              C++-Engine + ONNX-Modell-Wrapper (Git-Submodul)
  sdk/src/main/
    cpp/jni_bridge.cpp      Dünne JNI-Bridge über speech_core::VoicePipeline
    cpp/CMakeLists.txt      Bindet speech-core via add_subdirectory(SPEECH_CORE_WITH_ONNX=ON) ein
    kotlin/.../speech/      Öffentliches Kotlin-SDK (SpeechPipeline, ModelManager)
  sdk/src/androidTest/      Instrumentierte E2E-Tests
  app/                      Demo-Anwendung

Linux / Automotive (C-ABI, ALSA-Demo, CLI-Tools) liegt unter:
  speech-core/examples/linux/

Quellcode: github.com/soniqo/speech-android