아키텍처 — Android 및 Linux
speech-android는 플랫폼별 프론트엔드를 갖춘 공유 C++ 코어를 통해 Android 및 임베디드 Linux용 온디바이스 음성 처리를 제공합니다. 모든 추론은 하드웨어 가속 실행 공급자(execution provider)를 사용하는 ONNX Runtime을 통해 로컬에서 실행됩니다.
크로스 플랫폼 스택
Android와 Linux는 전체 음성 파이프라인을 오케스트레이션하는 speech-core C++ 서브모듈을 공유합니다. 각 플랫폼은 vtable 기반 인터페이스를 통해 speech-core에 위임하는 얇은 프론트엔드를 제공합니다:
┌────────────────────────────────────────────────┐
│ Android: SpeechPipeline (Kotlin/JNI) │
│ Linux: speech.h (C API) │
└──────────────────┬───────────────────────────┘
│
┌──────────────────┴───────────────────────────┐
│ speech-core (C++ 서브모듈) │
│ 턴 감지 · 인터럽션 · 컨텍스트 │
└──┬────────┬────────┬────────┬────────────────┘
│ │ │ │ vtables
┌──┴──┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────────┐
│ VAD │ │ STT │ │ TTS │ │ Enhancer │
└──┬──┘ └──┬──┘ └──┬──┘ └─┬────────┘
└────────┴────────┴────────┘
ONNX Runtime (CPU / NNAPI / QNN)플랫폼 경로
Android
Kotlin SDK (SpeechPipeline.kt)는 공개 API를 제공합니다. 이는 JNI를 통해 jni_bridge.cpp로 호출되며, 이 브리지가 vtable 콜백을 speech-core에 등록합니다. ONNX Runtime은 Qualcomm, Samsung, Google 칩셋에서 하드웨어 가속을 위해 NNAPI 실행 공급자와 함께 동작합니다.
Kotlin SDK → JNI 브리지 → speech-core → ONNX Runtime (NNAPI)Linux
C API (speech.h)는 임베디드 Linux 타겟(자동차, Yocto)에 대해 동일한 파이프라인을 공개합니다. Qualcomm 자동차 플랫폼(SA8295P, SA8255P)에서 ONNX Runtime은 Hexagon DSP 가속을 위해 QNN 실행 공급자를 사용합니다.
C API → speech-core → ONNX Runtime (QNN)파이프라인
음성 파이프라인은 세 단계를 순차적으로 실행합니다: VAD → STT → TTS. 음성 활동 감지가 녹음을 트리거하고, 오디오는 STT로 전사되며, TTS가 응답을 생성합니다. barge-in 지원으로 응답 도중 사용자가 말하기 시작하면 TTS 재생을 중단할 수 있습니다.
speech-core는 턴 감지, 인터럽션 처리, 대화 컨텍스트를 관리합니다. 모델 구현(VAD, STT, TTS, Enhancer)은 C vtable 인터페이스를 통해 플러그인되어, 코어 파이프라인 로직이 플랫폼에 무관하게 동작합니다.
모델
모든 모델은 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 |
| 자동차 | SA8295P / SA8255P | QNN → Hexagon DSP |
| 모두 | CPU 폴백 | XNNPACK |
주요 C++ 파일
| 파일 | 용도 |
|---|---|
jni_bridge.cpp | vtable을 통해 ONNX 모델 구현을 speech-core C API에 연결 |
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 폴백) |
linux/src/speech.cpp | Linux C API 구현 |
linux/include/speech.h | Linux 공개 C 헤더 |
소스 구조
speech-android/
speech-core/ C++ 서브모듈 (파이프라인 오케스트레이션)
sdk/src/main/
cpp/ ONNX Runtime 모델 구현, JNI 브리지, 오디오 DSP
kotlin/.../speech/ Kotlin 공개 SDK (SpeechPipeline, ModelManager)
sdk/src/androidTest/ 계측 e2e 테스트 (23 테스트, 5 스위트)
linux/
include/speech.h 공개 C 헤더
src/speech.cpp Linux C API 구현
tests/ Linux 테스트 스위트 (11 테스트)
app/ 데모 애플리케이션