시작하기 — Android

speech-android는 ONNX Runtime을 사용해 Android를 위한 온디바이스 음성 처리를 제공합니다. 파이프라인은 barge-in 지원과 함께 VAD + STT + TTS를 실행하며, 모델 다운로드 후에는 완전히 오프라인으로 동작합니다.

요구사항

사전 빌드된 데모 앱을 다운로드해 바로 사용해 보세요:

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

다음 단계