Empezar — Android
speech-android proporciona procesamiento de voz en el dispositivo para Android usando ONNX Runtime. El pipeline ejecuta VAD + STT + TTS con soporte de barge-in, totalmente offline tras la descarga del modelo.
Requisitos
- Android 8+ (API 26)
- Arquitectura arm64-v8a
Descarga la aplicación de demostración preconstruida para probarla inmediatamente:
Dependencia de Gradle
Añade el SDK a tu build.gradle.kts:
implementation("audio.soniqo:speech:0.0.20")
Inicio rápido
val modelDir = ModelManager.ensureModels(context)
val pipeline = SpeechPipeline(SpeechConfig(modelDir = modelDir))
pipeline.events.collect { event ->
when (event) {
is SpeechEvent.TranscriptionCompleted -> println(event.text)
is SpeechEvent.ResponseDone -> pipeline.resumeListening()
else -> {}
}
}
pipeline.start()
pipeline.pushAudio(samples) // 16kHz mono float32
Los modelos predeterminados se descargan automáticamente desde HuggingFace en el primer uso (~500 MB en total). Tras la descarga inicial, toda la inferencia se ejecuta totalmente offline.
Detección de fin de turno
Activa Smart Turn v3.2 para tratar una pausa del VAD como una decisión, no como un final inmediato. Tras cada pausa confirmada, evalúa una vez los últimos ocho segundos del turno actual; una puntuación inferior al umbral mantiene abierto el mismo turno, mientras que el límite máximo de silencio garantiza que finalmente termine.
val modelDir = ModelManager.ensureModels(context, enableSmartTurn = true)
val pipeline = SpeechPipeline(
SpeechConfig(
modelDir = modelDir,
enableSmartTurn = true,
turnCompletionThreshold = 0.5f,
turnCompletionMaxSilenceSec = 2.0f,
)
)
Esta función opcional añade un único modelo int8 fijado de 11.1 MB; la inferencia sigue siendo totalmente offline. Smart Turn fue creado por Pipecat/Daily y se distribuye bajo BSD-2-Clause.
Entrada de voz del sistema (RecognitionService)
El SDK incluye un SpeechRecognitionService listo para usar que se conecta a la API SpeechRecognizer del framework de Android — sin código que escribir. Una vez que tu app está seleccionada como reconocedor de voz predeterminado, cualquier app de terceros que llame a SpeechRecognizer.createSpeechRecognizer(context) (sin ComponentName) obtiene STT completamente en el dispositivo a través de tu pipeline.
1. Declara RECORD_AUDIO y el servicio en AndroidManifest.xml:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application>
<service
android:name="audio.soniqo.speech.service.SpeechRecognitionService"
android:exported="true"
android:permission="android.permission.RECORD_AUDIO">
<intent-filter>
<action android:name="android.speech.RecognitionService" />
</intent-filter>
<meta-data
android:name="android.speech"
android:resource="@xml/recognition_service" />
</service>
</application>
2. Añade app/src/main/res/xml/recognition_service.xml:
<?xml version="1.0" encoding="utf-8"?>
<recognition-service xmlns:android="http://schemas.android.com/apk/res/android" />
3. Configura el servicio como predeterminado del sistema (Ajustes → Sistema → Idiomas e introducción → Selector de entrada de voz en Android puro, o vía adb):
adb shell settings put secure voice_recognition_service \
your.package/audio.soniqo.speech.service.SpeechRecognitionService
4. Verifica ejecutando la pantalla Recognizer test de la app demo, que llama a SpeechRecognizer.createSpeechRecognizer(ctx) (sin componente) y registra cada callback del framework — útil para confirmar el round-trip del binder sin necesitar logcat.
El servicio implementa onCheckRecognitionSupport (API 33+) devolviendo los 27 idiomas BCP-47 que cubre Parakeet TDT v3, marcados como installedOnDeviceLanguage cuando los modelos están presentes (o pendingOnDeviceLanguage mientras se descargan). Se adquiere foco de audio con AUDIOFOCUS_GAIN_TRANSIENT durante la sesión.
Gboard, Samsung Keyboard y Google Assistant incluyen sus propios reconocedores y se saltan el predeterminado del sistema. Las apps que llaman explícitamente a la API SpeechRecognizer del framework (o construyen su propia UI sobre ella) son las que pasan por tu servicio.
Modelos
Todos los modelos se ejecutan vía ONNX Runtime con aceleración NNAPI. Cuantizados en INT8 por defecto.
| Modelo | Tarea | Tamaño |
|---|---|---|
| Parakeet TDT v3 (INT8) | Voz a texto (114 idiomas) | 891 MB |
| Kokoro-82M (INT8) | Texto a voz (8 idiomas) | 330 MB |
| Silero VAD v5 | Detección de actividad vocal | 2 MB |
| DeepFilterNet3 | Cancelación de ruido | 8 MB |
Código fuente: github.com/soniqo/speech-android
Próximos pasos
- Benchmarks — rendimiento de inferencia en Android
- API C de Linux — configuración de Linux embebido