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.
| Modelo | Tarea | Cuantización | Tamaño |
|---|---|---|---|
| Parakeet TDT v3 | STT (114 idiomas, vocabulario BPE de 8192) | INT8 | ~500 MB |
| Kokoro-82M | TTS | INT8 | ~89 MB |
| Silero VAD v5 | Detección de actividad vocal | float32 | ~1.2 MB |
| DeepFilterNet3 | Cancelación de ruido | FP16 | ~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:
| Plataforma | Chipset | Aceleración |
|---|---|---|
| Android | Snapdragon 8 Gen 1+ | NNAPI → NPU Hexagon |
| Android | Samsung Exynos 2200+ | NNAPI → NPU Samsung |
| Android | Google Tensor G2+ | NNAPI → TPU Google |
| Cualquier Android | Fallback a CPU | XNNPACK |
Para Qualcomm SA8295P / SA8255P de automoción con QNN (Hexagon DSP), consulta speech-core/examples/linux.
Archivos C++ clave
| Archivo | Propósito |
|---|---|
jni_bridge.cpp | Construye los wrappers de modelos speech_core::* y entrega referencias a VoicePipeline |
parakeet_stt.cpp | STT con decoder greedy TDT y normalización mel por característica |
kokoro_tts.cpp | TTS con modelo E2E y máscara de atención |
kokoro_phonemizer.cpp | Fonemizador basado en diccionario para la entrada del TTS |
silero_vad.cpp | Detección de actividad vocal |
deepfilter.cpp | Cancelación de ruido con procesamiento STFT/ERB |
onnx_engine.h | Wrapper 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