架构 — Android

speech-android 是 speech-core C++ 引擎之上的一层轻薄 Kotlin SDK + JNI 桥接。所有 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 的接口(VADInterfaceSTTInterfaceTTSInterfaceEnhancerInterface),因此 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 后端(例如 speech-swift 中的 CoreML / MLX 实现)。

模型

所有模型默认使用 INT8 量化的 ONNX 格式。模型托管在 HuggingFace 上的 aufklarer 组织下,首次使用时通过 ModelManager.kt 自动下载。

模型任务量化大小
Parakeet TDT v3STT(114 种语言,8192 BPE 词表)INT8~500 MB
Kokoro-82MTTSINT8~89 MB
Silero VAD v5语音活动检测float32~1.2 MB
DeepFilterNet3降噪FP16~4.2 MB

模型总下载量约为 1.2 GB。完成首次下载后,所有推理都完全离线运行。

推理:OnnxEngine

onnx_engine.h 包装器提供平台感知的 execution provider (EP) 选择。它在运行时探测可用的 EP,并按顺序优雅回退:

平台芯片组加速
AndroidSnapdragon 8 Gen 1+NNAPI → Hexagon NPU
AndroidSamsung Exynos 2200+NNAPI → Samsung NPU
AndroidGoogle Tensor G2+NNAPI → Google TPU
任意 AndroidCPU 回退XNNPACK

关于车载 Qualcomm SA8295P / SA8255P 配合 QNN(Hexagon DSP)的部分,请参见 speech-core/examples/linux

关键 C++ 文件

文件用途
jni_bridge.cpp构造 speech_core::* 模型包装器并把引用交给 VoicePipeline
parakeet_stt.cpp带 TDT 贪心解码器和逐特征 mel 归一化的 STT
kokoro_tts.cpp带 E2E 模型与注意力 mask 的 TTS
kokoro_phonemizer.cpp用于 TTS 输入的字典型音素化器
silero_vad.cpp语音活动检测
deepfilter.cpp带 STFT/ERB 处理的降噪
onnx_engine.h平台感知的 ONNX Runtime 包装器(Android 上 NNAPI、Linux 上 QNN、CPU 回退)

在模型抽离重构中,模型包装器和 onnx_engine.h 已迁入 speech-core;完整清单见 docs/models.md

源码结构

speech-android/
  speech-core/              C++ 引擎 + ONNX 模型包装器(git 子模块)
  sdk/src/main/
    cpp/jni_bridge.cpp      speech_core::VoicePipeline 之上的轻薄 JNI 桥接
    cpp/CMakeLists.txt      通过 add_subdirectory(SPEECH_CORE_WITH_ONNX=ON) 引入 speech-core
    kotlin/.../speech/      Kotlin 公开 SDK(SpeechPipeline、ModelManager)
  sdk/src/androidTest/      端到端插桩测试
  app/                      演示应用

Linux / 汽车(C ABI、ALSA 演示、CLI 工具)位于:
  speech-core/examples/linux/

源码:github.com/soniqo/speech-android