Архитектура — Android
speech-android — это тонкий Kotlin SDK + JNI-мост поверх C++-движка speech-core. Весь ML-инференс и оркестрация пайплайна находятся в speech-core; speech-android занимается только Android-упаковкой. Linux / автомобильные платформы (Yocto, Qualcomm SA8295P/SA8255P с QNN) размещены прямо в speech-core/examples/linux.
Стек
Обёртки моделей (Silero VAD, Parakeet STT, Kokoro TTS, DeepFilterNet3) напрямую реализуют интерфейсы speech-core (VADInterface, STTInterface, TTSInterface, EnhancerInterface), поэтому JNI-мост конструирует их и передаёт ссылки в speech_core::VoicePipeline без бойлерплейта C-vtable адаптеров.
┌───────────────────────────────────────────────┐
│ SpeechPipeline (Kotlin public API) │
│ ↓ JNI │
│ jni_bridge.cpp (~250 lines) │
└──────────────────┬───────────────────────────┘
│
┌──────────────────┴───────────────────────────┐
│ speech_core_models (git submodule) │
│ Silero / Parakeet / Kokoro / DeepFilter │
│ speech_core │
│ Turn detection · Interruptions · Context │
└──┬────────┬────────┬────────┬────────────────┘
│ │ │ │ direct interface impl
┌──┴──┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────────┐
│ VAD │ │ STT │ │ TTS │ │ Enhancer │
└──┬──┘ └──┬──┘ └──┬──┘ └─┬────────┘
└────────┴────────┴────────┘
ONNX Runtime (CPU / NNAPI)Пайплайн
Речевой пайплайн последовательно запускает три стадии: VAD → STT → TTS. Детекция голосовой активности запускает запись, STT транскрибирует аудио, а TTS генерирует ответ. Поддержка barge-in позволяет прерывать воспроизведение TTS, когда пользователь начинает говорить посреди ответа.
speech-core управляет детекцией переключения реплик, обработкой прерываний и контекстом диалога. Обёртки моделей реализуют интерфейсы speech-core напрямую — без слоя C-vtable адаптеров — благодаря чему столь же легко подключать не-ONNX бэкенды (например, реализации CoreML / MLX в speech-swift), соответствующие тем же интерфейсам.
Модели
Все модели используют формат ONNX с INT8-квантизацией по умолчанию. Модели размещены на HuggingFace в организации aufklarer и автоматически скачиваются при первом использовании через ModelManager.kt.
| Модель | Задача | Квантизация | Размер |
|---|---|---|---|
| Parakeet TDT v3 | STT (114 языков, BPE-словарь 8192) | INT8 | ~500 МБ |
| Kokoro-82M | TTS | INT8 | ~89 МБ |
| Silero VAD v5 | Детекция голосовой активности | float32 | ~1.2 МБ |
| DeepFilterNet3 | Подавление шума | FP16 | ~4.2 МБ |
Полная загрузка моделей составляет примерно 1.2 ГБ. После первой загрузки весь инференс работает полностью офлайн.
Инференс: OnnxEngine
Обёртка onnx_engine.h обеспечивает платформо-зависимый выбор execution-провайдера (EP). Она проверяет доступные EP во время выполнения и корректно откатывается:
| Платформа | Чипсет | Ускорение |
|---|---|---|
| Android | Snapdragon 8 Gen 1+ | NNAPI → Hexagon NPU |
| Android | Samsung Exynos 2200+ | NNAPI → Samsung NPU |
| Android | Google Tensor G2+ | NNAPI → Google TPU |
| Любой Android | CPU fallback | XNNPACK |
Для автомобильных Qualcomm SA8295P / SA8255P с QNN (Hexagon DSP) см. speech-core/examples/linux.
Ключевые C++-файлы
| Файл | Назначение |
|---|---|
jni_bridge.cpp | Конструирует обёртки speech_core::* и передаёт ссылки в VoicePipeline |
parakeet_stt.cpp | STT с жадным TDT-декодером и нормализацией мел-признаков |
kokoro_tts.cpp | TTS с end-to-end моделью и attention-маской |
kokoro_phonemizer.cpp | Фонемизатор на основе словаря для входа TTS |
silero_vad.cpp | Детекция голосовой активности |
deepfilter.cpp | Подавление шума с обработкой STFT/ERB |
onnx_engine.h | Платформо-зависимая обёртка ONNX Runtime (NNAPI на Android, QNN на Linux, CPU fallback) |
Обёртки моделей и onnx_engine.h переехали в speech-core в рамках рефакторинга по выделению моделей; полный перечень см. в docs/models.md.
Структура исходников
speech-android/
speech-core/ C++-движок + ONNX-обёртки моделей (git submodule)
sdk/src/main/
cpp/jni_bridge.cpp Тонкий JNI-мост поверх speech_core::VoicePipeline
cpp/CMakeLists.txt Подтягивает speech-core через add_subdirectory(SPEECH_CORE_WITH_ONNX=ON)
kotlin/.../speech/ Kotlin публичный SDK (SpeechPipeline, ModelManager)
sdk/src/androidTest/ Инструментальные e2e-тесты
app/ Демо-приложение
Linux / автомобильные платформы (C ABI, ALSA-демо, CLI-инструменты) находятся здесь:
speech-core/examples/linux/Исходный код: github.com/soniqo/speech-android