아키텍처 — 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 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
자동차SA8295P / SA8255PQNN → Hexagon DSP
모두CPU 폴백XNNPACK

주요 C++ 파일

파일용도
jni_bridge.cppvtable을 통해 ONNX 모델 구현을 speech-core C API에 연결
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 폴백)
linux/src/speech.cppLinux C API 구현
linux/include/speech.hLinux 공개 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/                      데모 애플리케이션

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