快速开始 — Android
speech-android 使用 ONNX Runtime 为 Android 提供端侧语音处理能力。流水线运行 VAD + STT + TTS 并支持 barge-in,在完成模型下载后完全离线运行。
环境要求
- Android 8+ (API 26)
- arm64-v8a 架构
下载预构建的 demo app 立即试用:
Gradle 依赖
将 SDK 添加到 build.gradle.kts:
implementation("audio.soniqo:speech:0.0.20")
快速开始
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
默认模型在首次使用时从 HuggingFace 自动下载(总计约 500 MB)。完成首次下载后,所有推理都完全离线运行。
轮次结束检测
启用 Smart Turn v3.2 后,VAD 检测到的停顿会成为一次判断,而不是立即结束轮次。它在每次确认停顿后运行一次,分析当前轮次的最后八秒;分数低于阈值时会保持同一轮次,而最大静音时长可确保轮次最终结束。
val modelDir = ModelManager.ensureModels(context, enableSmartTurn = true)
val pipeline = SpeechPipeline(
SpeechConfig(
modelDir = modelDir,
enableSmartTurn = true,
turnCompletionThreshold = 0.5f,
turnCompletionMaxSilenceSec = 2.0f,
)
)
此功能需额外下载一个固定版本的 11.1 MB int8 模型;推理仍完全离线。Smart Turn 由 Pipecat/Daily 创建,并以 BSD-2-Clause 许可证发布。
系统语音输入 (RecognitionService)
SDK 自带可直接使用的 SpeechRecognitionService,接入 Android 框架的 SpeechRecognizer API — 无需编写代码。一旦你的应用被设为默认语音识别器,任何调用 SpeechRecognizer.createSpeechRecognizer(context)(不指定 ComponentName)的第三方应用都能通过你的流水线获得完全本地的 STT。
1. 在 AndroidManifest.xml 中声明 RECORD_AUDIO 和服务:
<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" />
3. 将服务设为系统默认(原生 Android 上 设置 → 系统 → 语言和输入 → 语音输入选择器,或通过 adb):
adb shell settings put secure voice_recognition_service \
your.package/audio.soniqo.speech.service.SpeechRecognitionService
4. 通过运行演示应用的 Recognizer test 界面来验证,它调用 SpeechRecognizer.createSpeechRecognizer(ctx)(不带组件)并记录每个框架回调 — 无需 logcat 即可确认 binder 往返。
服务实现了 onCheckRecognitionSupport(API 33+),返回 Parakeet TDT v3 涵盖的 27 个 BCP-47 语言,在模型存在时标记为 installedOnDeviceLanguage(下载中时为 pendingOnDeviceLanguage)。会话期间使用 AUDIOFOCUS_GAIN_TRANSIENT 获取音频焦点。
Gboard、三星键盘和 Google Assistant 都自带识别器,会跳过系统默认。显式调用框架 SpeechRecognizer API(或在其上构建自己 UI)的应用才会经过你的服务。
模型
所有模型通过 ONNX Runtime 运行,并启用 NNAPI 加速。默认使用 INT8 量化。
| 模型 | 任务 | 大小 |
|---|---|---|
| Parakeet TDT v3 (INT8) | 语音转文字(114 种语言) | 891 MB |
| Kokoro-82M (INT8) | 文本转语音(8 种语言) | 330 MB |
| Silero VAD v5 | 语音活动检测 | 2 MB |
| DeepFilterNet3 | 降噪 | 8 MB |
源码:github.com/soniqo/speech-android
下一步
- Benchmarks — Android 推理性能
- Linux C API — 嵌入式 Linux 配置