Arquitectura — Android y Linux
speech-android proporciona procesamiento de voz en el dispositivo para Android y Linux embebido a través de un núcleo C++ compartido con frontends específicos por plataforma. Toda la inferencia se ejecuta localmente usando ONNX Runtime con proveedores de ejecución acelerados por hardware.
Stack multiplataforma
Android y Linux comparten el submódulo C++ speech-core, que orquesta el pipeline completo de voz. Cada plataforma proporciona un frontend ligero que delega en speech-core a través de interfaces basadas en vtables:
┌──────────────────────────────────────────────┐
│ Android: SpeechPipeline (Kotlin/JNI) │
│ Linux: speech.h (API C) │
└──────────────────┬───────────────────────────┘
│
┌──────────────────┴───────────────────────────┐
│ speech-core (submódulo C++) │
│ Detección de turnos · Interrupciones · Contexto │
└──┬────────┬────────┬────────┬────────────────┘
│ │ │ │ vtables
┌──┴──┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────────┐
│ VAD │ │ STT │ │ TTS │ │ Enhancer │
└──┬──┘ └──┬──┘ └──┬──┘ └─┬────────┘
└────────┴────────┴────────┘
ONNX Runtime (CPU / NNAPI / QNN)Rutas por plataforma
Android
El SDK de Kotlin (SpeechPipeline.kt) proporciona la API pública. Llama a través de JNI a jni_bridge.cpp, que registra callbacks de vtables con speech-core. ONNX Runtime se ejecuta con el execution provider NNAPI para aceleración por hardware en chipsets de Qualcomm, Samsung y Google.
Kotlin SDK → JNI bridge → speech-core → ONNX Runtime (NNAPI)Linux
La API C (speech.h) expone el mismo pipeline para targets de Linux embebido (automoción, Yocto). En plataformas automotrices de Qualcomm (SA8295P, SA8255P), ONNX Runtime usa el execution provider QNN para aceleración en Hexagon DSP.
API C → speech-core → ONNX Runtime (QNN)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. Las implementaciones de los modelos (VAD, STT, TTS, Enhancer) se conectan a través de interfaces C basadas en vtables, haciendo que la lógica del pipeline central sea agnóstica a la plataforma.
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 |
| Automoción | SA8295P / SA8255P | QNN → Hexagon DSP |
| Cualquiera | Fallback a CPU | XNNPACK |
Archivos C++ clave
| Archivo | Propósito |
|---|---|
jni_bridge.cpp | Conecta las implementaciones de modelos ONNX a la API C de speech-core mediante vtables |
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) |
linux/src/speech.cpp | Implementación de la API C de Linux |
linux/include/speech.h | Cabecera C pública de Linux |
Estructura del código fuente
speech-android/
speech-core/ Submódulo C++ (orquestación del pipeline)
sdk/src/main/
cpp/ Implementaciones de modelos ONNX Runtime, puente JNI, DSP de audio
kotlin/.../speech/ SDK público de Kotlin (SpeechPipeline, ModelManager)
sdk/src/androidTest/ Pruebas e2e instrumentadas (23 tests, 5 suites)
linux/
include/speech.h Cabecera C pública
src/speech.cpp Implementación de la API C de Linux
tests/ Suite de tests de Linux (11 tests)
app/ Aplicación de demostraciónCódigo fuente: github.com/soniqo/speech-android