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.
| Modell | Aufgabe | Quantisierung | Größe |
|---|---|---|---|
| Parakeet TDT v3 | STT (114 Sprachen, 8192 BPE-Vokabular) | INT8 | ~500 MB |
| Kokoro-82M | TTS | INT8 | ~89 MB |
| Silero VAD v5 | Sprachaktivitätserkennung | float32 | ~1,2 MB |
| DeepFilterNet3 | Rauschunterdrückung | FP16 | ~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:
| Plattform | Chipsatz | Beschleunigung |
|---|---|---|
| Android | Snapdragon 8 Gen 1+ | NNAPI → Hexagon NPU |
| Android | Samsung Exynos 2200+ | NNAPI → Samsung NPU |
| Android | Google Tensor G2+ | NNAPI → Google TPU |
| Beliebiges Android | CPU-Fallback | XNNPACK |
Für Automotive Qualcomm SA8295P / SA8255P mit QNN (Hexagon DSP) siehe speech-core/examples/linux.
Wichtige C++-Dateien
| Datei | Zweck |
|---|---|
jni_bridge.cpp | Konstruiert speech_core::*-Modell-Wrapper und übergibt Referenzen an VoicePipeline |
parakeet_stt.cpp | STT mit TDT-Greedy-Decoder und Per-Feature-Mel-Normalisierung |
kokoro_tts.cpp | TTS mit E2E-Modell und Attention-Maske |
kokoro_phonemizer.cpp | Wörterbuchbasierter Phonemizer für TTS-Eingabe |
silero_vad.cpp | Sprachaktivitätserkennung |
deepfilter.cpp | Rauschunterdrückung mit STFT/ERB-Verarbeitung |
onnx_engine.h | Plattformbewusster 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