📖 Языки: English · 中文 · 日本語 · 한국어 · Español · Deutsch · Français · हिन्दी · Português · Русский
Локальный речевой SDK для Android, основанный на ONNX Runtime и speech-core.
Распознавание речи (114 языков), синтез речи (8 языков), определение голосовой активности и шумоподавление — всё работает локально. Никаких облачных API, никакие данные не покидают устройство.
Демо APK · Модели · speech-swift (аналог для Apple) · speech-core (движок конвейера + сборка для Linux/встраиваемых систем)
Этот репозиторий — Android-обёртка: Kotlin SDK, JNI-мост, демо-приложение. C++-движок и обёртки ONNX-моделей (Silero VAD, Parakeet STT, Kokoro TTS, DeepFilterNet3) находятся в speech-core и подключаются через git-submodule. Linux / автомобильные системы (Yocto, Qualcomm SA8295P/SA8255P) — в speech-core/examples/linux.
| Модель | Задача | Размер INT8 | Языки |
|---|---|---|---|
| Parakeet TDT v3 | Распознавание речи | 891 МБ | 114 |
| Kokoro 82M | Синтез речи | 330 МБ | 8 (en, fr, es, it, pt, hi, ja, zh) |
| Silero VAD v5 | Определение голосовой активности | 2 МБ | Любой |
| DeepFilterNet3 | Шумоподавление | ~8 МБ | Любой |
Модели загружаются автоматически при первом запуске через ModelManager.ensureModels().
Скачайте подписанный APK и установите на любое arm64-устройство Android (8+). Модели (~1,2 ГБ) загружаются автоматически при первом запуске.
dependencies {
implementation("audio.soniqo:speech:0.0.9")
}val modelDir = ModelManager.ensureModels(context)
val pipeline = SpeechPipeline(
SpeechConfig(modelDir = modelDir, useNnapi = true)
)
pipeline.events.collect { event ->
when (event) {
is SpeechEvent.TranscriptionCompleted -> println(event.text)
is SpeechEvent.ResponseDone -> pipeline.resumeListening()
else -> {}
}
}
pipeline.start()
// Подавайте 16 кГц моно float32 PCM с микрофона
pipeline.pushAudio(samples)git clone --recursive https://github.com/soniqo/speech-android.git
cd speech-android
./setup.sh
./gradlew :app:assembleDebug
./gradlew :sdk:connectedAndroidTest # 34 e2e-теста./setup.sh инициализирует submodule speech-core и загружает ONNX Runtime
в ./ort/.
Модуль app/ — минимальное демо голосового ассистента, включающее:
- Визуализацию формы волны VAD в реальном времени
- Эхо-режим: транскрибирует речь и синтезирует её обратно (без LLM)
- Режим диктовки: потоковые частичные результаты
- Тестовый экран
SpeechRecognizer— задействует системный путь голосового ввода - UI с пузырями чата и отображением задержки STT/TTS
./gradlew :app:installDebugSDK включает готовый к использованию audio.soniqo.speech.service.SpeechRecognitionService, который подключается к API SpeechRecognizer фреймворка Android — никакого кода писать не нужно. Как только ваше приложение выбрано в качестве распознавателя голоса по умолчанию, любое стороннее приложение, вызывающее SpeechRecognizer.createSpeechRecognizer(context) (без ComponentName), получает полностью локальный STT через ваш конвейер.
1. Объявите RECORD_AUDIO и сервис в 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. Добавьте 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" />(Опционально добавьте android:settingsActivity="...", чтобы отобразить иконку шестерёнки в системном выборе голосового ввода.)
3. Установите сервис по умолчанию в системе (Настройки → Система → Языки и ввод → Выбор голосового ввода на стоковом Android, или через adb):
adb shell settings put secure voice_recognition_service \
your.package/audio.soniqo.speech.service.SpeechRecognitionService4. Проверьте, запустив экран Recognizer test в демо-приложении, который вызывает SpeechRecognizer.createSpeechRecognizer(ctx) (без компонента) и логирует каждый callback фреймворка — удобно для подтверждения binder round-trip без необходимости в logcat.
Сервис реализует onCheckRecognitionSupport (API 33+), возвращающий 27 BCP-47 языков, поддерживаемых Parakeet TDT v3, помеченных как installedOnDeviceLanguage при наличии моделей (или pendingOnDeviceLanguage во время загрузки). Аудиофокус удерживается с AUDIOFOCUS_GAIN_TRANSIENT на время сессии.
Оговорка: Gboard, Samsung Keyboard и Google Assistant поставляются с собственными распознавателями и обходят системное значение по умолчанию. Через ваш сервис проходят только те приложения, которые явно вызывают API SpeechRecognizer фреймворка (или строят на нём собственный UI).
Измерено на эмуляторе Android (arm64-v8a, без NNAPI). Реальное оборудование значительно быстрее.
| Модель | Задача | Аудио | Инференс | RTF |
|---|---|---|---|---|
| Parakeet TDT v3 | STT | 1,5 с | 175 мс | 0,12 |
| Kokoro 82M | TTS | 1,9 с вывод | 1075 мс | 0,58 |
| Silero VAD v5 | VAD | блок 32 мс | <1 мс | <0,01 |
Idle → Listening → Transcribing → Speaking → Idle
↑ |
└─── resumeListening() ───┘
Поддерживается прерывание (barge-in): речь во время воспроизведения TTS прерывает его и начинает новую транскрипцию.
┌──────────────────────────────────────────────┐
│ SpeechPipeline (Kotlin) │
│ │ │
│ ▼ │
│ jni_bridge.cpp (~250 строк) │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ speech_core_models (git submodule) │ │
│ │ SileroVad / ParakeetStt / │ │
│ │ KokoroTts / DeepFilterEnhancer │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ speech_core (оркестрация: │ │
│ │ pipeline · turn · прерывания) │ │
│ └──────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ONNX Runtime (CPU / NNAPI) │
└──────────────────────────────────────────────┘
Каждый класс модели напрямую реализует соответствующий интерфейс speech-core
(VADInterface, STTInterface, TTSInterface, EnhancerInterface) —
JNI-мост создаёт их и передаёт ссылки в VoicePipeline. Никаких шаблонных
обвязок через C-vtable.
| Чипсет | Ускорение |
|---|---|
| Snapdragon 8 Gen 1+ | NNAPI → Hexagon NPU |
| Samsung Exynos 2200+ | NNAPI → Samsung NPU |
| Google Tensor G2+ | NNAPI → Google TPU |
| Резерв CPU | XNNPACK |
Для автомобильных Qualcomm SA8295P / SA8255P с QNN (Hexagon DSP) см. speech-core/examples/linux.
| Репозиторий | Область |
|---|---|
| speech-swift | Apple (macOS, iOS) — MLX + CoreML |
| speech-core | Кроссплатформенный движок конвейера на C++ + обёртки ONNX-моделей + примеры для Linux/встраиваемых систем |
| speech-android | Android-обёртка — Kotlin SDK + JNI-мост поверх speech-core |
Apache 2.0