架构 — 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 的接口(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 后端(例如 speech-swift 中的 CoreML / MLX 实现)。
模型
所有模型默认使用 INT8 量化的 ONNX 格式。模型托管在 HuggingFace 上的 aufklarer 组织下,首次使用时通过 ModelManager.kt 自动下载。
| 模型 | 任务 | 量化 | 大小 |
|---|---|---|---|
| Parakeet TDT v3 | STT(114 种语言,8192 BPE 词表) | INT8 | ~500 MB |
| Kokoro-82M | TTS | INT8 | ~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,并按顺序优雅回退:
| 平台 | 芯片组 | 加速 |
|---|---|---|
| Android | Snapdragon 8 Gen 1+ | NNAPI → Hexagon NPU |
| Android | Samsung Exynos 2200+ | NNAPI → Samsung NPU |
| Android | Google Tensor G2+ | NNAPI → Google TPU |
| 任意 Android | CPU 回退 | 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/