Arquitectura — Android

speech-android es un SDK ligero de Kotlin + puente JNI sobre el motor C++ speech-core. Toda la inferencia ML y la orquestación del pipeline residen en speech-core; speech-android solo se encarga del empaquetado para Android. Linux / automoción (Yocto, Qualcomm SA8295P/SA8255P con QNN) se aloja directamente en speech-core/examples/linux.

Stack

Los wrappers de los modelos (Silero VAD, Parakeet STT, Kokoro TTS, DeepFilterNet3) implementan directamente las interfaces de speech-core (VADInterface, STTInterface, TTSInterface, EnhancerInterface), por lo que el puente JNI los construye y entrega referencias a speech_core::VoicePipeline sin ningún adaptador de vtable C.

┌──────────────────────────────────────────────┐
│     SpeechPipeline (API pública Kotlin)       │
│             ↓ JNI                            │
│     jni_bridge.cpp (~250 líneas)              │
└──────────────────┬───────────────────────────┘
                   │
┌──────────────────┴───────────────────────────┐
│       speech_core_models (submódulo git)      │
│   Silero / Parakeet / Kokoro / DeepFilter     │
│       speech_core                             │
│   Detección de turnos · Interrupciones · Contexto   │
└──┬────────┬────────┬────────┬────────────────┘
   │        │        │        │  impl. directa de interfaces
┌──┴──┐  ┌──┴──┐  ┌──┴──┐  ┌─┴────────┐
│ VAD │  │ STT │  │ TTS │  │ Enhancer │
└──┬──┘  └──┬──┘  └──┬──┘  └─┬────────┘
   └────────┴────────┴────────┘
       ONNX Runtime (CPU / NNAPI)

Pipeline

El pipeline de voz ejecuta tres etapas secuencialmente: VAD → STT → TTS. La detección de actividad vocal dispara la grabación, el STT transcribe el audio y el TTS genera la respuesta. El soporte de barge-in permite interrumpir la reproducción del TTS cuando el usuario empieza a hablar a mitad de respuesta.

speech-core gestiona la detección de turnos, el manejo de interrupciones y el contexto de la conversación. Los wrappers de los modelos implementan las interfaces de speech-core directamente — sin capa adaptadora de vtable C — lo que hace igualmente fácil enchufar backends no-ONNX (p. ej., las implementaciones CoreML / MLX en speech-swift) que cumplan con las mismas interfaces.

Modelos

Todos los modelos usan el formato ONNX con cuantización INT8 por defecto. Los modelos están alojados en HuggingFace bajo la organización aufklarer y se descargan automáticamente en el primer uso vía ModelManager.kt.

ModeloTareaCuantizaciónTamaño
Parakeet TDT v3STT (114 idiomas, vocabulario BPE de 8192)INT8~500 MB
Kokoro-82MTTSINT8~89 MB
Silero VAD v5Detección de actividad vocalfloat32~1.2 MB
DeepFilterNet3Cancelación de ruidoFP16~4.2 MB

La descarga total de los modelos es de aproximadamente 1.2 GB. Tras la descarga inicial, toda la inferencia se ejecuta totalmente offline.

Inferencia: OnnxEngine

El wrapper onnx_engine.h proporciona selección de execution providers (EP) con conocimiento de la plataforma. Prueba los EPs disponibles en tiempo de ejecución y hace fallback de forma elegante:

PlataformaChipsetAceleración
AndroidSnapdragon 8 Gen 1+NNAPI → NPU Hexagon
AndroidSamsung Exynos 2200+NNAPI → NPU Samsung
AndroidGoogle Tensor G2+NNAPI → TPU Google
Cualquier AndroidFallback a CPUXNNPACK

Para Qualcomm SA8295P / SA8255P de automoción con QNN (Hexagon DSP), consulta speech-core/examples/linux.

Archivos C++ clave

ArchivoPropósito
jni_bridge.cppConstruye los wrappers de modelos speech_core::* y entrega referencias a VoicePipeline
parakeet_stt.cppSTT con decoder greedy TDT y normalización mel por característica
kokoro_tts.cppTTS con modelo E2E y máscara de atención
kokoro_phonemizer.cppFonemizador basado en diccionario para la entrada del TTS
silero_vad.cppDetección de actividad vocal
deepfilter.cppCancelación de ruido con procesamiento STFT/ERB
onnx_engine.hWrapper de ONNX Runtime con conocimiento de la plataforma (NNAPI en Android, QNN en Linux, fallback a CPU)

Los wrappers de los modelos y onnx_engine.h se trasladaron a speech-core en la refactorización de extracción de modelos; consulta docs/models.md para el inventario completo.

Estructura del código fuente

speech-android/
  speech-core/              Motor C++ + wrappers de modelos ONNX (submódulo git)
  sdk/src/main/
    cpp/jni_bridge.cpp      Puente JNI ligero sobre speech_core::VoicePipeline
    cpp/CMakeLists.txt      Incluye speech-core vía add_subdirectory(SPEECH_CORE_WITH_ONNX=ON)
    kotlin/.../speech/      SDK público de Kotlin (SpeechPipeline, ModelManager)
  sdk/src/androidTest/      Pruebas e2e instrumentadas
  app/                      Aplicación de demostración

Linux / automoción (ABI C, demo ALSA, herramientas CLI) reside en:
  speech-core/examples/linux/

Código fuente: github.com/soniqo/speech-android