시작하기 — Android
speech-android는 ONNX Runtime을 사용해 Android를 위한 온디바이스 음성 처리를 제공합니다. 파이프라인은 barge-in 지원과 함께 VAD + STT + TTS를 실행하며, 모델 다운로드 후에는 완전히 오프라인으로 동작합니다.
요구사항
- Android 8+ (API 26)
- arm64-v8a 아키텍처
사전 빌드된 데모 앱을 다운로드해 바로 사용해 보세요:
Gradle 의존성
build.gradle.kts에 SDK를 추가하세요:
implementation("audio.soniqo:speech:0.0.9")
빠른 시작
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 모노 float32
모델은 첫 사용 시 HuggingFace에서 자동 다운로드됩니다 (총 약 1.2 GB). 최초 다운로드 후에는 모든 추론이 완전히 오프라인으로 실행됩니다.
시스템 음성 입력 (RecognitionService)
SDK는 Android 프레임워크 SpeechRecognizer API에 연결되는 바로 사용 가능한 SpeechRecognitionService를 제공합니다 — 작성할 코드가 없습니다. 앱이 기본 음성 인식기로 선택되면, 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를 구축하는 앱만이 서비스를 통과합니다.
모델
모든 모델은 NNAPI 가속을 사용하는 ONNX Runtime으로 실행됩니다. 기본적으로 INT8 양자화됩니다.
| 모델 | 작업 | 크기 |
|---|---|---|
| Parakeet TDT v3 (INT8) | 음성-텍스트 변환 (114개 언어) | 490 MB |
| Kokoro-82M (INT8) | 텍스트-음성 변환 (7개 언어) | 89 MB |
| Silero VAD v5 | 음성 활동 감지 | 1.2 MB |
| DeepFilterNet3 (FP16) | 노이즈 제거 | 4.2 MB |
소스 코드: github.com/soniqo/speech-android
다음 단계
- 벤치마크 — Android 추론 성능
- Linux C API — 임베디드 Linux 설정