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 soniqo 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~891 MB
Kokoro-82MTTSINT8~330 MB
Pocket TTS 100M (opcional)Texto a voz en streaming (inglés, voz Alba fija)dynamic INT8 + FP32120.3 MB
Silero VAD v5Detección de actividad vocalfloat32~2 MB
DeepFilterNet3Cancelación de ruidoFP16~8 MB
Pocket TTS

Pocket TTS es un backend ONNX opcional de speech-core. No forma parte de la descarga predeterminada ni de la selección JNI actual de speech-android; la conexión con el SDK Kotlin queda como trabajo posterior.

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