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.
| Modelo | Tarea | Cuantización | Tamaño |
|---|---|---|---|
| Parakeet TDT v3 | STT (114 idiomas, vocabulario BPE de 8192) | INT8 | ~891 MB |
| Kokoro-82M | TTS | INT8 | ~330 MB |
| Pocket TTS 100M (opcional) | Texto a voz en streaming (inglés, voz Alba fija) | dynamic INT8 + FP32 | 120.3 MB |
| Silero VAD v5 | Detección de actividad vocal | float32 | ~2 MB |
| DeepFilterNet3 | Cancelación de ruido | FP16 | ~8 MB |
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:
| 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