아키텍처 — 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 v3STT (114개 언어, 8192 BPE 어휘)INT8약 500 MB
Kokoro-82MTTSINT8약 89 MB
Silero VAD v5음성 활동 감지float32약 1.2 MB
DeepFilterNet3노이즈 제거FP16약 4.2 MB

전체 모델 다운로드 크기는 약 1.2 GB입니다. 최초 다운로드 후에는 모든 추론이 완전히 오프라인으로 실행됩니다.

추론: OnnxEngine

onnx_engine.h 래퍼는 플랫폼 인식 실행 공급자(EP) 선택을 제공합니다. 런타임에 사용 가능한 EP를 탐색하고 우아하게 폴백합니다:

플랫폼칩셋가속
AndroidSnapdragon 8 Gen 1+NNAPI → Hexagon NPU
AndroidSamsung Exynos 2200+NNAPI → Samsung NPU
AndroidGoogle Tensor G2+NNAPI → Google TPU
모든 AndroidCPU 폴백XNNPACK

자동차 Qualcomm SA8295P / SA8255P with QNN(Hexagon DSP)은 speech-core/examples/linux를 참조하세요.

주요 C++ 파일

파일용도
jni_bridge.cppspeech_core::* 모델 래퍼를 생성하고 VoicePipeline에 참조를 전달
parakeet_stt.cppTDT greedy 디코더 및 피처별 멜 정규화를 사용하는 STT
kokoro_tts.cppE2E 모델과 어텐션 마스크를 사용하는 TTS
kokoro_phonemizer.cppTTS 입력을 위한 사전 기반 phonemizer
silero_vad.cpp음성 활동 감지
deepfilter.cppSTFT/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/

소스 코드: github.com/soniqo/speech-android