아키텍처 — Android
speech-android는 speech-core C++ 엔진 위의 얇은 Kotlin SDK + JNI 브리지입니다. 모든 ML 추론과 파이프라인 오케스트레이션은 speech-core에 있고, speech-android는 Android 패키징만 담당합니다. Linux / 자동차(Yocto, Qualcomm SA8295P/SA8255P with 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 공개 API) │
│ ↓ JNI │
│ jni_bridge.cpp (~250 lines) │
└──────────────────┬───────────────────────────┘
│
┌──────────────────┴───────────────────────────┐
│ speech_core_models (git 서브모듈) │
│ Silero / Parakeet / Kokoro / DeepFilter │
│ speech_core │
│ 턴 감지 · 인터럽션 · 컨텍스트 │
└──┬────────┬────────┬────────┬────────────────┘
│ │ │ │ 직접 인터페이스 구현
┌──┴──┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────────┐
│ 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 래퍼는 플랫폼 인식 실행 공급자(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 with QNN(Hexagon DSP)은 speech-core/examples/linux를 참조하세요.
주요 C++ 파일
| 파일 | 용도 |
|---|---|
jni_bridge.cpp | speech_core::* 모델 래퍼를 생성하고 VoicePipeline에 참조를 전달 |
parakeet_stt.cpp | TDT greedy 디코더 및 피처별 멜 정규화를 사용하는 STT |
kokoro_tts.cpp | E2E 모델과 어텐션 마스크를 사용하는 TTS |
kokoro_phonemizer.cpp | TTS 입력을 위한 사전 기반 phonemizer |
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/ 계측 e2e 테스트
app/ 데모 애플리케이션
Linux / 자동차 (C ABI, ALSA 데모, CLI 도구)는 다음 위치에 있습니다:
speech-core/examples/linux/